7833|9

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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.”


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

最新回复

                                 我也考滤过这个方法,只是这样做看起来有点怪~~~~  详情 回复 发表于 2010-3-24 15:21
点赞 关注
 

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你的IAR是什么版本的
可以参考中断向量表的方式来定位代码
此帖出自stm32/stm8论坛
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
5.4的
你说的中断向量表是在哪个文件里?
此帖出自stm32/stm8论坛
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

4
 
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

难道这么干???
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

5
 
定义一个段,需要修改工程的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;
就可以了。
此帖出自stm32/stm8论坛
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

6
 
iar下可以直接用"@"定位
const uint32_t vSetRate_pre @ 0x0800FC00 = VOLT_SET_REF;
你可以试试
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

7
 
6楼,试过了,这个方法不管用,会出现以下错误:
Error[Be022]: location address not allowed for initialized variables (writable variables without the __no_init attribute)

5楼,起初我是不想动到ICF文件的,不过看起来这是最好的方法了。谢谢!
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

8
 
还有,非常讨厌每定义一个变量就得重新声明一次定位地址,
#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;
此帖出自stm32/stm8论坛
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

9
 
其实你没必要非得给这些变量在定义时赋初值,在程序开头初始化的时候赋初值就可以。先读一下这些位置,如果是0xffffffff就赋初值,如果不是0xffffffff,而是一个合理范围内的值,就说明已经被赋值或修改过了,不用赋值,直接往下运行就可以了。
这样还不用修改icf文件,定义绝对地址就行了。
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

10
 
                                 我也考滤过这个方法,只是这样做看起来有点怪~~~~
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表