硬件平台:JN5168(周立功ZM5168P2模块)
开发IDE:JN-SW-4041-SDK-Toolchain-v1.1
协议栈:JN-SW-4064-ZigBee-SmartEnergy1.x-v993
应用层:JN-AN-1135-Smart-Energy-HAN-Solutions 4v2
在项目中用到了ZSE协议栈,由于每个jn5168模块需要使用不同的installation code,大量生产时又不可能每个模块都先编译一次再烧写,所以最好的办法是在生产时用一个公版固件,烧写前替换公版固件里的installation code生成一个新的固件然后烧进去。
替换installation code就需要它在固件里的存放位置是固定的,如果只是定义一个全局数组来存放installation code那么每次代码编译链接地址就有可能发生改变,这样每次都需要确定installation code在固件里的地址才能进行替换,比较麻烦而且容易出错。解决办法就是定义一个固定的段来存储installation code,这样无论代码进行怎样的改动编译,installation code在固件里的位置都不会改变。
使用固定段两种方法:
方法一:我们自己定义一个名为ro_install的段
1. 在任意源文件中定义:
PUBLIC uint8 installation_code[8] __attribute__ ((section (".ro_install"))) = {
//installation_code 数组对应.ro_install这个段
0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb};
2. 修改makefile在 -j .ro_se_cert 后面添加 -j .ro_install 有两处
3. 修改D:\project\Jennic\Stack\SE\Build\AppBuildSEZBProDep_JN5168.ld 在
/* start location 0x54 */
.ro_mac_address (ALIGN((. - _enc_offset), 16) + _enc_offset):
{
_FlsMACAddress = ABSOLUTE(.);
*(.ro_mac_address) /* Mac Address 8 bytes*/
. = ALIGN (0x10);
} > flash
之后添加
.ro_install (ALIGN((. - _enc_offset), 16) + _enc_offset):
{
_FlsMACAddress = ABSOLUTE(.);
*(.ro_install) /* installation code 8 bytes*/
. = ALIGN (0x10);
} > flash
方法二:使用协议栈已经定义好的段
由于协议栈没有使用.ro_se_customData这个段,所以我们可以用它来存放install code在任意源文件中定义:
PUBLIC uint8 installation_code[] __attribute__ ((section (".ro_se_customData"))) = {
0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb
};
在程序的其它地方就可以通过installation_code这个数组来使用。定义好之后编译工程,然后通过ultraEdit等16进制编辑器打开生成的bin文件然后搜索aa ff ff ff ff ff ff bb就得到了installation code在固件中的地址然后替换它就可以了。
在生产时可以在治具上位机系统上写程序打开存储installation code的文件,读出一个替换一次公版固件然后再烧写,这样就可以自动替换烧写。