单片机_rom_ram,程序容量之迷

目录

引言

1.单片机中xdata 和data

2.单片机代码code大小

3.附录

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

(2)函数一堆后缀

(3)__和不用__

(4)搜索小技巧


引言

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

1.单片机中xdata 和data

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

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

单片机_rom_ram,程序容量之迷_第1张图片

                                                    图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 ,编译代码的差异。

单片机_rom_ram,程序容量之迷_第2张图片

                                                                                        图3

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

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

单片机_rom_ram,程序容量之迷_第3张图片

                                                                      图4

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

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

单片机_rom_ram,程序容量之迷_第4张图片

                                                                  图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,到底是哪个鬼?

单片机_rom_ram,程序容量之迷_第5张图片

                                                               图6

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

单片机_rom_ram,程序容量之迷_第6张图片

                                                                                                     图7

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

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

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

单片机_rom_ram,程序容量之迷_第7张图片

                                                                               图8

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

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

单片机_rom_ram,程序容量之迷_第8张图片

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

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

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

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

以上内容参考来自:

(1)stc15.pdf

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

3.附录

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

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

单片机_rom_ram,程序容量之迷_第9张图片

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

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

单片机_rom_ram,程序容量之迷_第10张图片

(2)函数一堆后缀

单片机_rom_ram,程序容量之迷_第11张图片

比如

单片机_rom_ram,程序容量之迷_第12张图片

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

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

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

(3)__和不用__

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

(4)搜索小技巧

单片机_rom_ram,程序容量之迷_第13张图片

你可能感兴趣的:(51单片机)