单片机_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显示自己制作的图片(时钟为例)

推荐阅读

MCU时钟相关功能引脚有什么作用
今天给大家介绍的是i.MXRT1xxx系列MCU时钟相关功能引脚作用。如果我们从一颗 MCU 芯片的引脚分类来看芯片功能,大概可以分为三大类:电源、时钟、外设功能。作为嵌入式开发者,大部分时候关注得都是外设功能引脚,而对于时钟相关引脚往往不太在意,其实有些时候利用时钟功能引脚也能助你定位问题。今天痞子衡就带你梳理一下 i.MXRT1xxx 系列的时钟系统以及相关功能引脚:一、时钟系统简介目前 i.MXRT1xxx 系列主要分为 i.MXRT10xx 和 i.MXRT11xx 两大分支。这两个分支的时钟系统设计是有一些差异的,不过总体来说,架构差别不大,我们以如下 i.MXRT1170 的时钟架构为例来具体介绍。在时钟系统架构图里我们
发表于 2023-02-03
电压采集采样电路设计
电压的采集是我们进行电路设计常常用到的,具体的采集类型上又分为直流采集和交流采集,将源电压通过一系列的电路设计,最终通过AD(数模转换芯片或单片机内部AD)读入MCU,并执行相应的决策,是我们大多设计的要求。下文将通过具体的实例介绍如何设计合适的电压采集电路。直流电压采集要求:采集一个输出范围为20V-28V的Uo电压信号到0-3.3V的AD。设计思路:将20v到28v中的8v压差全部映射到0-3.3v的范围内,才内能更好的利用AD模块,所以首先将Uo与20V做差分,将电压抬低到0-8v(注:有时碍于仪放信号输入电压的范围较小会先分压再抬低见形式二),然后通过电阻分压将8v映射到3.3v的范围内。形式一:1、利用现有的电压产生20v
发表于 2023-02-03
单片机和RTOS的中断系统也就这么回事
摘要:操作系统实际上我们接触的很多,比如说windows,安卓、IOS、linux都是一种操作系统。单片机也有它自己的操作系统,叫做实时操作系统。那么这种实时操作系统和我们用的这些系统有什么区别呢?我们经常使用的这些实际上是非实时的操作系统。为什么说它是非实时的,因为它的内核实际上是对任务进行时间片轮转的调度方式。比如说有3个任务,分别是任务A,任务B和任务C。那么在时间片轮转的调度机制里,它会让任务A运行一断时间,然后切换到任务B,然后切换到任务C,这样子不断的轮转。两个任务间通过 Systick 轮转调度的简单模式那么这样有一个什么缺点呢?如果有一台自动驾驶的汽车里面任务C,是用来检测障碍物和躲避障碍物的,如果任务C不能得到及时
发表于 2023-02-03
单片机中常用的负电压是怎样产生的
负电压的产生电路图原理在电子电路中我们常常需要使用负电压,比如说我们在使用运放的时候常常需要建立一个负电压。下面就简单的以正5V电压到负电压5V为例说一下它的电路。通常需要使用负电压时一般会选择使用专用的负压产生芯片,但这些芯片都比较贵,比如ICL7600,LT1054等。差点忘了MC34063了,这个芯片使用的最多了,关于34063的负压产生电路这里不说了,在datasheet中有的。下面请看我们在单片机电子电路中常用的两种负电压产生电路。现在的单片机有很多都带有了PWM输出,在使用单片机的时候PWM很多时候是没有用到的,用它辅助产生负压是不错的选择。上面的电路是一个最简单的负压产生电路了。使用的原件是最少的了,只需要给它提供1k
发表于 2023-02-03
51单片机学习:外部中断1实验
实验名称:外部中断1实验接线说明:实验现象:下载程序后,当按下K4键可控制D1指示灯亮灭注意事项:***************************************************************************************/#include "reg52.h"typedef unsigned int u16; //对系统默认数据类型进行重定义typedef unsigned char u8;//定义LED1管脚sbit LED1=P2^0;//定义独立按键K4控制脚sbit KEY4=P3^3;/**********************************
发表于 2023-02-03
51单片机学习:定时器0实验
实验名称:定时器0实验接线说明:实验现象:下载程序后,D1指示灯间隔1s闪烁注意事项:***************************************************************************************/#include "reg52.h"typedef unsigned int u16; //对系统默认数据类型进行重定义typedef unsigned char u8;//定义LED1管脚sbit LED1=P2^0;/********************************************************************
发表于 2023-02-03

