单片机_rom_ram,程序容量之迷
目录
引言
1.单片机中xdata 和data
2.单片机代码code大小
3.附录
(1)变量想放哪里放哪里大法
(2)函数一堆后缀
(3)__和不用__
(4)搜索小技巧
引言
单片机的内存有大小之分,内存大的相对较贵,如何选择大小,是个头疼问题,此文是自己在编程过程中遇到和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<xdata>,用他手册中的话是:逻辑在片外,物理上在片内的扩展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,程序容量之迷相关推荐
- lpc2000 filash utility 程序烧写工具_单片机烧录程序的次数
单片机是可编程器件,开发者把程序写好.编译完之后,需要烧录到单片机中,单片机才能按照开发者的逻辑去执行.在这个烧录的过程中需要用到专用的烧录工具.比如51单片机的USB/TTL.STM单片机的STli ...
- c51单片机烧录程序 控制台显示正在检测目标单片机
问题 c51单片机烧录程序 控制台显示正在检测目标单片机 详细问题 笔者使用单片机型号STC89C52, 进行程序烧录.控制台显示正在检测目标单片机 解决方案 将单片机型号由STC89C52更改为ST ...
- 单片机 解释型 c语言脚本,解释型单片机应用程序的研究.pdf
您所在位置:网站首页 > 海量文档  > 学术论文 > 自然科学论文 解释型单片机应用程序的研究.pdf5页 本文档一 ...
- 计算机行业中的烧写怎么翻译,单片机怎么烧录程序_单片机烧录程序步骤说明...
描述 单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU.随机存储器RAM.只读存储器ROM.多种I/O口和中断系统.定时器/ ...
- 51单片机C51程序
51单片机51单片机 C51程序 C51程序 学习C51程序之前需要对C语言有一定的了解和学习:这里只介绍与C语言有区别的地方: 具体的不同如下: 1.C51中增加了几种针对MSC-51单片机的特有数 ...
- c语言编写51单片机中断程序,执行过程是怎样的?
Q:c语言编写51单片机中断程序,执行过程是怎样的? 例如程序: #include<reg52.h> void main(void) { EA=1; //开放总中断 ...
- 24c512 c语言程序,24C32~24C512的51单片机读写程序
24C32~24C512的51单片机读写程序 来源:-- 作者:-- 浏览:3875 时间:2016-08-10 14:18 标签: 摘要: AT89S52 晶振频率为11.0592MHz 指令周期: ...
- 单片机的程序结束后都干嘛去了?
对于嵌入式系统,如果没有运行RTOS,那么程序开发中的主函数main()需要通过某种机制使其永远愉快的运行下去,它没有终点.如果想从main函数中退出,具体干什么是由所使用的C语言编译器决定的. 一. ...
- 机器人的灵魂(1)——单片机C程序开发
首先,就谈谈舵机的控制原理: 舵机有三根线,分别是电源正负极和信号线 .正负极接6V左右的直流电源,信号线则输出PWM脉冲, PWM的周期为20mm,宽度(高电平的时间)是从0.5ms--2.5 ...
- 台达触摸屏modbusRTU与51单片机通讯台达屏与郭天祥51单片机通讯程序
台达触摸屏modbusRTU与51单片机通讯台达屏与郭天祥51单片机通讯程序亲测过好用,P1口led显示8个位的状态上传给触摸屏,d2至d7为16数据寄存器能写能读,数码管显示当前写入的数码id=60 ...
最新文章
- Linux grep命令,正则表达式
- 数据中心智能安防新突破:腾讯觅踪亮相DCD
- 【学生选课系统经典】C#与SQLSERVER连接:ASP.NET网站(服务器端,IIS发布)
- 彻底搞懂 Java 中的注解 Annotation
- python 调用gpu算力_数据科学家需要算力,GPU 如何实现?-控制器/处理器-与非网...
- 前景看淡,移动医疗九成或将成炮灰
- 如何在传统 ASP 和 ASP.NET 之间共享会话状态
- 语法制导的翻译是如何实现的_考研寄宿:怎样提高英语翻译的能力?
- c#使用正则表达式获取TR中的多个TD_Linux之正则表达式
- 8. Andrénalin ★ Serial
- 【Qt编程】基于Qt的词典开发系列二--本地词典的设计
- 【C#】基础篇(3) C#实现串口助手,解决中文乱码
- 108.【RabbitsMQ】
- conceptdraw office(专业办公套件) v6.0.0附安装教程
- 一个网站SEO优化主管必须具备的能力
- windows 设备管理器中的设备控制
- 10 面阿里,7 面头条,6 个 offer, 你猜我进阿里没?
- 20個網頁抓取工具快速抓取網站
- WIN10 的windows media player 允许远程控制我的播放器勾选后不生效
- iPad投影到Windows电脑屏幕上的方法【亲测,均为免费软件,均可用,仅供学习使用】