你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

全局变量的初始值保存在flash的什么位置?

[复制链接]
a707083746 提问时间:2019-8-24 15:16 /
大家好,全局变量、静态变量的初始值保存在flash的什么位置,是否可以指定呢?
我用的编译器是KEIL4
收藏 评论12 发布时间:2019-8-24 15:16

举报

12个回答
哀歌与世无争 回答时间:2019-8-24 16:12:54
可以用 __attribute__ ((at())绝对定位来指定变量和常量编译后的地址,例如
  1. //变量地址定位到RAM地址0x02000F00
  2. __attribute__((at(0x02000F00)))u16 AtRAM[4]={0x0001,0x0002,0x0003,0x0004};
  3. //常量地址定位到ROM地址0x08000F00
  4. __attribute__((at(0x08000F00)))const u16 AtROM[4]={0x0001,0x0002,0x0003,0x0004};
复制代码

编译通过后双击工程文件夹,弹出.map文件

搜索一下,看是不是真的编译到指定的位置


最后再硬件调试,memory窗口查看一下就ok了

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

wenyangzeng 回答时间:2019-8-24 15:53:43
FLASH保存代码和常量,全局、静态变量只能保存在RAM中

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

tanic 回答时间:2019-8-24 16:31:21
您好,是保存在flash中,可以指定具体地址的,不过操作难度过高,不建议您这么做。可以试着用别的方案
zhao.zhao 回答时间:2019-8-24 17:52:09
全局变量的地址位于芯片内部的SRAM中,系统分配的,初始化值默认为0,不需要保存在FLASH。如果不是0,则值应该保存在FLASH中,位置不定,由编译连接的时候决定。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

zhao.zhao 回答时间:2019-8-24 18:18:32
如果要指定FLASH中的位置,你先要做个程序B,把FLASH的驱动写好,再在指定的地址写上初始化的值,还要地址足够大,保证不能被原先的程序冲掉。然后回到原先的程序A, 同样做FLASH的驱动,再在指定的地址读出上初始化的值
a707083746 回答时间:2019-8-24 19:26:45
wenyangzeng 发表于 2019-8-24 15:53
FLASH保存代码和常量,全局、静态变量只能保存在RAM中

非0初始值还是保存在flash里的,不然哪里来的初值?
a707083746 回答时间:2019-8-24 19:29:17
tanic 发表于 2019-8-24 16:31
您好,是保存在flash中,可以指定具体地址的,不过操作难度过高,不建议您这么做。可以试着用别的方案
...

哈哈,我放弃这个方案了。
原来是这些值出现在了我不想让它出现的地方,所以想指定位置。
现在用分散加载的方法间接解决了。
a707083746 回答时间:2019-8-24 19:30:04
zhao.zhao 发表于 2019-8-24 18:18
如果要指定FLASH中的位置,你先要做个程序B,把FLASH的驱动写好,再在指定的地址写上初始化的值,还要地址 ...

搞不定,放弃这个方案了
wenyangzeng 回答时间:2019-8-25 07:23:57
a707083746 发表于 2019-8-24 19:26
非0初始值还是保存在flash里的,不然哪里来的初值?

那个要赋值的“初值”是常量而非变量,是属于代码的一部分
废鱼 回答时间:2019-8-26 08:56:10
FLASH里面有,但是具体的位置没有查到资料。可以通过查看hex文件,搜索能查到保存的位置。位置是否改变不确定。RAM掉电不保存,那么复位以后如何恢复到原来的定义的值呢?复位以后,会从ROM中读取这些变量的初始值。
a707083746 回答时间:2019-8-26 15:07:29
安 发表于 2019-8-26 08:56
FLASH里面有,但是具体的位置没有查到资料。可以通过查看hex文件,搜索能查到保存的位置。位置是否改变不确 ...

hex文件太复杂了,头大。。。
废鱼 回答时间:2019-8-27 08:55:58
a707083746 发表于 2019-8-26 15:07
hex文件太复杂了,头大。。。

你可以写特定的内容,比图uint8_t a[8]="string!!",然后再查一下这个字符串的内容,就可以找到地址了。我试过,但是不知道他是怎么用的。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版