(2) RAM资源划分实现
根据需要,我们可以分配应用程序和Bootloader程序各自具有自己的RAM空间。但因为程序的分开运行,也可以不做区分。存在例外:如软件切换的标志变量,如工具链传递参数的堆栈机制。即两套程序的这些例外地址空间应该一致。
因C变量编译后的变量增加了前缀“_”,因此即使通过__at(0x80)公用了0x80~0x8X,但unsigned char __at(0x080) STK00定义的结果变量是“_STK00”,不是函数传参的STK00变量。
因此需要汇编定义STKxx变量,Bootloader程序和应用程序程序需要将编译的库,即o文件链接到自身的项目中。这里命名对应stk.asm和stk.o。
RAM空间划分实现:项目下分别添加occupancy.txt。当设计分别具有的RAM空间时,实现举例:
假定256个RAM空间的2个分区的举例应用,0x80~0x8C为stk变量空间,0x180~0x18F为复用的同意义参数传递。
bootloader程序内容添加:
data 0x190 0x1FF :注释,空间占用,使不分配使用给bootloader程序,根据如上空间差异示例的gprx,分别将对应段的空间是否不使用给应用程序进行排除。
应用程序内容添加:
date 0x8D 0x0FF :注释,空间占用,使不分配使用该应用程序,如上说明。
举例中,针对0x180~0x18F空间,假定bootloader和应用程序复用,应该具有一样的意义【独立运行不需要各自分配空间除外】,空间均需要定义满变量,即显式地址分配。考虑单独编译关系分析不完整,复用变量需加volatile修饰。复用变量不做在stk库中,应该由各自的程序中建立并使用,如下示例。
volatile unsigned char __at(0x180) var1;
volatile unsigned int __at(0x181) var2;
volatile unsigned char __at(0x183) arr[13];
涉及到RAM的初始化问题,Bootloader过程赋值后调用User时,User的初始化程序会被调用执行完成该变量进行初始。因此在程序运行上运行逻辑需要做调整。
考虑不同RAM区域需要切区,我们建议公共STK变量和复用变量定义放置在BANK1区。Bootloader的专用变量放置在较后面的BANK区域。即尽量应用程序的变量在BANK0区和BANK1区,这样操作SFR时可减少切区的代码量,增加空间的使用效率。
另外需要说明的是,调试占用固定入口地址0x0E00的约255个地址的程序空间,同时占用0x0F3~0x0FF的RAM地址空间。调试建议在正常型号的开发下验证。针对该方案的设计不支持进行调试。 |