turelon 发表于 2022-8-5 10:12:11

讨论下单片机外设读写的临界区和锁的使用

现有一个外设使用SPI与单片机通信,外设同时还有一个外部中断管脚与单片机相连,此管脚指示外设的中断发生,读外设的中断寄存器可以知道当前中断位。
SPI读操作一般分为下面几步:
1.打开片选
2.设置读指令
3.设置读地址
4.获取数据
5.关闭片选
那么主线程的SPI读操作在任何一步都可能被中断打断,而中断中也有SPI读操作,因此将读写操作代码段加入临界区十分必要。

然后另一种情况:一般外设的某个操作可能需要多个SPI读写操作,比如连续写操作一般如下:
1.写地址
2.写数据1
...
n.写数据n-1
那么在RTOS中如果多个线程都要写数据,则可能线程1写到一半切到线程2写操作,会发生冲突。
有两种方案解决:
1.将外设操作加锁,这样线程1操作外设时,线程2必须等待
2.将外设操作放到一个线程,其他线程操作通过队列或事件的方式

现在好多厂商驱动并没有加锁或临界区之类接口,好像用着也没问题,啥情况?

akey3000 发表于 2022-8-5 10:38:58

是否加锁,看应用。不加锁,有些bug很隐蔽

zchong 发表于 2022-8-5 16:22:52

厂商的驱动只是基本的,其它的互斥操作一般需要自己完成

Trylin 发表于 2022-8-5 16:35:41

分情况:
1. 任务之间使用同一个SPI接口,加互斥吧
2. 任务和中断使用同一个SPI接口,关中断吧
页: [1]
查看完整版本: 讨论下单片机外设读写的临界区和锁的使用