硬汉嵌入式论坛

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

[技术分享] 非常讨厌HAL库中每个设备一个全局变量,而且这些变量又不显性清零

  [复制链接]

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2019-10-1 02:36:13 | 显示全部楼层 |阅读模式
非常讨厌HAL库中每个设备一个全局变量,而且这些变量又不显性清零。
有些特殊应用,不需要C库初始化全局变量,比如工程选型中勾选了Noinit,那么悲剧就来了。HAL库函数会随机地执行失败,依赖于内存初始状态。
noinit.png
比如flash模块
stm32h7xx_hal_flash.c

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
FLASH_ProcessTypeDef pFlash;    <------ 这是全局变量

所有的flahs操作函数,均先执行 __HAL_LOCK
  /* Process Locked */
  __HAL_LOCK(&pFlash);



展开 __HAL_LOCK看看:发现可能会直接return HAL_BUSY,导致函数执行失败。


  #define __HAL_LOCK(__HANDLE__)                                           \
                                do{                                        \
                                    if((__HANDLE__)->Lock == HAL_LOCKED)   \
                                    {                                      \
                                       return HAL_BUSY;                    \
                                    }                                      \
                                    else                                   \
                                    {                                      \
                                       (__HANDLE__)->Lock = HAL_LOCKED;    \
                                    }                                      \
                                  }while (0)


解决办法:
1、修改库文件,FLASH_ProcessTypeDef pFlash = {0};  显性清零。


修改HAL底层是我们最不愿看到的事情,而且不止这一个设备这样,是所有的都会这样。因此只有放弃工程中 noInit配置。考虑另外的实现方式。


H7-TOOL boot程序启动时需要根据一个全局变量的值判断是直接进入app还是进入固件升级,因此最初使用noinit不让C库清零全局变量。此方案失败,原因如上。
解决方法: 直接内存访问,让编译器不认为是一个变量。
//__attribute__((zero_init)) uint32_t g_JumpInit;  /* 不会被编译器初始化为0,注意noinit后面打钩 */
//uint32_t g_JumpInit;  /* 不会被编译器初始化为0,注意noinit后面打钩 */

#define g_JumpInit *(uint32_t *)0x20000000





回复

使用道具 举报

19

主题

129

回帖

186

积分

初级会员

积分
186
QQ
发表于 2019-10-4 11:49:34 | 显示全部楼层
可以在main函数最最最前面的用户函数区把所有全局变量初始化嘛?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2019-10-4 11:58:37 | 显示全部楼层
lovelessing... 发表于 2019-10-4 11:49
可以在main函数最最最前面的用户函数区把所有全局变量初始化嘛?

应用场景不同。

此贴:

STM32H7软件复位NVIC_SystemReset后,各个RAM继续保持原有数据的问题总结(2019-10-03)
http://www.armbbs.cn/forum.php?m ... 5217&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

19

主题

129

回帖

186

积分

初级会员

积分
186
QQ
发表于 2019-10-7 16:47:37 | 显示全部楼层
eric2013 发表于 2019-10-4 11:58
应用场景不同。

此贴:

微信登陆,给我了个新用户,积分都没啦
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2019-10-8 01:58:22 | 显示全部楼层
lovelessing... 发表于 2019-10-7 16:47
微信登陆,给我了个新用户,积分都没啦

我们论坛的微信登陆已经关闭。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2019-10-8 12:14:36 | 显示全部楼层
微信登陆,积分没啦无所谓啊,终于能注册上了
回复

使用道具 举报

19

主题

129

回帖

186

积分

初级会员

积分
186
QQ
发表于 2019-10-8 12:58:14 | 显示全部楼层
eric2013 发表于 2019-10-8 01:58
我们论坛的微信登陆已经关闭。

那之前的账户都消失了吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2019-10-8 13:40:09 | 显示全部楼层
lovelessing... 发表于 2019-10-8 12:58
那之前的账户都消失了吗

可以恢复,将你的账号发我
回复

使用道具 举报

19

主题

129

回帖

186

积分

初级会员

积分
186
QQ
发表于 2019-10-8 14:54:33 | 显示全部楼层
eric2013 发表于 2019-10-8 13:40
可以恢复,将你的账号发我

不记得帐号了,但是发过了一个帖子
http://www.armbbs.cn/forum.php?m ... peid%26typeid%3D144
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107077
QQ
发表于 2019-10-8 17:35:02 | 显示全部楼层
lovelessing... 发表于 2019-10-8 14:54
不记得帐号了,但是发过了一个帖子
http://www.armbbs.cn/forum.php?mod=viewthread&tid=94931&extra=pa ...

帮你修改好了,已经发你QQ
回复

使用道具 举报

6

主题

76

回帖

94

积分

初级会员

积分
94
发表于 2019-10-17 13:18:09 | 显示全部楼层
我想说,为什么不用后备区的4KSRAM呢?或者浪费一点,用最小擦除单元(一个Page/Sector)的Flash来存储App升级完成的信息,在SoftRest之后,Boot检测这个信息域的App_Complete_Flag、Code_Len、Code_CRC32等等。更进一步存储试运行标志、回滚标志、App版本信息等等。
回复

使用道具 举报

6

主题

76

回帖

94

积分

初级会员

积分
94
发表于 2019-10-17 13:19:21 | 显示全部楼层
我对NoIint很不放心,吃过莫名其妙的亏。
回复

使用道具 举报

6

主题

76

回帖

94

积分

初级会员

积分
94
发表于 2019-10-17 13:26:06 | 显示全部楼层
本帖最后由 buxinshan 于 2019-10-17 14:53 编辑

当然,良好的习惯,定义全局变量同时置初始值。可是在某款国产芯片中,我也吃过这个亏,在芯片复位之后运行在低速模式32.768KHz(低功耗芯片嘛),在如此低的速率下去做__main,根本干不过来,RAM初始化话还没完成,硬件看门狗起作用了。
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2019-10-23 13:17:59

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2019-10-23 13:18:46
http://www.armbbs.cn/forum.php?mod=viewthread&tid=94569

这是我发的帖子   密码没了
以前是微信直接登录的。
能把密码改了吗
我的QQ1530908765
谢谢

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

本版积分规则

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

GMT+8, 2024-5-16 21:15 , Processed in 0.247615 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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