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填充。
