STMCU小助手
发布时间:2022-8-4 23:12
|
1. 问题描述 近日接到一客户需求,其欲在 STM32CubeIDE 中指定堆(Heap)的地址到某一专用的RAM 中。1 @$ x) Z8 ]! n9 `6 m& V 4 V, Z5 S# G/ x7 t 2. 问题分析 STM32CubeIDE 生成的工程中,默认的堆栈配置示意图如图 1 所示:
$ C! B4 f& d. q0 L* s2 s 0 j3 a9 B2 G( g3 y8 {5 { 客户的需求就是想配置堆栈为图 2 的分布状态,这里堆的地址要能够自定义: 3 P ?! f. D L7 _
3 U: j9 i q# Y 3. 解决方法 通过 STM32CubeIDE 生成的工程中,会默认生成 sysmem.c。这个文件中的__sbrk_heap_end 指针默认赋值为 NULL,我们只需要更改这个指针为目标地址即可达到期望。 例如:默认配置是“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 无法识别这种情形,用户应当避免这样的设置。 1 g' e6 Q9 ^: i' N7 r7 @ 4. 验证 在 STM32CubeIDE 生成的串口打印的工程,然后按照上面示例修改 sysmem.c 中的_sbrk_heap_end 参数。 int 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); }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 } 7 m6 k0 D/ n' X2 Y A- o# |) J3 g. c 1 Z( Z3 R, O# g
可以看到 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 完整版请查看:附件4 P1 y2 f& u' d8 Q+ ] " p3 T9 a# Q. J5 n" Q |
LAT1079 STM32CubeIDE实用技巧之配置堆空间_v1.0.pdf
下载281.19 KB, 下载次数: 4
【STM32H5 评测】基础硬件加密与随机数性能 - STM32H5E5实测硬件AES加解密、HASH运算、TRNG真随机数输出速率与稳定性
【STM32H5 评测】NUCLEO-H5E5ZJ 使用 TrustZone 安全分区系统实践测试
【STM32H5 评测】CPU核心性能 - STM32H5E5跑 RTOS,观察任务切换速度、中断响应快慢
【STM32H5 评测】内存读写性能 - STM32H5E5实测Flash,SRAM读写速度,用DMA搬运大块数据
【NUCLEO-C562RE】OLED 显示
保姆级教程:CMake 工程导入 STM32CubeIDE 步骤
STM32CubeCLT 1.22.0新版本发布
【下载问题解决】关于ST官网下载软件问题解决
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
微信公众号
手机版