硬汉嵌入式论坛

 找回密码
 立即注册
查看: 769|回复: 1
收起左侧

[HAL] 关于HAL库的API在中断和中断外都调用的问题,它的__HAL_LOCK和__HAL_UNLOCK应该无法处理这种情况

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2022-1-4 15:43:13 | 显示全部楼层 |阅读模式

LOCK和UNLOCK的实现如下,对变量的操作不是原子操作,所以中断外操作这个的时候(赋值操作不是原子的),如果有中断抢占了且也操作到这个变量,就略坑。
  1. #if (USE_RTOS == 1)
  2.   #error " USE_RTOS should be 0 in the current HAL release "
  3. #else
  4.   #define __HAL_LOCK(__HANDLE__)                                           \
  5.                                 do{                                        \
  6.                                     if((__HANDLE__)->Lock == HAL_LOCKED)   \
  7.                                     {                                      \
  8.                                        return HAL_BUSY;                    \
  9.                                     }                                      \
  10.                                     else                                   \
  11.                                     {                                      \
  12.                                        (__HANDLE__)->Lock = HAL_LOCKED;    \
  13.                                     }                                      \
  14.                                   }while (0)

  15.   #define __HAL_UNLOCK(__HANDLE__)                                          \
  16.                                   do{                                       \
  17.                                       (__HANDLE__)->Lock = HAL_UNLOCKED;    \
  18.                                     }while (0)
  19. #endif /* USE_RTOS */
复制代码


而HAL库对这两个函数的调用不好捋顺:

HAL库里面的锁函数__HAL_LOCK和__HAL_UNLOCK真是神奇的存在,知道在哪里开始的,却不知道在哪里就结束了
https://www.armbbs.cn/forum.php?mod=viewthread&tid=88807


所以推荐中断服务程序里面仅调用HAL_XXXX_IRQHandler,其它略复杂的API最好不要在中断里面调用。

回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2022-1-5 12:27:28 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 19:27 , Processed in 0.256781 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表