引言
单片机的内存有大小之分,内存大的相对较贵,如何选择大小,是个头疼问题,此文是自己在编程过程中遇到和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 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)搜索小技巧
上一篇:单片机_stc单片机eeprom 学习笔记
下一篇:单片机_LCD12864显示自己制作的图片(时钟为例)
推荐阅读最新更新时间:2024-11-13 09:49
推荐帖子
- 适合于初学单片机的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
设计资源 培训 开发板 精华推荐
- SX1508 全球最低电压电平转换 GPIO 的典型应用,带 LED 驱动器和键盘引擎
- 使用 ADuC7060/ADuC7061 精密模拟微控制器的 4 至 20mA 环路供电温度监视器
- MIC69153YML EV,用于工业用 0.5V、1.5V、1.8V、2.5V、3.3V DC 到 DC 单路输出电源的评估板
- 用于双极型 LTC1094、ADC 转换器的单电源 RS-232 接口
- 梁山派游戏机毫无颜值版
- AD5342 并行接口、双电压输出、12 位 DAC 的典型应用
- DC1945A,使用 LTC2185、16 位、125 Msps 双路模数转换器的演示板
- 适用于 USB 主机应用的 MIC2544A-2YM 可编程限流高端开关的典型应用
- 使用 Analog Devices 的 AD815 的参考设计
- gd32智能小车