7.11日工作总结关于FLASH区、DATA区、CODE区学习经验分享
今天继续做BOOTLOAD相关工作,准备实现两个板子通信,把一块板子的FLASH空间里的数据传递给另一块板子实现IAP远程升级,该板子由WIFI模组下载程序升级,这样便可以实现两块板子均能远程升级。
遇到了KEIL5中的相关表达,便上网查询了资料,了解了“at”的用法,即绝对地址,可以定义变量保存在DATA区或XDATA区的绝对物理地址处(单片机空间分配看.M51文件,ARM,DSP空间分配看.map文件),如:
unsigned char xdata number _at_ 0x1000;
main(){ number=0x11; }
定义了number变量在xdata区的0x1000处,可以通过keil的软件仿真查看memory的0x1000处正好是0x11,注意此处的定义不可以直接赋值,且_at_不可以在main函数中使用,若需要在定义处赋值则需要使用另一种方法。如
新建一个文件Initvar.c
unsigned char xdata number=0x11;
然后将该文件加入工程编译,打开M51文件查看变量名
X D A T A M E M O R Y
XDATA xxxxH xxxxH UNIT ?XD?INITVAR
然后在option设置BL51Locate中Xdata中填入?XD?INITVAR(0x1000),再次编译即可。若是code、data、idata型变量也如此,code区在BL51Locate中的code区域填写?CO?大写文件名
代码定位如code变量定位,只是名字不一样去M51文件找到相同文件名即可,如创建MAIN.c文件在其中定义一个fun函数
fun(){ char number; number=0x11; }
然后在option设置BL51Locate中code中填入?PR?FUNC?MAIN(0xXXXX),再次编译即可.位置如图
从上至下,依次介绍各个用法,
Code Range:设置Code代码在FLASH处的开始和终止位置。
Xdata Range:设置Xdata在外部RAM中的开始和终止位置。
Code:设置函数在FLASH区的开始位置。
XDATA:设置Xdata在外部RAM区的开始的位置。
注意,RAM区、外部RAM区和FLASH区不是一个存储位置。RAM区存储data和idata数据,外部RAM存储Xdata数据,code存储在FLAHS区读取数据慢,适合数据量大不更改的数据类型
data: 内部RAM低128字节,响应速度最快,采用直接寻址方式
idata: 内部RAM全256字节,采用间接寻址方式,速度相对较慢
bdata:片内RAM,位寻址方式
xdata:外部扩展RAM,采用DPTR(data pointer数据指针访问,以16个二进制位为一个基础位,也就是两个字节为一个访问位)访问
pdata:外部扩展RAM低256字节,分页寻址(一页256byte)
code:程序存储区,一般是内容较多且不需要修改的数据。
如图:
** 在IAP操作中,复位会将idata区的数据清零,但是Xdata区的不会,故可以使用Xdata区存储一些数据,实现APP区和BOOT区的数据传递。**