硬汉嵌入式论坛

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

[HAL] 最新的MDK AC6.14使用0级优化编译HAL库的n级条件表达式会产生巨大的栈需求,使用0以外优化等级即可解决

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106718
QQ
发表于 2020-5-5 19:17:44 | 显示全部楼层 |阅读模式
现象:

使用MDK5.30 AC6.14的0级优化测试RTX5的模板程序,发现启动任务需要高达2000字节的栈需求。

原因分析:

通过不断的调试和查看map,htm等文件,最终锁定是H7的HAL库函数UART_SetConfig导致的。

QQ截图20200505191621.png

进一步的排查,锁定是下面这种n级条件表示导致的,下面这种类型的表达式偏偏在函数UART_SetConfig里面有一大批,导致产生巨大的栈需求。

  1. /** @brief  Get UART clok division factor from clock prescaler value.
  2.   * @param  __CLOCKPRESCALER__ UART prescaler value.
  3.   * @retval UART clock division factor
  4.   */
  5. #define UART_GET_DIV_FACTOR(__CLOCKPRESCALER__) \
  6.   (((__CLOCKPRESCALER__) == UART_PRESCALER_DIV1)   ? 1U :       \
  7.    ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV2)   ? 2U :       \
  8.    ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV4)   ? 4U :       \
  9.    ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV6)   ? 6U :       \
  10.    ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV8)   ? 8U :       \
  11.    ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV10)  ? 10U :      \
  12.    ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV12)  ? 12U :      \
  13.    ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV16)  ? 16U :      \
  14.    ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV32)  ? 32U :      \
  15.    ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV64)  ? 64U :      \
  16.    ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV128) ? 128U :     \
  17.    ((__CLOCKPRESCALER__) == UART_PRESCALER_DIV256) ? 256U : 1U)
复制代码



解决办法:

使用AC6中0以外的其它优化就解决了,或者使用AC5的任何优化等级也都可以解决。

回复

使用道具 举报

27

主题

95

回帖

181

积分

初级会员

积分
181
发表于 2020-5-5 19:42:49 | 显示全部楼层
能==
回复

使用道具 举报

27

主题

95

回帖

181

积分

初级会员

积分
181
发表于 2020-5-5 19:43:56 | 显示全部楼层
能不能自己改一下,这种嵌了好多层并不香。
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2020-5-5 23:03:00 | 显示全部楼层
ST的工程师,都是PC机玩的多了吗?
回复

使用道具 举报

2

主题

85

回帖

91

积分

初级会员

积分
91
发表于 2020-5-6 09:09:18 | 显示全部楼层
都说HAL的库臃肿,效率低,都不想HAL库,但是看目前的情况又不得不用,真是矛盾,小容量的单片机怎么玩哦,网上一堆的人都在说CUMX如何好,自动生成代码,难道他们玩的单片机都是RAM非常大的,都是搞高大上的项目?
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2020-5-6 09:34:12 | 显示全部楼层
晚上都是学习型的,就没考虑资源的问题
整高大上的上
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2020-5-6 09:35:18 | 显示全部楼层
AC6目前感觉有一个致命的缺点,加密电脑下无法用
真是坑爹到家了
回复

使用道具 举报

0

主题

105

回帖

105

积分

初级会员

积分
105
发表于 2020-5-6 09:35:53 | 显示全部楼层
tianyekpsex 发表于 2020-5-6 09:09
都说HAL的库臃肿,效率低,都不想HAL库,但是看目前的情况又不得不用,真是矛盾,小容量的单片机怎么玩哦, ...

在f4和h7上确实挺香的。但对f0和f1特别不友好。
产品成本不是首要敏感的地方,CPU多余这几块钱没太大影响
回复

使用道具 举报

73

主题

1193

回帖

1412

积分

至尊会员

积分
1412
发表于 2020-5-6 09:36:52 | 显示全部楼层
tianyekpsex 发表于 2020-5-6 09:09
都说HAL的库臃肿,效率低,都不想HAL库,但是看目前的情况又不得不用,真是矛盾,小容量的单片机怎么玩哦, ...

的确,小容量的mcu,hal就是站空间啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106718
QQ
 楼主| 发表于 2020-5-6 09:45:49 | 显示全部楼层

解决办法:

使用AC6中0以外的其它优化就解决了,或者使用AC5的任何优化等级也都可以解决。
回复

使用道具 举报

3

主题

1222

回帖

1231

积分

至尊会员

积分
1231
发表于 2020-5-6 10:21:18 | 显示全部楼层

回复

使用道具 举报

5

主题

100

回帖

115

积分

初级会员

积分
115
发表于 2020-5-6 11:35:12 | 显示全部楼层
HAL库是使用面向对象方法,对于组织大型复杂软件项目有优势,高效嵌入式不是有LL库吗?不要总纠结底层,要把精力放在算法、架构、可维护性上。
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2020-5-11 09:39:55 | 显示全部楼层
试了下AC6工程   0的无法运行   其它就可以  没用到串口
以前AC5 优化后才有可能无法运行。。。
也是醉了
现在AC6推荐使用吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106718
QQ
 楼主| 发表于 2020-5-11 09:45:48 | 显示全部楼层
a4058665 发表于 2020-5-11 09:39
试了下AC6工程   0的无法运行   其它就可以  没用到串口
以前AC5 优化后才有可能无法运行。。。
也是醉了 ...

推荐。AC5将要被淘汰掉了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 21:14 , Processed in 0.263125 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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