stm32 使用arm gcc 实现malloc 和 free

本文介绍STM32C8T6的内存配置,ROM为64K,RAM为20K。通过重定向_sbrk函数实现malloc和free的功能,并增加了边界检查以避免内存溢出导致的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于 stm32c8t6 来说 rom 是64k ram 是 20k。使用静态库的libnosys.a 实现的_sbrk 函数 是可以使用malloc 和free的。但是有个问题就是没有边界检查。

ram 的范围是0x20000000-0x20005000,申请的内存会超过 0x20005000。这样就好引发HardFault_Handler 异常。

可以这样重定向_sbrk 函数。堆增长的时候可以检查是否跟当前的栈内服重叠。

 caddr_t _sbrk(int increment)
    {
        extern char end asm("end");  //在ld文件定义 __bss_end__ , __end__ ,end
        register char *pStack asm("sp"); //栈寄存器SP指针 

        static char *s_pHeapEnd;

        if (!s_pHeapEnd)
            s_pHeapEnd = &end;

        if (s_pHeapEnd + increment > pStack)  //跟当前栈内存重叠,申请失败 返回 -1
            return (caddr_t)-1;

        char *pOldHeapEnd = s_pHeapEnd;
        s_pHeapEnd += increment;
        return (caddr_t)pOldHeapEnd;
    }

链接 参数 -mcpu=cortex-m3 -mthumb  --specs=nano.specs --specs=nosys.specs
### STM32F103中的`malloc`函数实现使用 在嵌入式开发环境中,动态内存分配通常通过标准库函数 `malloc()` 实现。然而,在资源受限的微控制器(如STM32F103)中,`malloc()` 的行为可能受到特定环境的影响。 #### 动态内存管理的基础 为了支持 `malloc()` 其他相关函数(如 `free()`),需要确保链接器脚本正确配置堆空间大小,并初始化 `_sheap` `_eheap` 符号来定义可用堆区域的位置范围[^1]。这些符号由工具链自动生成并放置到 `.bss` 或专用的 `.heap` 节区中。 以下是典型的链接器脚本片段: ```ld .heap (RW) : { PROVIDE(_sheap = .); . += HEAP_SIZE; PROVIDE(_eheap = .); } >RAM ``` 在此基础上,编译器会提供默认的新建操作符覆盖机制以及 C 运行时启动代码完成必要的初始化工作。 #### 配置Heap Size 对于基于ARM Cortex-M系列MCU的应用程序来说,默认情况下可能会有较小或者未指定数量级的 heap size 设置。这可以通过修改项目属性里的 linker options 来调整具体数值;例如设置较大的值以适应更多复杂的场景需求: ```c #define HEAP_SIZE ((uint32_t)(64 * 1024)) // 定义为64KB extern uint8_t _sheap[], _eheap[]; void SystemInit(void){ SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; } int main(){ HAL_Init(); MX_GPIO_Init(); printf("Start\n"); void* pMem=malloc(HEAP_SIZE/2); if(pMem != NULL){ memset(pMem,0,(size_t)(HEAP_SIZE)/2); free(pMem); }else{ while(1){} } return 0;} ``` 上述例子展示了如何申请一半的总heap space作为测试用途,并随后释放它[^2]。 #### 使用Newlib nano或Full版本 当目标平台选用GCC作为其主要构建工具之一时,则可以选择不同的newlib变体形式——即full版或是轻量化的nano variant。后者特别适合于那些希望减少最终二进制文件尺寸的小型应用场合之中。需要注意的是两者之间存在一些API差异之处,因此切换前应仔细阅读文档说明以免引入兼容性问题。 另外值得注意的一点是关于浮点数打印的支持情况:如果启用了FP Printf Parse选项的话,那么相应的stub函数也需要被加入工程当中去满足调用关系图上的依赖链条完整性要求[^3]。 #### 结论 综上所述,在STM32F103芯片上成功部署并高效利用`malloc()`功能的关键在于合理规划硬件资源配置的同时兼顾软件层面的设计考量因素。从基础理论知识出发逐步深入探讨实际应用场景下的最佳实践方案不失为一种有效途径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值