STM32中FLASH变量的定位问题,IAR编译器

woshijingshui   2010-3-23 15:29 楼主
由于要在FLASH最后一页中放几个变量,以后程序运行过程中会修改这页的变量。本来打算直接变量定位:#define LAST_PAGE
0x0800FC00
// STM32F101x8

#pragma location = LAST_PAGE
const uint32_t vSetRate_pre = VOLT_SET_REF;
const uint32_t vRdRate_pre = VOLT_RD_REF;

可是发现用#pragma location定位后不能对变量初始化---“The variable must be declared either __no_init or const.”


想到用定义一个段的方式来实现,又不知道怎样将这个段定位到这个地址,请教朋友们应该怎样写这几条语句?

回复评论 (9)

你的IAR是什么版本的
可以参考中断向量表的方式来定位代码
点赞  2010-3-23 16:50
5.4的
你说的中断向量表是在哪个文件里?
点赞  2010-3-24 09:04
startup_stm32f10x_ld.s

__vector_table
        DCD     sfe(CSTACK)
        DCD     __iar_program_start

        DCD     NMI_Handler               ; NMI Handler
        DCD     HardFault_Handler         ; Hard Fault Handler
        DCD     MemManage_Handler         ; MPU Fault Handler
        DCD     BusFault_Handler          ; Bus Fault Handler
        DCD     UsageFault_Handler        ; Usage Fault Handler
        DCD     0                         ; Reserved
        DCD     0                         ; Reserved
        DCD     0                         ; Reserved
        DCD     0                         ; Reserved
        DCD     SVC_Handler               ; SVCall Handler
        DCD     DebugMon_Handler          ; Debug Monitor Handler
        DCD     0                         ; Reserved
        DCD     PendSV_Handler            ; PendSV Handler
        DCD     SysTick_Handler           ; SysTick Handler

难道这么干???
点赞  2010-3-24 09:14
定义一个段,需要修改工程的icf文件,在工程指定的icf文件末尾加入如下内容:
define region MyOwnRegion = mem:[from 0x0800FC00 size 0x400];  //定义一个区域
place in MyOwnRegion {section LastPage};        //把段LastPage 放入区域MyOwnRegion

然后在工程的C文件中:
#pragma location="LastPage"
const uint32_t vSetRate_pre = VOLT_SET_REF;
#pragma location="LastPage"
const uint32_t vRdRate_pre = VOLT_RD_REF;
就可以了。
点赞  2010-3-24 11:42
iar下可以直接用"@"定位
const uint32_t vSetRate_pre @ 0x0800FC00 = VOLT_SET_REF;
你可以试试
点赞  2010-3-24 12:03
6楼,试过了,这个方法不管用,会出现以下错误:
Error[Be022]: location address not allowed for initialized variables (writable variables without the __no_init attribute)

5楼,起初我是不想动到ICF文件的,不过看起来这是最好的方法了。谢谢!
点赞  2010-3-24 13:54
还有,非常讨厌每定义一个变量就得重新声明一次定位地址,
#pragma location="LastPage"    // 这行只对下一行的变量定位有效
const uint32_t vSetRate_pre = VOLT_SET_REF;     // 这个变量在LastPage里
const uint32_t vRdRate_pre = VOLT_RD_REF;    // 这个变量不在LastPage里

非得这么整:
#pragma location="LastPage"
const uint32_t vSetRate_pre = VOLT_SET_REF;
#pragma location="LastPage"    // 少一行都不行,日
const uint32_t vRdRate_pre = VOLT_RD_REF;
点赞  2010-3-24 14:11
其实你没必要非得给这些变量在定义时赋初值,在程序开头初始化的时候赋初值就可以。先读一下这些位置,如果是0xffffffff就赋初值,如果不是0xffffffff,而是一个合理范围内的值,就说明已经被赋值或修改过了,不用赋值,直接往下运行就可以了。
这样还不用修改icf文件,定义绝对地址就行了。
点赞  2010-3-24 14:24
                                 我也考滤过这个方法,只是这样做看起来有点怪~~~~
点赞  2010-3-24 15:21
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复