本章是前面介绍OAD中的查漏补缺。
本节介绍如何将标准的SDK连接器命令文件转化成符合OAD的连接器命令文件,下面以cc26xx_app_and_stack.icf为例。
分配元数据向量和应用程序起点内存。
我们期望flash范围是应用程序和协议栈代码和数据。
替换:
// Code and RO Data
place in FLASH_ALL { readonly };
为:
// Code and RO Data
place in FLASH { readonly };
然后重定义flash从OAD_FLASH_START到FLASH_END。这将会占用30页。OAD_FLASH_START代表应用程序/协议栈开始的代码。
define region FLASH = mem:[from OAD_FLASH_START to FLASH_END];
然后定义OAD元数据宏
// OAD specific
define symbol OAD_HDR_SIZE = 16; // Size of metadata vector
define symbol OAD_HDR_START = FLASH_START;
define symbol OAD_HDR_END = OAD_HDR_START + OAD_HDR_SIZE - 1;
最后定义OAD_FLASH_START,元数据向量和中断表计算。
define symbol INT_VEC_SIZE = 64;
define symbol INT_VEC_START = OAD_HDR_START + OAD_HDR_SIZE;
define symbol INT_VEC_END = INT_VEC_START + INT_VEC_SIZE - 1;
然后根据定义的符号来定义范围:
define region INT_VEC = mem:[from INT_VEC_START to INT_VEC_END];
最后,对于内存放置,需要添加以下内容,以便中断向量表部分正确地放置:
// Interrupt Vector Table
place at start of INT_VEC { readonly section .intvec };
keep { readonly section .intvec };
保留第31页(BIM+CCFGs)
因为工程不应该编译ccfg_app_ble.c文件,因此这里不应该进行链接,移除下面这两行命令:
// CCFG
place at end of FLASH_LAST_PAGE { readonly section .ccfg };
keep { section .ccfg };
CCFGs应该由BIM编译链接。该步骤确保第31页不被用户使用。
通常,不应该改变协议栈大小,但是如果需要可以根据OAD配置类型,在项目中对协议栈大小进行更改。
只有APP+Stack可以更改,Library OAD是不可更改协议栈配置。使得入口点总是与页面开头处的相同地址。强制链接器进行页面对齐,只需PAGE_ALIGN=1在堆栈项目中添加链接器定义。
在只进行协议栈OAD的配置情况下,协议栈OAD可以进行页面对齐,只要入口点相同,应用程序即可正常运行。
OAD_Image_Tool可以生成元数据向量并将其插入到给定的镜像中,以产生OAD就绪镜像文件,OAD就绪镜像文件可以是hex文件或者一个包含target中断的元数据的bin文件。
OAD_Image_Tool是一个使用Python编写的工具,在Tools文件夹里面可以找到。
可以在IAR中的Post_build中使用,例如添加./oad_image_tool.exe -t offchip -o out.hex -m 0x0000 -i app in.hex。
该out.hex文件将是具有元数据的OAD就绪镜像,以告知OAD Target它是片外OAD的应用程序镜像。
下图显示了如何编辑OAD镜像工具的IAR后期制作步骤。可以通过右键单击项目->选项来访问此菜单。
$TOOLS_BLE_DIR$\oad\oad_image_tool.exe $PROJ_DIR$\FlashROM_OAD_Offchip\Exe\$TARGET_BNAME$.hex -t offchip -i app --imgVer 0 -ob $PROJ_DIR$\FlashROM_OAD_Offchip\Exe\$TARGET_BNAME$.bin -m 0x0000 --r 0x0000
这句命令编译后运行oad_image_tool.exe生成对应的bin和hex文件。
IAR可以设置预编译命令行,如图所示,你可能需要改变OAD_IMG_E=1为OAD_IMG_A=或OAD_IMG_B=1,根据你的使用情况。
当OAD升级完成之后,我们需要检查是否成功进行了OAD升级,一个最简单的方法就是在生成升级镜像文件的时候将设备名称修改了。这样,当OAD升级成功之后,扫描设备可以比较设备名称判断是否成功进行了OAD升级。
注意:如果你改变了设备名,并且设备名长度发生了变化,对应第4行应该修改。
tip:
BTool是一个功能非常丰富的应用程序。本指南仅用于记录BTool的OAD功能。
BTool需要CC2640R2开发板运行host_test应用程序,下面列出CC2640R2 launchPad使用BTool步骤:
文章所有代码、工具、文档开源。加入我们QQ群 591679055获取更多支持,共同研究CC2640R2F&BLE5.0。