[STM32F1] 什么是__HAL_Lock()

[复制链接]
1712|39
 楼主| zwll 发表于 2022-4-17 20:53 | 显示全部楼层 |阅读模式
什么是__HAL_Lock()
juventus9554 发表于 2022-4-17 20:56 | 显示全部楼层
什么意思?不是很明白你说的什么,能再解释一下这个现象吗
 楼主| zwll 发表于 2022-4-17 21:03 | 显示全部楼层
在STM32提供的F4 CUBE库,stm32f4XX_hal_def.h中提供了如下代码:

#if (USE_RTOS == 1)
  /* Reserved for future use */
  #error “USE_RTOS should be 0 in the current HAL release”
#else
  #define __HAL_LOCK(__HANDLE__)                                           \
                                do{                                        \
                                    if((__HANDLE__)->Lock == HAL_LOCKED)   \
                                    {                                      \
                                       return HAL_BUSY;                    \
                                    }                                      \
                                    else                                   \
                                    {                                      \
                                       (__HANDLE__)->Lock = HAL_LOCKED;    \
                                    }                                      \
                                  }while (0)

  #define __HAL_UNLOCK(__HANDLE__)                                          \
                                  do{                                       \
                                      (__HANDLE__)->Lock = HAL_UNLOCKED;    \
                                    }while (0)
#endif /* USE_RTOS */


这个__HAL_LOCK 与__HAL_UNLOCK 宏在UART以DMA方式传输的时候被用到了,在库中很多的底层模块驱动代码都是用到了这个,

这个库没看多久,项目紧实在不清楚这个是干啥的,求解释。
 楼主| zwll 发表于 2022-4-17 21:06 | 显示全部楼层
我们做的项目上了FreeRTOS,由于要管理超过6个串口,这里部分串口打算采用UART DMA方式,从上面的代码看出当#define USE_RTOS 1之后,就会由于上述代码而报Error “USE_RTOS should be 0 in the current HAL release”,

我觉得这可能考虑到了RTOS中的任务调度对DMA产生了影响造成的吧,这具体是为什么。
pengf 发表于 2022-4-17 21:10 | 显示全部楼层
然后呢?你是怎么应对这个的呢        
 楼主| zwll 发表于 2022-4-17 21:13 | 显示全部楼层
我该如何在RTOS中使用UART的DMA传输?
heweibig 发表于 2022-4-17 21:15 | 显示全部楼层
看了下lock 就是个hal 的标志而已啊
wyjie 发表于 2022-4-17 21:17 | 显示全部楼层
DMA的应该,应该是配置完就可以,基本与CPU意见OS没有太大关系
llljh 发表于 2022-4-17 21:19 | 显示全部楼层
感觉是该设备被一个任务占用后,设置标志,然后其他任务调用的话就会返回HAL_BUSY。
renyaq 发表于 2022-4-17 21:22 | 显示全部楼层
USE_RTOS这个宏现在应该是没什么用的,和FreeRTOS应该也没什么耦合,你可以搜代码确认下。
jiajs 发表于 2022-4-17 21:25 | 显示全部楼层
HAL_LOCK这个宏应该是用来防止资源竞争,但是这个实现应该是不完善的。
yszong 发表于 2022-4-17 21:27 | 显示全部楼层
如果是有明显的资源竞争,建议用mutex自己做
 楼主| zwll 发表于 2022-4-17 21:29 | 显示全部楼层
好的,我明天去单位试一下,多谢各位大侠了哈
SantaBunny 发表于 2023-3-3 12:50 | 显示全部楼层
通过代码可以看出__HAL_LOCK的作用是判断作的__HANDLE__是否已经加锁,如果已经加锁那么返回忙,并立即推出函数,如果未加锁,那么执行加锁。__HAL_UNLOCK则是解锁
bartonalfred 发表于 2023-5-13 12:54 | 显示全部楼层
资源已经被锁               
albertaabbot 发表于 2023-5-13 13:13 | 显示全部楼层
似于进程线程操作中的互斥锁。               
guijial511 发表于 2023-5-13 16:03 来自手机 | 显示全部楼层
这个是上锁函数
Stahan 发表于 2023-5-13 23:17 | 显示全部楼层
这是一个判断是否加锁的函数吧
MessageRing 发表于 2023-5-14 22:51 | 显示全部楼层
防止资源竞争的吧
jtracy3 发表于 2023-5-18 10:43 | 显示全部楼层
该函数通过关闭全局中断开关(Interrupts)来禁止对共享资源的访问,从而实现对共享资源的互斥保护。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

885

主题

11314

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部