IAR 在使用#pragma命令时,编译出来的hex文件,没有收到命令控制
时间:10-02
整理:3721RD
点击:
在.c文件中添加
#pragma location="IMAGE_VERSION"
const CODE uint32 _imageVersion = 0x17053155;
#pragma required=_imageVersion
在xcl文件中添加
-Z(CODE)IMAGE_VERSION=0x4800-0x4803
但是在编译出来的hex文件中
:1047F30045B30E6F001245B3916F001245B36B685A
:10480300001245B32169001245B36369001245B331
在4800 - 4803 没有出现我定义的内容
我用IAR 版本是8.20 。
编译的时候在#pragma required=_imageVersion 这一句这里有个警告说
Warning[Pe609]: this kind of pragma may not be used here C:\Users\Administrator\Desktop\app\boot\source\sb_main.c 26
这个为什么不能用 获取有可能就是这个警告引起的
不是很懂,不过看你做法跟别人的略有不同
http://yihuoyubing.lofter.com/
查看这个人的博客文章
(5)升级文件首部填充 #pragma location="IMAGE_HEADER" const __code img_hdr_t _imgHdr = { 0xFFFF, OAD_IMG_VER( OAD_IMAGE_VERSION ), OAD_IMG_R_AREA * OAD_FLASH_PAGE_MULT, #if defined HAL_IMAGE_A OAD_IMAGE_A_USER_ID, #else OAD_IMAGE_B_USER_ID, #endif { 0xFF, 0xFF, 0xFF, 0xFF } }; 第一句的#pragma location="IMAGE_HEADER"将这个首部布局在在链接文件所指定的IAMGE_HEADER空间。 首部的crc1成员的值必须为0xFFFF,因为这个值是在BIM代码中计算的。 首部的ver成员的值根据是ImageA还是ImageB而有所不同,如下: #if defined (HAL_IMAGE_A) #define OAD_IMG_VER( ver ) ( (uint16)( (ver) << 0x01 ) ) #else #define OAD_IMG_VER( ver ) ( (uint16)( ( (ver) << 0x01 ) | 0x01 ) ) #endif 简单来说,凡是奇版本的升级文件都是ImageA生成的,凡而偶版本的升级文件都是ImageB生成的。ver的实际版本号只使用高15位,而最低的一位用来区分ImageA与ImageB. 首部的uid[4]的根据ImageA还是ImageB而不同,用4个"A"表示为ImageA,用4个"B"表示为ImageB。 首部的res[4]则全部0xFF填充。