讨论下单片机外设读写的临界区和锁的使用
现有一个外设使用SPI与单片机通信,外设同时还有一个外部中断管脚与单片机相连,此管脚指示外设的中断发生,读外设的中断寄存器可以知道当前中断位。SPI读操作一般分为下面几步:
1.打开片选
2.设置读指令
3.设置读地址
4.获取数据
5.关闭片选
那么主线程的SPI读操作在任何一步都可能被中断打断,而中断中也有SPI读操作,因此将读写操作代码段加入临界区十分必要。
然后另一种情况:一般外设的某个操作可能需要多个SPI读写操作,比如连续写操作一般如下:
1.写地址
2.写数据1
...
n.写数据n-1
那么在RTOS中如果多个线程都要写数据,则可能线程1写到一半切到线程2写操作,会发生冲突。
有两种方案解决:
1.将外设操作加锁,这样线程1操作外设时,线程2必须等待
2.将外设操作放到一个线程,其他线程操作通过队列或事件的方式
现在好多厂商驱动并没有加锁或临界区之类接口,好像用着也没问题,啥情况? 是否加锁,看应用。不加锁,有些bug很隐蔽 厂商的驱动只是基本的,其它的互斥操作一般需要自己完成 分情况:
1. 任务之间使用同一个SPI接口,加互斥吧
2. 任务和中断使用同一个SPI接口,关中断吧
页:
[1]