zoukankan      html  css  js  c++  java
  • stm32 堆溢出

    STM32 堆溢出#

    遇到的问题##

    最近在给旧项目添加了段代码,程序经常到某个状态就突然崩溃了,也不一定是在运行新代码的时候崩溃。检查了几遍代码,数组越界访问,除数为0,内存泄露等常见的问题都不存在。

    原因##

    最后发现,问题出在程序中用mallc动态分配内存,却没对是否成功分配做检查。程序中,因为堆空间不足,分配内存不成功,malloc返回NULL。后面的代码对NULL地址进行写操作,引起了程序崩溃。

    后续的一些概念整理

    1. STM32系列单片机在startup_stm32fxx.s文件中,定义了Heap_Size 和 Stack_Size.常见的大小分别是0x200(512 bytes),0x400(1024 bytes),大小可以修改,但是要考虑程序的规模和单片机IRAM的大小。

    2. 堆和栈在IRAM中分配。堆和栈在IRAM中的绝对地址不是固定的,IRAM 中section 排列顺序:.data , .bass, HEAP , STACK。

    3. 不同的程序,由于定义的函数和变量不一样,.data 和 .bass 两个section 的大小不一样,导致HEAP和STACK的绝对地址不一样。

    4. 为了节省IRAM的空间,可以将不需要改变的数组声明为const类型。const类型变量会存放在代码区(flash 区域),否则存放在IRAM。

  • 相关阅读:
    QQ企业邮箱+Spring+Javamail+ActiveMQ(发送企业邮件)
    Notepad++使用图解
    Sublime Text 2安装图解
    IDE UltraEdit 图文激活+安装教程
    光猫与普通的家用猫
    通过Java Api与HBase交互(转)
    HBase配置性能调优(转)
    HBase Java API类介绍
    hbase shell基础和常用命令详解(转)
    HBase体系结构(转)
  • 原文地址:https://www.cnblogs.com/liujiangyi/p/9890774.html
Copyright © 2011-2022 走看看