平台
协议 TI ZStack-2.5.1a
CC2530
存储简介
单片机的存储器分为数据存储器(RAM)和程序存储器(ROM/FLASH):
存储分类
RAM
用来存取各种动态的输入输出数据,中间计算结果以及与外部存储器交换的数据和暂存数据。设备掉电后,数据就会丢失。
静态 RAM(SRAM)
速度非常快,是目前读写最快的存储设备。
动态 RAM(DRAM)
保留数据时间短,但速度比 ROM 快,计算机内存多为DRAM。DRAM 包括:EDORAM;DDR RAM;RDRAM;SGRAM;WRAM…
ROM
通常用来固化存储一些用户写入程序或数据,用于启动设备和控制设备工作方式。设备掉电后可保存数据。
PROM
可编程,一次性
EPROM
可擦除可编程,通过紫外线擦除
EEPROM
擦除可编程,通过电子擦除
FLASH
通常也是用来固化存储一些用户写入程序或数据。设备掉电后不会丢失数据,同时可以快速读取数据。U 盘、MP3 多用这种存储器。
NOR FLASH
NAND FLASH
单片机存储类型与存储区关系
类型 | 存储区 |
---|---|
data | 可寻址片内 ram |
bdata | 可位寻址的片内 ram |
idata | 可寻址片内 ram,允许访问全部内部 ram |
pdata | 分页寻址片外 ram (MOVX @R0) (256 BYTE/页) |
xdata | 可寻址片外 ram (64k 地址范围 FFFFH) |
code | 程序存储区 (64k 地址范围),对应 MOVC @DPTR |
C 语言程序占用的内存
栈区(stack)
由编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构中的栈。
堆区(heap)
一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统回收。
全局区(静态区)
全局变量和静态变量的存储位置是在一起的。初始化的全局变量和静态变量在同一块区 域,而未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统自动释放。
文字常量区
这一区域用于存放常量字符串,程序结束后由系统释放。
程序代码区
这一区域用于存放函数体的二进制代码(ROM/FLASH)。
例子
int a = 0; //全局初始化区
char *p1; //全局未初始化区
main()
{
int b; //栈
char s[ ] = "abc"; //栈
char *p2; //栈
char *p3 = "123456"; //123456\0 在常量区,p3 在栈上。
static int c =0; //全局(静态)初始化区
//分配得来得 10 和 20 字节的区域就在堆区。
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
}
strcpy(p1, "123456"); //123456\0 放在常量区,编译器可能会将它与 p3 所指向
的"123456"优化成一个地方。
变量的存储类型和存储方式
存储类型
auto 自动变量
static 静态变量
register 寄存器变量
extern 外部变量(全局变量)
存储方式
静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。
静态存储
变量通常是在变量定义时就分配一定的存储空间并一直保持不变,直至整个程序结束。
动态存储
变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。
全局变量
作用域为整个源程序,即所有源文件;
静态变量
静态全局变量
作用域为定义该变量的源文件;
把全局变量改变为静态全局变量后改变了它的作用域,而生存期不变;
局部变量:生存期为定义它的函数或复合语句;
静态局部变量:生存期为整个源程序;
把局部变量改变为静态局部变量后改变了它的生存期,而作用域不变
8051 CPU四个不同存储空间
CODE
一个只读的存储空间,用于程序存储。这一存储空间地址是 64KB。
DATA
一个读/写的数据存储空间,可以直接或间接被一个单周期 CPU 指令访问。这一存储空间地址是 256字节。DATA 存储空间较低的 128 字节可以直接或间接寻址,较高的 128 字节只能间接寻址。
XDATA
一个读/写的数据存储空间,通常需要 4-5 个 CPU 指令周期来访问。这一存储空间地址是 64KB。而且访问 XDATA 存储器慢于访问 DATA,因为 CODE 和 XDATA 存储空间共享 CPU 内核上的一个通用总线,因此来自 CODE 的指令预取可以不必和 XDATA 访问并行执行。
SFR
一个读/写的寄存器存储空间,可以直接被一个 CPU 指令访问。这一存储空间含有 128 字节。对于地址是被 8 整除的 SFR 寄存器,每一位还可以单独寻址。
查 IAR 编译信息和程序大小
设置
IAR 的菜单栏 -->Tools -->IDE Options -->Messages -->Show build messages 选择 ALL
设置完后 IAR 点 MAKE,没有 error 的话最后会在 Message 框显示代码的大小(菜单栏–>View–>Maessge–>Build)
编译信息
1、 下面什么意思
4 960 bytes of CODE memory
4 150 bytes of DATA memory
44 bytes of CONST memory
4 960 个字节的代码(占 FLASH)
4150 个字节的变量数据(占 RAM)
44 个字节的常量数据(占 FLASH)
生成 bin 文件的大小= 4960+44
1、
9 486 bytes of CODE memory
404 bytes of DATA memory (+ 36 absolute )
520 bytes of CONST memory
1、的括号内表示内存的绝对使用量,对应你设的全局变量大小
2、表示共享的存储空间,和单片机的结构有关