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

STM32CubeIDE 实用技巧之配置 Heap 空间

[复制链接]
STMCU小助手 发布时间:2022-8-4 23:12
1. 问题描述1 f3 f7 b9 B, G& a4 f1 \5 i
近日接到一客户需求,其欲在 STM32CubeIDE 中指定堆(Heap)的地址到某一专用的RAM 中。
( f7 [1 \$ q# f  o, k* o9 x9 V2 ?9 G+ J2 T
4 I$ n! Y# c! w- a
2. 问题分析
/ Q* _( a6 }% b# J# a, ]1 bSTM32CubeIDE 生成的工程中,默认的堆栈配置示意图如图 1 所示:& P7 ^# L0 h. i% b1 ?" y: x* u

& l; |: \1 w% ~: f& t9 Y 6@G1D@0V_WPOIX@3GWSVOIJ.png
6 }& g3 ^5 x* @) ^
% r6 w* I5 J8 n! K0 y- q) ]3 W
' Q5 |3 c: {: S. @
客户的需求就是想配置堆栈为图 2 的分布状态,这里堆的地址要能够自定义: 0 O0 K8 ^! _0 u* W$ d

, f5 M+ \( z3 j( J0 l3 T

0 S/ \+ f% _/ `; u* ^ YJ%Q](]PB%}0VBXDKN[]DTQ.png $ U; O; T) t$ k

6 l  p4 b5 t0 I; ~9 z* Q) l3. 解决方法5 ]4 c+ T8 J. h+ E% J9 }
通过 STM32CubeIDE 生成的工程中,会默认生成 sysmem.c。这个文件中的__sbrk_heap_end 指针默认赋值为 NULL,我们只需要更改这个指针为目标地址即可达到期望。; e' h/ I) Y* B7 @
例如:默认配置是“static uint8_t *__sbrk_heap_end = NULL;”我们希望将堆的地址分配到 0x20001000 为起始的空间上,可以这样做:
. ~# w& F5 G$ |! k' K- c2 `“static uint8_t *__sbrk_heap_end = (uint8_t*)0x20001000;”. B' d9 V% x- E* C, P% E
注意:由于堆(heap)向上增长,栈(stack)向下增长,所以在手动更改堆的起始地址时,如果定义后的堆和栈内存存在重叠区域,STM32CubeIDE 无法识别这种情形,用户应当避免这样的设置。6 o# S  e7 H" q& q- w6 P
4 `8 i9 c5 q( `7 f  Q, M7 ]& D% {
4. 验证
9 ?4 z' T+ y' K- n& N- J0 _在 STM32CubeIDE 生成的串口打印的工程,然后按照上面示例修改 sysmem.c 中的_sbrk_heap_end 参数。
' ~! \6 \, k, o0 U% _int main(void)
3 \( b$ ~+ z$ j% V{3 T3 P$ B4 v1 A0 |& v* n
/* USER CODE BEGIN 1 */8 ^4 m$ i: b5 v
uint8_t *heap_pointer = (uint8_t *)malloc(10);4 Z; A/ Z  V) [7 O: A/ }
/* USER CODE END 1 */
, d0 W! X  T. |+ ^$ K。。。
3 I* P) f) J+ Q- i( G9 r/* USER CODE BEGIN 2 */6 ^. {$ B1 F8 `: K4 z3 t
if(heap_pointer != NULL)
. b  h$ D. @) o; c0 S) o$ u{4 Y6 _' K6 v/ {5 B2 V$ W( T2 o; J
printf("heap_pointer address = %x\r\n", heap_pointer);- y) `& y# p4 N8 q  X0 c% a1 y
}else
% I% S% D7 A$ r{% [, A$ b, }1 z2 J3 l
printf("malloc memory failed\r\n");
! E3 {; P0 v+ C% l( |! C}6 b* [, v& i* L4 T: B& I
/* USER CODE END 2 */6 R) C) k* x7 {( q
。。。3 V4 q! Q2 r; G5 c- }
} 5 q' Q# y7 l  |1 U- n3 y
8 P, J: f; q5 K1 P$ u
3 N4 D( {3 ]  |  {5 d
VL%BUT6Y[1O4M`{%A(VJ5KX.png % i" a* P& W" J) ?' o$ d$ L) K
: B7 N" K7 S0 d; Z/ z# s
可以看到 heap_pointer 指针通过 malloc 申请到的地址,已经指向了目标 RAM 范围内了。5 [% }4 e- I$ x3 s' A' p3 f( B
注意,这里我们在 0x20001000 开始的位置申请了 10 个字节的空间,理论上heap_pointer 应当从 0x20001000 开始计算,但是由于 malloc 在申请的地址时,会占用 8个字节用来存储状态等信息,所以 heap_pointer 指针从 0x20001008 开始。这是STM32CubeIDE 使用了 newlib 库来实现 malloc 的机制所致,不影响用户的使用。
) R. A4 C" K8 h+ U6 K
9 n8 M" p# s) Q4 w/ J' C5 ]; c6 |% V: B: ]" j( H2 G
完整版请查看:附件! ]1 `1 [4 c" C/ O' I
" @( G$ ]7 D' \% o  e9 {# n
, F0 D% J, @  R  u+ \4 {- e' G* 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 手机版