STM32中FLASH变量的定位问题,IAR编译器
由于要在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.”
想到用定义一个段的方式来实现,又不知道怎样将这个段定位到这个地址,请教朋友们应该怎样写这几条语句?
你的IAR是什么版本的
可以参考中断向量表的方式来定位代码
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
难道这么干???
定义一个段,需要修改工程的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;
就可以了。
iar下可以直接用"@"定位
const uint32_t vSetRate_pre @ 0x0800FC00 = VOLT_SET_REF;
你可以试试
6楼,试过了,这个方法不管用,会出现以下错误:
Error[Be022]: location address not allowed for initialized variables (writable variables without the __no_init attribute)
5楼,起初我是不想动到ICF文件的,不过看起来这是最好的方法了。谢谢!
还有,非常讨厌每定义一个变量就得重新声明一次定位地址,
#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;
其实你没必要非得给这些变量在定义时赋初值,在程序开头初始化的时候赋初值就可以。先读一下这些位置,如果是0xffffffff就赋初值,如果不是0xffffffff,而是一个合理范围内的值,就说明已经被赋值或修改过了,不用赋值,直接往下运行就可以了。
这样还不用修改icf文件,定义绝对地址就行了。
我也考滤过这个方法,只是这样做看起来有点怪~~~~