你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
查看完整内容
举报
查看全部评分
zoomdy 发表于 2017-1-20 15:48 以STM32F4系列为例 __HAL_LOCK和__HAL_UNLOCK定义在Drivers/STM32F4xx_HAL_driver/Inc/stm32f4xx_hal_def.h ...
__HAL_LOCK和__HAL_UNLOCK定义在Drivers/STM32F4xx_HAL_driver/Inc/stm32f4xx_hal_def.h头文件中(假设是Cube生成的工程)。
通过代码可以看出__HAL_LOCK的作用是判断被操作的__HANDLE__是否已经加锁,如果已经加锁那么返回忙,并立即推出函数,如果未加锁,那么执行加锁。__HAL_UNLOCK则是解锁。
举个DMA操作的例子,调用HAL_DMA_Start启动一次DMA传输,在本次传输结束前不允许开始第二次DMA传输,因此HAL_DMA_Start操作执行了__HAL_LOCK进行加锁,在解锁前调用HAL_DMA_Start会返回HAL_BUSY而不会执行DMA操作。接下来调用HAL_DMA_PollForTransfer来轮询DMA是否操作完成,一旦HAL_DMA_PollForTransfer函数检测到DMA操作完成或发生错误,那么会调用__HAL_UNLOCK解锁,解锁之后才能进行下一次DMA请求。
调用HAL_DMA_Start会在函数的开头调用__HAL_LOCK,假如DMA已经被开启了,那么这条语句将立即返回HAL_BUSY,否则标记DMA为加锁状态,并继续下面的代码。
HAL_DMA_PollForTransfer会根据当前的DMA状态在适当的时机调用__HAL_UNLOCK解锁。
评分
查看全部评分
评分
查看全部评分
__HAL_UNLOCK(huart->hdmarx);
之前一直不明白为什么这里有个UNLOCK,而没有找到对应的LOCK。今天修改这部分时,没有加这句,结果接收数组一直是第一次接收的数据。现在想想,应该是后来DMA就没有再使能。
但我没找到根据Lock位做判断的地方。
评分
查看全部评分
能否指明下,__HAL_LOCK()这个函数,在已被锁的情况下被调用后,返回量return HAL_BUSY,这个值,在什么地方被用到?
额,明白了,,__HAL_LOCK()是个宏,如果执行return HAL_BUSY;则直接退出上级函数了。感谢指教。