你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32l4xx_hal_uart.c文件中的_HAL_LOCK(huart)函数怎么理解?什么.....

[复制链接]
冯兆亮 提问时间:2017-6-19 17:56 /
在STM32L4xx的HAL库里面的stm32l4xx_hal_uart.c文件中HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)函数里有__HAL_LOCK(huart);和__HAL_UNLOCK(huart);配合使用的,具体是什么作用?为什么要在这个函数里面添加这样的代码?
收藏 评论12 发布时间:2017-6-19 17:56

举报

12个回答
moyanming2013 最优答案 回答时间:2017-6-22 16:35:43
看到有些貌似“正确”的回复(还有附和声)我不免想纠正下!请下结论前一定要看足够的资料来支撑自己的结论。
__HAL_LOCK()以及__HAL_UNLOCK()是用于非操作系统(或可以理解为单线程内)的对公共资源访问的一种保护。
多线程中上述LOCK函数没作用(用了也会有潜在风险),需要使用RTOS的比如:事件、信号量、临界区、互斥量等等来实现对公共资源的保护。LOCK等函数和RTOS中的概念是完全不同的,更不是相等的!
看HAL里面的代码也应该有所思吧:
QQ截图20170622162726.jpg
Dandjinh 回答时间:2017-6-19 20:56:49
这设计到多任务中函数重入和资源争夺的问题
__HAL_LOCK();其实就是OS中的互斥变量mutex,用来保证资源的使用唯一性

评分

参与人数 1ST金币 +5 收起 理由
MrJiu + 5 赞一个!

查看全部评分

mark0668 回答时间:2017-6-19 22:31:33
楼上正解
冯兆亮 回答时间:2017-6-22 14:53:16
Dandjinh 发表于 2017-6-19 20:56
这设计到多任务中函数重入和资源争夺的问题
__HAL_LOCK();其实就是OS中的互斥变量mutex,用来保证资源的使 ...

看到串口库函数中,有好多的函数里面都要对串口所抽象出来的变量进行操作的时候,都会在之前和之后加这样互斥的操作,为什么要这样做?
冯兆亮 回答时间:2017-6-22 14:53:56
Dandjinh 发表于 2017-6-19 20:56
这设计到多任务中函数重入和资源争夺的问题
__HAL_LOCK();其实就是OS中的互斥变量mutex,用来保证资源的使 ...

非常感谢你的回答!
冯兆亮 回答时间:2017-6-22 14:54:45

是的,感谢来过~
冯兆亮 回答时间:2017-6-26 09:30:09
moyanming2013 发表于 2017-6-22 16:35
看到有些貌似“正确”的回复(还有附和声)我不免想纠正下!请下结论前一定要看足够的资料来支撑自己的结论 ...

非常感谢你的回答,目前我是加了μC/OS的,所以采用了将USE_RTOS=1,然后将__HAL_CLOK和__HAL_UNCLOCK宏定义为空了。
moyanming2013 回答时间:2017-6-26 11:34:49
liangliangwa 发表于 2017-6-26 09:30
非常感谢你的回答,目前我是加了μC/OS的,所以采用了将USE_RTOS=1,然后将__HAL_CLOK和__HAL_UNCLOCK宏 ...

恩,还好你没有受到“误导”。
多看、多思考,对别人的回复总是抱怀疑态度。
电小龙 回答时间:2017-11-27 10:42:26
liangliangwa 发表于 2017-6-26 09:30
非常感谢你的回答,目前我是加了μC/OS的,所以采用了将USE_RTOS=1,然后将__HAL_CLOK和__HAL_UNCLOCK宏 ...

为什么我按照你的方法改过之后编译提示出错,错误为error directive :"USE_RTOS should be 0 in the current HAL release",我用的是FREERTOS
冯兆亮 回答时间:2017-11-27 19:44:21
电小龙 发表于 2017-11-27 10:42
为什么我按照你的方法改过之后编译提示出错,错误为error directive :"USE_RTOS should be 0 in the curre ...

因为这个宏USE_RTOS控制这执行打印这句错误提示。
电小龙 回答时间:2017-11-27 20:15:55
liangliangwa 发表于 2017-11-27 19:44
因为这个宏USE_RTOS控制这执行打印这句错误提示。

楼主你说你是加了μC/OS,然后将USE_RTOS=1,然后将__HAL_CLOK和__HAL_UNCLOCK宏定义为空了。我用的是freertos,然后我也将USE_RTOS=1了,也屏蔽掉了_HAL_LOCKh和_HAL_UNLOCK,为啥编译不通过
冯兆亮 回答时间:2017-11-28 11:28:17
电小龙 发表于 2017-11-27 20:15
楼主你说你是加了μC/OS,然后将USE_RTOS=1,然后将__HAL_CLOK和__HAL_UNCLOCK宏定义为空了。我用的是fre ...

FreeRTOS的我就不知道了,你要是出现错误提示打印的话,就看看是不是宏控制了那句话。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版