• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

HAL库加锁问题

Spirit 2018-11-07 浏览量:780

HAL库对外设加锁代码如下:

#define __HAL_LOCK(__HANDLE__)                                           \
                                do{                                        \
                                    if((__HANDLE__)->Lock == HAL_LOCKED)   \
                                    {                                      \
                                       return HAL_BUSY;                    \
                                    }                                      \
                                    else                                   \
                                    {                                      \
                                       (__HANDLE__)->Lock = HAL_LOCKED;    \
                                    }                                      \
                                  }while (0U)

从if到赋值,至少是三条指令。假如在if判断后,出现中断,在这个中断里也会请求使用外设。低级别的请求加锁就失去意义了。

感觉这里不太靠谱。

----------------------------------

我是指用HAL库裸编的情况,用操作系统的加锁就不用提了。

1 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 注意:ST已经对这行代码进行了优化了,也就是do……while(0u)这里,而且这个是宏定义。最终编译结果应该是三句:

    if判断

    写寄存器(加锁)

    返回值

    但执行就在第二句完成了。如果一定深究判断时候产生中断就太追求极限值了。如果保证极限情况任何库函数也不行,只能直接写寄存器。

    因为任何函数(非宏定义)都有入栈时间,绝对比写寄存器慢多了。

    • 发布于 2018-11-08
    • 举报
    • 评论 0
    • 1
    • 0

其他答案 数量:6
  • 其实这个代码实质就是

    if(xxx == 1)

    else

        xxx = 1;

    可以了,还能怎么样呢

    • 发布于2018-11-07
    • 举报
    • 评论 0
    • 1
    • 0

  • 加锁和语句中的中断针对性不同,不知道您先实现什么?
    • 发布于2018-11-08
    • 举报
    • 评论 0
    • 1
    • 0

  • 外设的操作不允许同时多个命令操作你的外设寄存器,这样可以做到保护
    • 发布于2018-11-29
    • 举报
    • 评论 0
    • 0
    • 0

  • 这个保护是把你的外设操作只能运行一个时间用一个指令操作
    • 发布于2018-12-13
    • 举报
    • 评论 0
    • 0
    • 0

  • 实际来说对你的宏参数是根据不同的外设来处理
    • 发布于2018-12-17
    • 举报
    • 评论 0
    • 0
    • 0

  • 这里的意思就是不允许在多个地方操作同一个外设,相当于一个不可重入的特性
    • 发布于2018-11-23
    • 举报
    • 评论 0
    • -1
    • 0

相关问题

问题达人换一批

HAL库加锁问题