HAL库对外设加锁代码如下:
#define __HAL_LOCK(__HANDLE__) \ do{ \ if((__HANDLE__)->Lock == HAL_LOCKED) \ { \ return HAL_BUSY; \ } \ else \ { \ (__HANDLE__)->Lock = HAL_LOCKED; \ } \ }while (0U)
从if到赋值,至少是三条指令。假如在if判断后,出现中断,在这个中断里也会请求使用外设。低级别的请求加锁就失去意义了。
感觉这里不太靠谱。
----------------------------------
我是指用HAL库裸编的情况,用操作系统的加锁就不用提了。
注意:ST已经对这行代码进行了优化了,也就是do……while(0u)这里,而且这个是宏定义。最终编译结果应该是三句:
if判断
写寄存器(加锁)
返回值
但执行就在第二句完成了。如果一定深究判断时候产生中断就太追求极限值了。如果保证极限情况任何库函数也不行,只能直接写寄存器。
因为任何函数(非宏定义)都有入栈时间,绝对比写寄存器慢多了。
其实这个代码实质就是
if(xxx == 1)
else
xxx = 1;
可以了,还能怎么样呢