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

STM32CubeIDE 实用技巧之配置 Heap 空间

[复制链接]
STMCU小助手 发布时间:2022-8-4 23:12
1. 问题描述
, J! [" n% t1 ^& Y" N% L近日接到一客户需求,其欲在 STM32CubeIDE 中指定堆(Heap)的地址到某一专用的RAM 中。) g+ u8 G6 j: N" I

% d% R/ b. E- B( r- ^0 w0 K0 Z
1 g# r1 `0 q9 E+ a% m! r" W
2. 问题分析! G. R2 ?1 z2 f
STM32CubeIDE 生成的工程中,默认的堆栈配置示意图如图 1 所示:4 {" v4 m8 ]$ T
* T; F6 i0 D, U' `( J2 H- e
6@G1D@0V_WPOIX@3GWSVOIJ.png ( G: g" @; `& @8 X0 r9 c0 m
0 ]2 M: z) Z! C# S' h8 F% w8 N

% k4 B6 q8 Y% A3 m% y0 c2 b9 k3 ]客户的需求就是想配置堆栈为图 2 的分布状态,这里堆的地址要能够自定义: 7 g! Z7 b  I$ C7 W0 G+ q& E) a

" M9 ]5 o3 a# `

/ J4 ]1 S6 k" S! c7 u YJ%Q](]PB%}0VBXDKN[]DTQ.png 0 w* d8 [$ {& w

2 ~( K; l. {$ @/ x$ g3. 解决方法
* O7 v+ j1 ?9 `通过 STM32CubeIDE 生成的工程中,会默认生成 sysmem.c。这个文件中的__sbrk_heap_end 指针默认赋值为 NULL,我们只需要更改这个指针为目标地址即可达到期望。( l3 n; u+ Z, e7 p* A
例如:默认配置是“static uint8_t *__sbrk_heap_end = NULL;”我们希望将堆的地址分配到 0x20001000 为起始的空间上,可以这样做:
+ y# Q/ k* R- A( P“static uint8_t *__sbrk_heap_end = (uint8_t*)0x20001000;”
0 b2 \6 {  ]5 d6 {& N+ W; N  m注意:由于堆(heap)向上增长,栈(stack)向下增长,所以在手动更改堆的起始地址时,如果定义后的堆和栈内存存在重叠区域,STM32CubeIDE 无法识别这种情形,用户应当避免这样的设置。
' D; B7 ?' J9 d6 ^; V3 m( M% d0 r. g5 `
4. 验证" ^  N# D  x! P% X. a
在 STM32CubeIDE 生成的串口打印的工程,然后按照上面示例修改 sysmem.c 中的_sbrk_heap_end 参数。
0 u# P3 C# X1 K5 f) V" Gint main(void), e' w1 l- c: ~0 z5 K
{# H5 E& a* a) e. \
/* USER CODE BEGIN 1 */
9 D. Q5 p1 P& T! [- z: S; z5 P6 duint8_t *heap_pointer = (uint8_t *)malloc(10);
! d, Y9 D( A# w0 O9 F" P/* USER CODE END 1 */
& a9 D6 ]5 {3 Y9 O2 U。。。
: a! Y$ i/ D7 t" G/* USER CODE BEGIN 2 */  j2 y( i3 U. h
if(heap_pointer != NULL)
/ Z2 |. v8 Z1 e3 D: u2 [9 M4 V{
. {8 j3 @" r2 j- ~) @/ Q9 W/ ~printf("heap_pointer address = %x\r\n", heap_pointer);# o7 Y- p  g7 O: d8 j
}else
3 Q/ e2 M# s7 `) [  u, F, i{0 j7 ?+ m0 \! M' V9 r- C6 }2 d$ w
printf("malloc memory failed\r\n");; K/ Z% N4 z% a6 D- l4 v+ R4 b/ T* E
}( \; ?: q3 T5 Y
/* USER CODE END 2 */
4 m/ o2 }0 {  J# [# K& Q。。。
$ y8 O& y$ f1 \2 l- Z; g6 {}
$ o3 [0 v7 W: B9 S. E# Y' U
8 _" i1 ~2 Y2 F1 r# s& k
8 y6 P& ?8 H6 ?' d! `  U' i$ s! o
VL%BUT6Y[1O4M`{%A(VJ5KX.png 3 }# ^: ?" \/ V# k

/ R* s! ^2 A0 t# k9 A* q( `可以看到 heap_pointer 指针通过 malloc 申请到的地址,已经指向了目标 RAM 范围内了。
" P- g9 a$ c# [5 f  o( ?5 g( j注意,这里我们在 0x20001000 开始的位置申请了 10 个字节的空间,理论上heap_pointer 应当从 0x20001000 开始计算,但是由于 malloc 在申请的地址时,会占用 8个字节用来存储状态等信息,所以 heap_pointer 指针从 0x20001008 开始。这是STM32CubeIDE 使用了 newlib 库来实现 malloc 的机制所致,不影响用户的使用。
. i& P5 q. B  Y! y* K  ]% L, `8 |1 S9 w
' i! ^! }6 ^( C  Z
完整版请查看:附件
0 g6 `8 p4 F* \8 O; O! ^' G
, K) u0 U2 Q1 X* p2 u
* S: z( m$ F: z) x8 \4 C4 I% l

LAT1079 STM32CubeIDE实用技巧之配置堆空间_v1.0.pdf

下载

281.19 KB, 下载次数: 4

赞 收藏 评论0 发布时间:2022-8-4 23:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

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