单片机_rom_ram,程序容量之迷

发布者:悠闲之旅最新更新时间:2022-04-27 来源: eefocus关键字:单片机  rom  ram 手机看文章 扫描二维码
随时随地手机看文章

引言

单片机的内存有大小之分,内存大的相对较贵,如何选择大小,是个头疼问题,此文是自己在编程过程中遇到和ram,rom大小有关的问题。


1.单片机中xdata 和data

xdata是指片外的ram数据,data是指内部的ram数据。


而STC15中会有逻辑在外,实际在内的ram。如下图:

图1


上图摘自stc15的手册中,如果你的单片机ram只有128个字节,所以选择Memory Model时乖乖选择:Small。如下图:

图2


因为Large 模式,会选择外部ram存放和读取数据,你只有内部ram,所以程序会死(实践中我的串口通讯失效)。


所以官方建议:


 Memory Model  : Specifies the C51 Compiler memory model. The default, SMALL, is a good choice for starting new applications.


每次开始新的应用,则需要重新选择。


不同的model 生成的代码是不同的


下面的图是选用俩种不同的model ,编译代码的差异。

图3


从上图可得知,一个INC,硬生生多出了三条指令。使用了类似指针的操作。small model 速度快,生成的汇编代码量小。(但是ram有限)


再来看看stc单片机的AUX ram ,存放xdata 的ram,STC15401AS系列如下图

图4


他在内部做了一个aux ram,用他手册中的话是:逻辑在片外,物理上在片内的扩展RAM(8位地址)


stc单片机中有stc12 stc15 stc8,而接下来的一位数据时内存ram的大小,1代表128,2代表256,以此类推,所以只要你是4以后(大于256)就可以选择lage model,再附上一张图:

图5


4k的sram aux ram是3840


2.单片机代码code大小

选用了一款stc15W204s单片机,2*128ram(sram) 和4k的rom(flash)。


开始编程,添加模块uart.c,adc.c,timer.c.都还行,占用code 800个字节,然后添加cs5460.c(电表芯片的驱动程序),变成3991个字节了,我总共才4K,你还让我不让我玩了?


开始查询map文件,查询code,到底是哪个鬼?


图6


上图中,左侧第一列是程序容量大小(16进制),第二列是十进制的code容量大小,上图可知一个lib_code 占用我1487个字节,在加函数ftoa(514),和ITof(381),就2K了,lib_code 是??继续查找MAP前面的input modules included内容,对比后如下

图7


上图左侧是有ftoa(514),和ITof(381)俩个函数编译后的结果,右侧是没有ftoa(514),和ITof(381)俩个函数的编译结果。


这俩个费劲函数里面使用浮点数计算,然后就加了一堆库函数,如C51FPL(?C?FPADD)......and so    on。


下图是上图中的各种lib文件的说明(此处虽然是stc15w204s,但我把memory model 修改为了large ,所以它用了C51L.lib)

图8


上图可看出,使用不同的memory model会调用不同的库函数


图6中还有一堆?C?这个的意思如下图:

翻译一下就是:每个段名都有一个前缀,对应于用于该段的内存类型。前缀用问号(?)括起来。


原先一度以为是乱码,来俩个??问号。自以为是,自认玄学的态度得改。


问题来了?我的是4K单片机,而code rom size 只有2K 和64 k的选择,如下图:

那么我4K的单片机,在编译器里面能干到64K,可实际下载的时候,就塞不进去了,不知道有啥方法,限制一下??


以上内容参考来自:


(1)stc15.pdf


(2)keil中的uvison help  下的C51 development Tools ,


3.附录

再搬运几张C51 development Tools 的图(我是搬运工)


(1)变量想放哪里放哪里大法

为了与以前版本的C51编译器兼容,可以在数据类型之前指定内存区域。例如,以下两个声明是等效的:


在加一个at关键字,想藏那个犄角旮旯,就去哪里。

(2)函数一堆后缀

比如

使用小内存模型的函数的优点是局部变量和函数形参存储在内部8051ram中。


因此,数据访问非常高效。内存有限。有时,小模型不能满足非常大程序的要求,必须使用其他内存模型。


对于这种情况,可以声明函数使用不同的内存模型,如上图所示。


(3)__和不用__

惯例规定,对于系统头文件,宏名以“__”开头,而对于用户头文件,宏名不应以“__”开头。宏名应包含头文件名和一些附加文本。


(4)搜索小技巧

关键字:单片机  rom  ram 引用地址:单片机_rom_ram,程序容量之迷

上一篇:单片机_stc单片机eeprom 学习笔记
下一篇:单片机_LCD12864显示自己制作的图片(时钟为例)

推荐阅读最新更新时间:2024-11-13 09:49

