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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版