• stm32 RAM分配及占有(转)


    源:http://blog.chinaunix.net/uid-26921272-id-4550126.html

    一个小的项目,在测试时间和产品量稍微大一些之后,出现了一些莫名其妙的非逻辑错误的Bug(最头疼的是不能每次都能复制出来)。经过修改后,最近一个月的测试都没有出现。本人在这里得到了原子哥和其他朋友的很多帮助,也把自己的一些经验分享给各位,也欢迎大家指正。

    1. 程序偶尔会出现一些Bug,经过output串口信息发现一些堆栈的临时变量被莫名其妙的修改。
    stm32103rbt6的内存是20K,算比较小了,看到程序出错的那个函数申请了很多零时变量,也需要访问很多全局变量。猜想是内存被其他操作更改所致。
    解决ram被使用过多的一个方法是尽量少用全局变量,能用const就用一定用const变量,因为这样会放在flash,而不是ram.
    我的程序未将全局变量修改成const变量之前,编译出来
    Program Size: Code=40998 RO-data=8702 RW-data=3724 ZI-data=3260
    尽量将全局变量修改成const变量之后,编译出来
    Program Size: Code=35778 RO-data=13470 RW-data=108 ZI-data=2060    
    大大减少了RW-data,这个问题就再也没出现了。

    相关资料:
    Code为程序代码部分
    RO-data 表示 程序定义的常量 const temp;
    RW-data 表示 已初始化的全局变量
    ZI-data 表示 未初始化的全局变量
    Total RO  Size (Code + RO Data)
    Total RW  Size (RW Data + ZI Data)
    Total ROM Size (Code + RO Data + RW Data)
    初始化时RW-data从flash拷贝到RAM

    2. 程序莫名其妙死机,
    猜想因为申请了很多零时变量,可能需要调整Stack_Size
    在STM32F10x.s文件中
    修改Stack_Size      EQU     0x00000200
    成Stack_Size      EQU     0x00000400
    就再没出现死机的情况。

  • 相关阅读:
    mac 外接显示屏的坑
    ssh 多秘钥管理和坑
    CircleCI 前端自动部署
    jest 事件测试
    await Vue.nextTick() 的含义分析
    Jest 里面需要注意的几个小细节
    element 库 date-picker 的 disabledDate 的坑
    jest 提示 Unexpected identifier 的解决方案
    preventDefault 和 stopPropagation
    数据库:Flask-SQLAlchemy
  • 原文地址:https://www.cnblogs.com/LittleTiger/p/4371367.html
Copyright © 2020-2023  润新知