zoukankan      html  css  js  c++  java
  • 51单片机局部变量占用ram的问题

    51单片机局部变量占用ram的问题

    一、问题

    自从工作以来基本不使用51或者增强型51之类的单片机。最近调试芯圣HC89S003F4增强型51,移植了32的实用代码,结果发现RAM爆了!!!

    image

    二、实践

    为了看出问题,我又重新建立了一个简单工程。

    #include <reg52.h>
    int test(void)
    {
    	char a[20];
    	return 1;
    }
    void main(void)
    {
    	test();
    	while(1);
    }
    

    结果a改多大,RAM就加多少。

    再看STARTUP.A51文件,发现跟stm32的启动程序不一样,根本没有定义heap堆,stack也是追加在被使用RAM的末尾。

    最后看了这个帖子
    http://bbs.21ic.com/icview-281857-1-1.html

    基本可以确定是局部变量没有地方保存,全存RAM里了!!


    但是这样不合理啊,岂不是写个函数就占一部分RAM,不用几十个函数,RAM就不够用了。于是我开始看编译生成的汇编。

    • 右键main.c打开Options配置窗口,勾选SRC

    image

    • 编译后会在ProjectObjects生成main.SRC文件

    image

    image

    image

    • 几番调试后,发现局部变量、传参会随缘用到R3R7,指针传参会用到R1R3;传参大于2个的或者使用long类型字节存RAM;

    三、结论

    51局部变量不存堆,存R0~R7,可能跟八位机容量小、寻址比较慢有关。

    反正使用的时候注意传入参数需要小于三个,像va_list之类的占用大的局部变量尽量不要使用,以免空间不够用。

  • 相关阅读:
    Python3之format
    xml文件整理
    某系统采集2018
    sublime+python3 中文环境
    python3文本读取与写入常用代码
    redis3.0集群使用发现的一些问题
    mysql字符集
    redis3.0集群搭建
    安装Maven、nexus
    一键安装mysql5.6
  • 原文地址:https://www.cnblogs.com/yywBlogW/p/11511584.html
Copyright © 2011-2022 走看看