51单片机玩转物联网基础篇07-外部中断
前言 本节我们开始,我们学习51单片机的中断系统,51单片机有5个中断源,我们首先学习外部中断,并通过中断方式检测P3^2接口是否有低电平产生。 一、基础知识 1.中断简介 中断是指CPU在执行A事件的时候,突然收到B事件发出的(中断)请求,CPU停止手中的事情,转而去执行B事件,B事件执行完毕后,又回到原来A事件被打断的地方,继续执行程序的过程,示意图如下所示: 51单片机共有5个中断源,分别是外部中断0、外部中断1、定时器中断0、定时器中断1和串口中断,这5个中断源有二个中断优先级,每个中断源可以编程为高优先级和低优先级中断,可实现二级中断服务程序嵌套。 2.中断寄存器 (1) 中断允许寄存器TCON(88H)
[单片机]
51<font color='red'>单片机</font>玩转物联网基础篇07-外部中断
基于AT89c51单片机为核心的遥控报警系统设计与原理分析
1 引 言 由于经济的快速发展,人们生活水平得到较大的提高,生活节奏也越来越快,为此家电遥控和家庭安全也为人们所需要和重视。以AT89C51单片机为核心通过电话进行电器遥控和报警装置主要解决这些问题。他的主要功能有:通过电话可以遥控16路电器通断,遥控路数可以根据需要进行扩展;可以实现电器调压调速控制,有密码设定,保密安全性好;有语言提示,避免盲目操作;可以取消已输入的操作命令;当单片机接收到家中天然气泄露、温度超限和失窃信号后会自动拨打预留电话并报告家中发生的情况。 2硬件电路设计 总体电路设计思路是:电话遥控报警器与家用电话采用并联方式,当有振铃信号时单片机开始记数,前10次铃声内若有人接电话,则遥控报警器被
[单片机]
基于AT89c51<font color='red'>单片机</font>为核心的遥控报警系统设计与原理分析
单片机定时器设置的门铃
这是一个单片机定时器设置的门铃程序,附带源代码及文档,用定时器设计的门铃说明:按下按键时蜂鸣器发出叮咚的门铃声。 程序 /* 下载程序后按键K1按下就会触发蜂鸣器门铃“叮咚”响 */ #include reg52.h typedef unsigned char u8; typedef unsigned int u16; sbit beep=P1^5; sbit k1=P3^1; u8 ding,dong,flag,stop; u16 n; void delay(u16 i) { while(i--); } void time0init() //定时器0初始化 { TMOD=0X01; //
[单片机]
51单片机的5个中断源
  51单片机有5个中断源分别是:   1、INT0——外部中断0,由P3.2端口引入,低电平或下降沿引起。默认优先级最高   2、INT1——外部中断1,由P3.3端口引入,低电平或下降沿引起。默认优先级第二   3、T0——定时器/计数器0中断,由T0计数器计满回零引起。默认优先级第三   4、T1——定时器/计数器1中断,由T1计数器计满回零引起。默认优先级第四   5、T2——定时器/计数器2中断,由T2计数器计满回零引起。默认优先级第五   另外52单片机多加一个中断源   6、TI/RI——串行口中断,串行端口完成一帧字符发送/接收后引起。默认中断优先级最低   --------------------
[单片机]
基于K9F5608A的MCS-51单片机驱动程序
K9F5608A的MCS-51单片机驱动程序主要包括函数声明管脚定义部分、命令操作函数以及数据输出函数。 (1)函数声明管脚定义部分主要完成程序所涉及的库函数的声明及有关引脚的定义,一般置于程序的开头部分,代码如下: (2)命令操作函数NFCommand()。 NfCommand()函数实现向K9F5608发送操作命令,程序代码如下: (3)地址发送函数NfAddre()。 NfAddre()函数完成向K9F5608发送3字节地址数据,程序代码如下: (4)页读函数。 页读函数实现对K9F5608数据的页读功能,主要包括ReadPageF()、ReadPage()和ReadPageS()等3种函数,相关程序
[单片机]
基于K9F5608A的MCS-51<font color='red'>单片机</font>驱动<font color='red'>程序</font>
STC89C52之中断系统 ---- 51单片机的核心 自学笔记
一、中断系统 1.1、概念 cpu在处理某一事件A时,发生了另外一事件B请求cpu迅速去处理(中断发生); cup暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 待cup将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回); 这一过程称为中断。 引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。cup暂时中断原来的事务A,转去处理事件B。对事件B 处理完毕后,再回到原来被中断的地方(即:断点)称为中断返回,实现上述中断功能的部件称为中断系统。 1.2、中断系统的功能与优点 解决了快速主机与慢速i/o设备的数据传送问题。 分时操作:cpu可以为多个io设备服务,
[单片机]
STC89C52之中断系统 ---- 51<font color='red'>单片机</font>的核心 自学笔记
基于LPC2220微控制器和嵌入式系统实现数据采集控制系统的设计
引言 随着计算机技术、电子技术和控制技术的发展,智能化、自动化、精确化的灌溉和施肥技术正逐渐取代传统的灌溉方式。在施肥过程中,需要在线检测肥料溶液的酸碱度和电导率以及灌溉压力、管道流量等,然后根据这些参数来控制电磁阀和水泵的运行达到自动灌溉施肥的目的。目前,常用的数据采集控制系统都是为某一实际应用而设计的,通用性和可扩展性差、数据存储能力不足,价格昂贵。因此基于周立功公司的ARM7核心板设计了一种通用的数据采集控制系统,并且已经应用到自动灌溉施肥系统中,能够满足稳定性,实时性以及大容量的数据存储的要求。该数据采集控制系统采用模块化设计,可以很方便的扩展和剪裁模块,同时只要对软件进行少量修改就可以方便的移植到其它应用系统中。 1
[单片机]
基于LPC2220<font color='red'>微控制器</font>和嵌入式系统实现数据采集控制系统的设计
STM32单片机内存管理器代码
本代码适用于无操作系统的STM32单片机开发,功能强大。 可申请到地址空间连续的不同大小的内存空间,且用户接口简单,使用方便。 memory.h: memory.c:
[单片机]

