STMCU小助手
发布时间:2022-8-4 23:12
|
1. 问题描述 近日接到一客户需求,其欲在 STM32CubeIDE 中指定堆(Heap)的地址到某一专用的RAM 中。 2. 问题分析 STM32CubeIDE 生成的工程中,默认的堆栈配置示意图如图 1 所示:
客户的需求就是想配置堆栈为图 2 的分布状态,这里堆的地址要能够自定义:
3. 解决方法 通过 STM32CubeIDE 生成的工程中,会默认生成 sysmem.c。这个文件中的__sbrk_heap_end 指针默认赋值为 NULL,我们只需要更改这个指针为目标地址即可达到期望。 例如:默认配置是“static uint8_t *__sbrk_heap_end = NULL;”我们希望将堆的地址分配到 0x20001000 为起始的空间上,可以这样做: “static uint8_t *__sbrk_heap_end = (uint8_t*)0x20001000;” 注意:由于堆(heap)向上增长,栈(stack)向下增长,所以在手动更改堆的起始地址时,如果定义后的堆和栈内存存在重叠区域,STM32CubeIDE 无法识别这种情形,用户应当避免这样的设置。 4. 验证 在 STM32CubeIDE 生成的串口打印的工程,然后按照上面示例修改 sysmem.c 中的_sbrk_heap_end 参数。 int main(void) { /* USER CODE BEGIN 1 */ uint8_t *heap_pointer = (uint8_t *)malloc(10); /* USER CODE END 1 */ 。。。 /* USER CODE BEGIN 2 */ if(heap_pointer != NULL) { printf("heap_pointer address = %x\r\n", heap_pointer); }else { printf("malloc memory failed\r\n"); } /* USER CODE END 2 */ 。。。 }
可以看到 heap_pointer 指针通过 malloc 申请到的地址,已经指向了目标 RAM 范围内了。 注意,这里我们在 0x20001000 开始的位置申请了 10 个字节的空间,理论上heap_pointer 应当从 0x20001000 开始计算,但是由于 malloc 在申请的地址时,会占用 8个字节用来存储状态等信息,所以 heap_pointer 指针从 0x20001008 开始。这是STM32CubeIDE 使用了 newlib 库来实现 malloc 的机制所致,不影响用户的使用。 完整版请查看:附件 |
LAT1079 STM32CubeIDE实用技巧之配置堆空间_v1.0.pdf
下载281.19 KB, 下载次数: 3
CubeMX生成CubeIDE工程代码乱码
STM32CubeIDE实时时钟(RTC)经验分享
实战经验 | ClassB功能安全认证代码与应用代码分区的实现要点
【STM32U3 评测】人体行为识别
【STM32U3 评测】串口控制步进电机与LabVIEW数据采集
实战经验 | STM32CubeIDE实用技巧之如何指定变量、函数、文件到指定内存
【STM32U3 评测】步进电机驱动
【STM32U3 评测】MNIST 数字识别
【STM32U3 评测】介绍、环境搭建、工程测试
STM32Cube嵌入式软件更新
微信公众号
手机版