Keil MDK4中的Data,Xdata,Code 及 Keil MDK5中的Code, RO-data , RW-data, ZI-data

 

一 、基础知识

字节  8位
半字  16位
字      32位

二、Keil MDK4中的Data,Xdata,Code

data 内部RAM
xdata 外部RAM
code Flash-程序的大小

 例如:51单片机256kb RAM 分为 128kb data 以及 128kb xdata。

存储类型与存储区关系(扩展):
                                 data       --->     可寻址片内ram
                                 bdata     --->     可位寻址的片内ram
                                 idata      --->     可寻址片内ram,允许访问全部内部ram
                                 pdata     --->       分页寻址片外ram 
                                 xdata     --->       可寻址片外ram 
                                 code      --->       程序存储区 

xdata bool  radio_busy;
uint8_t RF_Recv_Flag;
xdata uint8_t  tx_payload[60];
xdata uint8_t  rx_payload[60];
uint8_t RF_Recv_Flag;
uint16_t PipeAndLen;

Keil MDK4中的Data,Xdata,Code 及 Keil MDK5中的Code, RO-data , RW-data, ZI-data_第1张图片

编写这种RAM较小的芯片时,合理分配片内片外RAM空间,否则会出现内存出错。例如将代码改为如下:

xdata bool  radio_busy;
uint8_t RF_Recv_Flag;
 uint8_t  tx_payload[60];//更改
 uint8_t  rx_payload[60];//更改
uint8_t RF_Recv_Flag;
uint16_t PipeAndLen;

编译框为:(data数据段及内部RAM数据太大,超出芯片容量)

Keil MDK4中的Data,Xdata,Code 及 Keil MDK5中的Code, RO-data , RW-data, ZI-data_第2张图片

 

 编译框可了解程序RAM使用情况,以及程序大小。

 

二、Keil MDK5中的Code, RO-data , RW-data, ZI-data

Keil MDK4中的Data,Xdata,Code 及 Keil MDK5中的Code, RO-data , RW-data, ZI-data_第3张图片

(1) Code(inc.Data) : 包含两部分,即代码和数据

      Code,即程序代码部分!

(2) RO Data: read-only data,只读的数据。      

      RO是程序中的指令和常量,RO就是readonly。

(3) RW Data: read write data,可读写的数据。

      RW是程序中的已初始化变量,RW就是read/write。

(4) ZI Data: zero initialized data,零初始化的可读写变量。

      ZI是程序中的未初始化变量,ZI就是zero。

keil编译器默认是把你没有初始化的变量都赋值一个0。初始化为零,或者未初始化的变量,都存储于这个区域。

注意:养成良好的编程习惯,定义及赋初值。并不是所有的编程环境都会为未初始化的变量赋值0,有可能是指向未知位置的一个未知值,所带的BUG也是极难查出来的。

 

存储Size:

RO size: Code + RO_data

RW size: RW_data + ZI_data

ROM (minimum)size = Code + RO_data + RW_data (即烧/下载程序到FLASH/ROM时,所占用的最小空间)

Total ROM Size (Code + RO Data + RW Data)这样所写的程序占用的ROM的字节总数,也就是说程序所下载到ROM flash 中的大小。为什么Rom中还要存RW,因为掉电后RAM中所有数据都丢失了,每次上电RAM中的数据是被重新赋值的,每次这些固定的值就是存储在Rom中的,为什么不包含ZI段呢,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可。包含进去反而浪费存储空间。

RAM size: RW Data + ZI Data (即程序运行的时,RAM使用的空间)

以通过.map查看占用的flash和ram大小。

你可能感兴趣的:(实际开发经验,STM32,C语言)