你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeIDE 实用技巧之配置 Heap 空间

[复制链接]
STMCU小助手 发布时间:2022-7-28 22:00
问题描述
近日接到一客户需求,其欲在 STM32CubeIDE 中指定堆(Heap)的地址到某一专用的RAM 中。
5 r' {  `8 J) ~2 }

) K4 q6 s# M, @8 G2 `
问题分析
STM32CubeIDE 生成的工程中,默认的堆栈配置示意图如图 1 所示:
! i. P7 s2 x9 g7 S1 p6 z
2T((LJKZ2O4M6[0U~F{Z)Q1.png
1 S/ i7 ]/ x& s$ F9 @
解决方法
通过 STM32CubeIDE 生成的工程中,会默认生成 sysmem.c。这个文件中的
__sbrk_heap_end 指针默认赋值为 NULL,我们只需要更改这个指针为目标地址即可达到期望。
  O/ c- x$ d" j. R
例如:默认配置是“static uint8_t *__sbrk_heap_end = NULL;”我们希望将堆的地址分配到 0x20001000 为起始的空间上,可以这样做:
“static uint8_t *__sbrk_heap_end = (uint8_t*)0x20001000;”

5 N% A6 O6 L5 m( h
注意:由于堆(heap)向上增长,栈(stack)向下增长,所以在手动更改堆的起始地址时,如果定义的堆和栈空间存在重叠区域,STM32CubeIDE 无法识别这种情形,用户应当避免这样的设置。

4 v- S9 d" N, t1 X$ }: J
# r4 Z, w9 ]3 i2 W' ]! i+ C
验证
在 STM32CubeIDE 生成的串口打印的工程,然后按照上面示例修改 sysmem.c 中的__sbrk_heap_end 参数。
AQHB9H0QWO(8($_A~~ERXHB.png

" ?4 q" G0 f( O6 R5 G: H# b; I. g' |* d1 J9 \. L1 j4 \7 _
可以看到 heap_pointer 指针通过 malloc 申请到的地址,已经指向了目标 RAM 范围内了。

8 Q2 _3 n0 m+ }" I! y8 R; n
注意,这里我们在 0x20001000 开始的位置申请了 10 个字节的空间,理论上heap_pointer 应当从 0x20001000 开始计算,但是由于 malloc 在申请的地址时,会占用 8个字节用来存储状态等信息,所以 heap_pointer 指针从 0x20001008 开始。这是STM32CubeIDE 使用了 newlib 库来实现 malloc 的机制所致,不影响用户的使用。
4 Z' b+ c( [7 o7 R: w) L* K
赞 收藏 评论0 发布时间:2022-7-28 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版