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

STM32CubeIDE 实用技巧之配置 Heap 空间

[复制链接]
STMCU小助手 发布时间:2022-8-4 23:12
1. 问题描述
3 C7 [+ L  E7 e5 L& K5 o近日接到一客户需求,其欲在 STM32CubeIDE 中指定堆(Heap)的地址到某一专用的RAM 中。1 @$ x) Z8 ]! n9 `6 m& V

& D0 x" k8 D8 H. l% Y. w
4 V, Z5 S# G/ x7 t
2. 问题分析
, T3 K4 n3 p5 S( ISTM32CubeIDE 生成的工程中,默认的堆栈配置示意图如图 1 所示:
7 ~. H+ V+ F. F0 r+ i) F

! |) j( @7 J: j- f" f& ?9 @ 6@G1D@0V_WPOIX@3GWSVOIJ.png
+ J9 t8 C1 V4 t* S$ C! B4 f& d. q0 L* s2 s
0 j3 a9 B2 G( g3 y8 {5 {
客户的需求就是想配置堆栈为图 2 的分布状态,这里堆的地址要能够自定义: 3 P  ?! f. D  L7 _

# B0 l: R7 ]; g# ?; [) ^: T. W& o

- V3 c# S6 j- H& \7 f9 b YJ%Q](]PB%}0VBXDKN[]DTQ.png ( `- z5 c4 }0 o+ l+ N& ^' X
3 U: j9 i  q# Y
3. 解决方法
* ?' K$ T% r/ Z" f通过 STM32CubeIDE 生成的工程中,会默认生成 sysmem.c。这个文件中的__sbrk_heap_end 指针默认赋值为 NULL,我们只需要更改这个指针为目标地址即可达到期望。
& ?9 l( c9 n# Q. o6 F  D0 Y例如:默认配置是“static uint8_t *__sbrk_heap_end = NULL;”我们希望将堆的地址分配到 0x20001000 为起始的空间上,可以这样做:8 w- I' ]3 W2 U/ P; W! m
“static uint8_t *__sbrk_heap_end = (uint8_t*)0x20001000;”6 G4 W7 \% Y* h, V
注意:由于堆(heap)向上增长,栈(stack)向下增长,所以在手动更改堆的起始地址时,如果定义后的堆和栈内存存在重叠区域,STM32CubeIDE 无法识别这种情形,用户应当避免这样的设置。
. }3 c' B3 {9 e- n0 O1 g' e6 Q9 ^: i' N7 r7 @
4. 验证
) g1 p! G$ {- M2 F8 U在 STM32CubeIDE 生成的串口打印的工程,然后按照上面示例修改 sysmem.c 中的_sbrk_heap_end 参数。
+ {8 X# v9 R9 u5 x* j! j- xint main(void)! s3 H) B- K8 ^( \
{4 Y! `: W2 W2 Q( X
/* USER CODE BEGIN 1 *// \/ S* n6 W; A7 m, W: [
uint8_t *heap_pointer = (uint8_t *)malloc(10);. k- }% I% o0 p+ Q  o5 j
/* USER CODE END 1 */( _" F6 @9 m) K3 y
。。。. k: |6 \! f& X& F5 P+ v5 i$ i
/* USER CODE BEGIN 2 */8 g0 q" \: \5 N
if(heap_pointer != NULL)$ b( q# v$ c5 M
{  B( R" c! k( g
printf("heap_pointer address = %x\r\n", heap_pointer);
/ n( D; h, v1 D1 z; A  L}else% V" B  k/ T) x% T& z1 [* w
{7 z0 ]7 Q2 N0 d3 X8 k, G9 F
printf("malloc memory failed\r\n");: J; u( s) R% }! y$ Z
}. b/ O" P  W8 L; D
/* USER CODE END 2 */3 e6 u0 T7 c5 L) T& M
。。。: R3 {# W, z+ D/ N
}
% C, C, s1 K' Z7 m6 k0 D/ n' X2 Y  A- o# |) J3 g. c
1 Z( Z3 R, O# g
VL%BUT6Y[1O4M`{%A(VJ5KX.png
! a5 B7 u" ~1 A2 r
) x9 i; _! ]+ j  p! [% U可以看到 heap_pointer 指针通过 malloc 申请到的地址,已经指向了目标 RAM 范围内了。% o/ o. m: W7 |" F2 L) [
注意,这里我们在 0x20001000 开始的位置申请了 10 个字节的空间,理论上heap_pointer 应当从 0x20001000 开始计算,但是由于 malloc 在申请的地址时,会占用 8个字节用来存储状态等信息,所以 heap_pointer 指针从 0x20001008 开始。这是STM32CubeIDE 使用了 newlib 库来实现 malloc 的机制所致,不影响用户的使用。4 N2 u2 p  x% k- X) H# c

( P: y0 f: N+ `) p, I
4 K$ m2 R- j9 I7 ?完整版请查看:附件4 P1 y2 f& u' d8 Q+ ]

" [5 q6 I& S5 U9 u7 W" p3 T9 a# Q. J5 n" Q

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 手机版