推荐帖子

适合于初学单片机的S51实验/开发板
这是我根据单片机教学的需要开发的“袖珍型单片机实验/开发板”,让学生自已动手组装,即作为电子工艺实习的产品,其成果又作为学生学习单片机的实验板,并用它来完成毕业设计。板子大小仅为170mmX120mm,携带方便,包含了单片机应用的常用的典型电路。可以提供套件或成品,提供套件时配焊接组装说明书,是电子专业进行电子工艺实习的必备产品。详情请见“单片机”专题中的帖子:https://bbs.eeworld.com.cn/viewthread.php?tid=60161 适合于初
忙忙草 51单片机
wince 4.2与5.0能不能同时装在我的电脑里
我在电脑上同时装了wince4.2和5.0但是在构件系统的时候.在4.2上能成功.在5.0上就不行.输出如下:BLDDEMO:TherewereerrorsbuildingMyFirstDesignMyFirstDesign-0error(s),0warning(s)是不是2个版本冲突问题还是什么?wince4.2与5.0能不能同时装在我的电脑里我机器的4.2,5.0,6.0三个版本都存在,而且都可以用.请粘贴built.log的信息build.l
xchromosome WindowsCE
哪为高手知道,调试时报错“0x89731706 Device Connectivity Component ”是什么原因(C#2005)?
哪为高手知道,调试时报错“0x89731706DeviceConnectivityComponent”是什么原因(C#2005)?之前没有问题,今天突然出现这种问题!哪为高手知道,调试时报错“0x89731706DeviceConnectivityComponent ”是什么原因(C#2005)?我也想知道为什么会这样,我今天也遇到了这样的问题!好郁闷我也遇到了类似问题,我是新增了一个SDK包,然后增加了一个引用,就出现这个问题了。把引用去掉了就一切正常现在也找不
lsh800501 嵌入式系统
自己找的几个小软件,喜欢的可以下来看看
不用客气啊自己找的几个小软件,喜欢的可以下来看看呵呵~谢谢斑竹,都是挺有意思的小软件~回复楼主的帖子谢谢!很实用的小软件,不知是用何程序编出的很不错的几个小软件,谢谢楼主的分享
hexinzhou PCB设计
【FM33LG0系列开发板测评】01.准备开发环境
开发板说明:复旦微的FM33LG0XX开发板板载了一颗LQFP80封装的MCU:FM33LG048,FLASH256KB,SRAM32KB;板载4路按键和4路LED指示灯;开发板将MCU的外设资源都通过排针的形式引出来,提供了丰富扩充接口和功能模块,为前期的方案/功能验证提供了便捷。开发板资源:开发资料准备:FM33LG0xx产品说明书_V1.6,包含了数据手册和用户
xld0932 国产芯片交流
想写一个430串口通讯的上位机.......求科普用哪种语言?
本帖最后由huixianfxt于2014-1-1310:07编辑 功能就是PC接受串口传送的数据,将这些数据在PC机上打点显示图像(也就是一条变化的曲线)。写上位机应该用C++还是VB呢还是C#呢,声明一点本人这几门语言都没学过,只有c语言基础,试问用哪一种语言编写上位机更加容上手,周期短(最好一个月之内)。现在本人在看C++..........求高指点迷津呢........希望能叙述的详细点,谢谢!想写一个430串口通讯的上位机.......求科普用哪种语言?图书馆里有C+
huixianfxt 微控制器 MCU
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved