STM32分配堆栈空间不足问题原因及解决方法

原文链接:http://blog.csdn.net/lighthear/article/details/69485942

STM32堆栈空间不足问题

       先说结论,以STM32F103RCT6为例,初始的栈空间是1KB,堆空间是512Byte。如果动态内存分配需求过多时,需要手动调节堆空间。在启动文件startup_stm32f103xe.s的开头就可以设置堆栈空间大小。同样,在STM32CubeMX中也可对堆栈大小进行修改,在Project -> Settings选项中可以对Minimum Heap Size大小进行更改。扩大之后即可解决堆栈空间不足的问题。

遇到的问题

       今天在STM32F103RCT6上,使用 malloc() 为链表分配内存空间时,忽然遇到一次分配内存过多而死机的问题。查阅官方文档发现此型号的单片机FLASH 256KB,RAM 48KB。我链表的结构体定义如下:

typedef struct LNode{
    uint8_t       data;
    struct LNode *next;
}LNode,*LinkList;
 
 
  • 1
  • 2
  • 3
  • 4

        uint8_t类型在单片机中定义为unsigned char即1个字节,32位系统一个指针变量为4字节。由于“内存对齐”机制的存在,所以实际上一个节点分配的内存为8字节。并且通过输出语句printf("%d",sizeof(*Head));打印到串口助手显示的也是8,证明的分析的正确性。

       经过测试发现,我最多能创建32个节点,因此我只使用了32*8=256 byte 的内存空间。与官方文档的48KB的内存空间相差太多。

解决方法

       查阅网上的博客发现,堆栈大小可以在stm32的启动文件startup_stm32f103xe.s里面设置,开头就有:

Stack_Size      EQU     0x400
Heap_Size       EQU     0x200
 
 
  • 1
  • 2

0x00000400 等于1024字节所以等于1K

0x00000200 等于512字节所以等于512 Byte

参考博客:http://blog.csdn.net/xlhcgd/article/details/45769267

       由于malloc()分配的动态内存在堆区域,因此调大堆空间Heap_Size0xC00,即3072字节大小。重新测试,发现可以接收到191个节点,这次使用了191*8=1528 byte大小的内存空间。由此判断,用户可以自由使用的堆空间,大约为堆总空间的一半。超过时系统就会死机。

注:在STM32CubeMX中也可对堆栈大小进行修改,在Project -> Settings选项中可以对Minimum Heap Size大小进行更改。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在HC32编程中,默认情况下我们不需要关注堆栈空间的大小,因为在HC32的启动文件中已经为我们预先设置好了堆栈空间的大小。根据引用中的启动代码,HC32的堆栈大小为0x400(1024字节)。这意味着在编程时,我们可以使用最多1024字节的堆栈空间。 然而,如果工程中使用了malloc函数来动态分配内存空间,那么分配空间将属于堆空间。如果默认的堆空间大小不满足工程需求,我们可以手动调整堆空间的大小,根据引用所述。 此外,HC32的堆栈空间分配会占用RAM资源。因此,一个基础的HC32工程编译后,RAM的空间也会占用一部分,一般约为1.6K左右。我们可以通过编译的map文件查看RAM资源的占用情况,如引用所提到的。 综上所述,HC32的堆栈空间分配可以根据启动文件中预设的大小进行使用,同时也可以根据工程需求手动调整堆空间的大小。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [STM32堆栈空间大小设置](https://blog.csdn.net/liming0931/article/details/104519986)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值