推荐帖子

现代通信系统电源设计
现代通信系统电源设计信设备使用的电源器件有很多种,从前端的功率因数校正(PFC)AC/DC电源到后端的高效DC/DC模块和负载点(POL)转换器,不一而足。从需要很高效率的中间总线转换器(IBC),到那些日趋细小轻巧的VoIP数字电话,以及要求多路紧密调节电压(7~13路输出)的数字用户线(xDSL)电源等,DC/DC电源在现代通信中获得了广泛应用。---中低功率应用(15~100W)通常使用低成本的单端正向或回扫拓扑结构来设计电源模块,而推挽式、半桥和全桥拓扑结构在功率更高的应用(100~1
破茧佼龙 电源技术
超级电容集成优化混合动力公交车动力总成
天然资源的枯竭、空气污染、交通堵塞和矿物燃料价格的上涨等等问题,迫使社会和个人寻求替代运输工具。这当中就有用于公交车和卡车的混合电力、氢气和基于燃料电池的动力系统,例如ISE(SanDiego,CA)从1996年以来所生产的那些。这些动力系统在整个汽车工业之所以受到欢迎,是因为它们提高了燃油效率,降低了有害排放。ISE公司专长于生产串联混合电力动力系统,其中的引擎完全与动力传动系统脱离,且仅仅被用于产生电力。图1。该类型混合架构对于执行大量“停走”驱动的大型车辆特别有吸引力,如市内
canglanghuang 汽车电子
将模拟电路数字化可减少芯片面积
因为模拟电路拒绝遵循摩尔定律,所以逻辑电路设计者正在采取相应措施以便充分利用CMOS工艺的优势。通过用数字电路取代模拟功能,即使数字电路比模拟版本使用更多的晶体管,你也能获得更可预测的性能,简化测试并减少芯片面积。这种模拟电路的数字化并非只是用数字信号处理器(DSP)来实现复杂的模拟功能。事实上,今天的一个大概念是将相对简单的模拟功能数字化。数字滞后电路是这种技术的一个极佳案例,因为它将不可能的客户要求转换成今天正在生产的低成本产品。按照传统的观念,模拟模块必须足够大才能获得合理的良品率
fighting 模拟电子
使用CCS 安装 C2000ware 并创建示例项目
一、CCS安装C2000WARE (一)下载C2000Ware_3_02_00_00_setup.exe 链接:https://pan.baidu.com/s/1BCzuNzCN_QBmvzJ1vDqISg 提取码:sh5m(二)加载C2000Ware到CCS 1.安装C2000Ware_3_02_00_00_setup.exe2.打开ResourceExplorer3.点击ALL右侧的添加 4.点击ADD,选择C2000文件夹 5.加载完成后下面就出现了c2000的
灞波儿奔 微控制器 MCU
DCAC控制电路
大家可以好好好看DCAC控制电路
longyi 工控电子
[10月DIY]编写个超简单的CPU
FPGA的处理能力固然强大,但在进行程序化的任务时,用状态机来实现有时就显得不如CPU写程序那么简洁。在FPGA里面也可以用逻辑来搭出简单的CPU,并固化一小段代码去实现特定的功能。考虑下最简单的CPU是什么样子呢? 最少,需要有读取程序(指令),并执行指令的过程。指令存放在一块内存当中,CPU每步取一条指令来执行,根据读出的指令内容,内部的状态发生转变——比如寄存器按指令要求进行运算,比如访问外部的端口(或总线)。指令是一个编码,描述这一步需要做的事情;执行指令的过程就是状态转移的过程。我实
cruelfox DIY/开源硬件专区
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved