硬汉嵌入式论坛

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

[HAL] 当前H7的HAL库是不支持多任务调用的,也就是不支持重入,虽然做了忙检测,但仅可用于裸机

  [复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2018-4-8 01:30:49 | 显示全部楼层 |阅读模式
使用HAL库的API函数,最好不要同一个函数多个任务里面搞。
  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 */
复制代码


回复

使用道具 举报

57

主题

908

回帖

1079

积分

至尊会员

积分
1079
发表于 2018-4-8 12:04:43 | 显示全部楼层
stm32的软件又要加班了。。。。说不准要跳槽了。
回复

使用道具 举报

7

主题

102

回帖

123

积分

初级会员

积分
123
发表于 2018-4-13 18:19:04 | 显示全部楼层
本来就是这样吧,ST的HAL全部是一个尿性,F4也是这样的。早就对ST无语了,既然要搞这种高级库,OS支持是必须的。要不自己弄一套OS接口,然后给客户适配。要不直接用CMSIS-RTOS接口就是了。都搞那么多年都没搞上去。
回复

使用道具 举报

24

主题

83

回帖

155

积分

初级会员

积分
155
发表于 2020-12-30 22:19:29 | 显示全部楼层
STM32f4标准库支持重入吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2020-12-31 09:58:30 | 显示全部楼层
手牵手看夕阳 发表于 2020-12-30 22:19
STM32f4标准库支持重入吗?

一些函数是支持的,一些是不支持的。
回复

使用道具 举报

24

主题

83

回帖

155

积分

初级会员

积分
155
发表于 2020-12-31 10:36:47 | 显示全部楼层
eric2013 发表于 2020-12-31 09:58
一些函数是支持的,一些是不支持的。

支不支持重入,是看函数中又没用到全局变量吗?
回复

使用道具 举报

8

主题

25

回帖

49

积分

初级会员

积分
49
发表于 2020-12-31 18:29:22 | 显示全部楼层
已经全系列使用LL库,虽然不全,但是比HAL库坑少点,当然有些还是要自己动手编写的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2021-1-1 10:37:00 | 显示全部楼层
rog 发表于 2020-12-31 18:29
已经全系列使用LL库,虽然不全,但是比HAL库坑少点,当然有些还是要自己动手编写的

HAL库里面好些外设也是调用的LL库,像USB,SDMMC等
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2021-1-1 10:38:15 | 显示全部楼层
手牵手看夕阳 发表于 2020-12-31 10:36
支不支持重入,是看函数中又没用到全局变量吗?

用了全局变量,你做好互斥也可以重入的。

还有就是函数的形参,也要注意。
回复

使用道具 举报

12

主题

152

回帖

188

积分

初级会员

积分
188
发表于 2021-2-9 08:32:29 | 显示全部楼层
eric2013 发表于 2021-1-1 10:38
用了全局变量,你做好互斥也可以重入的。

还有就是函数的形参,也要注意。

函数的形参对可重入有什么影响
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2021-2-9 08:51:39 | 显示全部楼层
gnail092 发表于 2021-2-9 08:32
函数的形参对可重入有什么影响

可重入性,主要就是形参和全局变量在影响。
回复

使用道具 举报

12

主题

152

回帖

188

积分

初级会员

积分
188
发表于 2021-2-9 09:07:49 | 显示全部楼层
eric2013 发表于 2021-2-9 08:51
可重入性,主要就是形参和全局变量在影响。

除非这个形参是个指针,指向的是一个全局变量,不然应该不会影响吧
回复

使用道具 举报

39

主题

1504

回帖

1626

积分

至尊会员

积分
1626
发表于 2024-6-28 16:11:32 | 显示全部楼层
请教一下,HAL库HAL_DMA_IRQHandler类似这种函数,如果存在多个DMA工作的时候,那么在DMA中断函数中就有可能存在函数重入问题,那么这种情况会不会引发什么问题呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-6-29 08:20:17 | 显示全部楼层
sanit 发表于 2024-6-28 16:11
请教一下,HAL库HAL_DMA_IRQHandler类似这种函数,如果存在多个DMA工作的时候,那么在DMA中断函数中就有可 ...

中断的这个API做处理了,支持重入,支持不同的DMA数据流调用。
回复

使用道具 举报

26

主题

42

回帖

120

积分

初级会员

积分
120
发表于 2024-7-1 11:32:11 | 显示全部楼层
eric2013 发表于 2024-6-29 08:20
中断的这个API做处理了,支持重入,支持不同的DMA数据流调用。

请教下硬汉哥,这种GPIO的操作API函数,比如写pin函数HAL_GPIO_WritePin以及读pin函数,HAL_GPIO_ReadPin, 在我的freeRTOS工程的多个任务中可能都会用到,这种函数是可重入函数吗?

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
 楼主| 发表于 2024-7-2 09:01:56 | 显示全部楼层
coolaimcu 发表于 2024-7-1 11:32
请教下硬汉哥,这种GPIO的操作API函数,比如写pin函数HAL_GPIO_WritePin以及读pin函数,HAL_GPIO_ReadPin ...

操作同一个引脚不支持重入。对于同一个引脚的写操作推荐使用BSRR寄存器。读操作基本没有影响,随意读取,因为寄存器的读都加了__IO前缀,防止编译器优化。
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2024-7-7 10:45:50 来自手机 | 显示全部楼层
coolaimcu 发表于 2024-7-1 11:32
请教下硬汉哥,这种GPIO的操作API函数,比如写pin函数HAL_GPIO_WritePin以及读pin函数,HAL_GPIO_ReadPin ...

使用HAL库加rtos最好自己再加一层,不要在rtos里直接用,两个中间再加一层开销也不大。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 06:10 , Processed in 0.435939 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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