引言
单片机的内存有大小之分,内存大的相对较贵,如何选择大小,是个头疼问题,此文是自己在编程过程中遇到和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显示自己制作的图片(时钟为例)
推荐阅读
推荐帖子
- 现代通信系统电源设计
- 现代通信系统电源设计信设备使用的电源器件有很多种,从前端的功率因数校正(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/开源硬件专区
设计资源 培训 开发板 精华推荐
最新视频课程更多
- 【TI 教室】学电源,晒成绩,挖楼有礼!
- EEWorld加磅双重礼 ELEXCON深圳国际电子展诚邀您参加
- 2020-2021年安森美和安富利物联网创新设计大赛
- ADI有奖下载活动之6 ADI基于IEC61850的智能电子设备(IED)系统解决方案
- 预约有奖直播:享受纯净 ams主动降噪与接近传感带来耳机设计新境界
- 免费申请英飞凌FMCW雷达解决方案Position2Go,角度,距离,速度,运动方向检测一板搞定!
- 学习有礼,分享也有礼!跟着小梅哥,一起intel SoC FPGA走起!
- 《美光2022台北国际电脑展主题演讲精选:数据中心专辑》,关注、评论赢固态硬盘等好礼!
- 动手学电源第一季:DIY 小风扇,Fan一夏!