首 页 » 程序开发 » IAR中固定变量位置

IAR中固定变量位置

[ 2014-08-29 20:35 | 浏览次数: 5,037次 | 1条评论 ]

 

首先为什么要固定变量位置呢,

1. 有时需要将一个程序的一部分变成可替换的, 比如语言包或者定制的一些功能是否开启.

当然在PC端一般直接就是把所有的语言包放在一起, 写个xml文件来开启或关闭定制功能.

但是嵌入式就麻烦些,首先是空间不够, 其次更新固件时是刷入整个程序,不包含配置文件等.

这就决定了语言包和定制的功能开关必须在固件里,也就是在程序里.

程序在link时所有东西的位置和大小都会固定, 在给各个语言或客户出固件时必须重新编译,使用不同的语言和开关.

要维护这么多固件很麻烦, 如果将语言和开关固定在某个位置, 主程序就只需要一个, 语言和开关编译成单独的一个包, 然后将这个包替换掉主程序中的语言和开关. 这样就减轻了维护多固件的麻烦.

2. 有时需要把一些信息放在固件的某个地方,比如版本信息, 这样升级程序或者bootload可以从固件中读取到升级固件的版本信息, 然后可以判断是否要升级.

下面以版本信息为例讲一下在IAR中如何将变量放置在固定位置

1. 首先需要把版本信息放在一个全局变量里,然后设置全局变量放在某个特殊节里

a) #define SPECIAL _SECTION _Pragma("location=\".special\"")

b) SPECIAL_SECTION __root const int major_version = 1;

c) SPECIAL _SECTION __root const int minor_version = 5;

其中_Pragma宏是IAR自己定义的,可以用来指定一些特殊指令,这里指定了指令是location=”.special”, 相当于:

#pragma location=”.special”

意思是后面的符号的位置放在一个名字叫”.special”的节里.

__root表示这个变量不管有没有被程序用到,都要包含在程序里. 如果不加,你又不用这个变量, 这个变量就会被优化掉.

2. 其次需要在link文件中指定”.special”节的地址

wps_clip_image-31368

先指定IAR使用某个link文件(即icf文件)

然后在link_file.icf中添加红色文字:

/*###ICF### Section handled by ICF editor, don’t touch! ****/

/*-Editor annotation file-*/

/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */

/*-Specials-*/

define symbol __ICFEDIT_intvec_start__ = 0×08000000;

/*-Memory Regions-*/

define symbol __ICFEDIT_region_ROM_start__ = 0×08000000;

define symbol __ICFEDIT_region_ROM_end__   = 0x0807FFFF;

define symbol __ICFEDIT_region_RAM_start__ = 0×20000000;

define symbol __ICFEDIT_region_RAM_end__   = 0x20007FFF;

define symbol __ICFEDIT_special_start__ = __ICFEDIT_intvec_start__+0×134;

/*-Sizes-*/

define symbol __ICFEDIT_size_cstack__   = 0×800;

define symbol __ICFEDIT_size_heap__     = 0×800;

/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;

define region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];

define region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };

define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize by copy { readwrite };

do not initialize  { section .noinit };

place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };

place at address mem:__ICFEDIT_special_start__ { readonly section .special };

place in ROM_region   { readonly };

place in RAM_region   { readwrite,

                        block CSTACK, block HEAP };

意思就是把”.special”节放在__ICFEDIT_special_start__位置, __ICFEDIT_special_start__位置在向量表之后(向量表大小是0×134)

这样那两个变量就放在了ROM中固定的0×08000134位置, 当然实际在固件文件中的位置是0×134,

注意:

固件需要编译成不带任何格式的二进制文件.

wps_clip_image-2090

您可以任意转载本文,但转载时请勿删除作者信息。
作者:hgyxbll,原文链接:http://shashanzhao.com/archives/1063.html
上一篇: | 下一篇:

沙发已经被占,赶紧抢板凳吧![点此发言]

  1. i’m able to find many good answers if i have any trouble!