全局变量的初始值保存在flash的什么位置?
9322
12个回答
哀歌与世无争
回答时间:2019-8-24 16:12:54
a0a.1 32b0c
可以用 __attribute__ ((at())绝对定位来指定变量和常量编译后的地址,例如
//变量地址定位到RAM地址0x02000F00
__attribute__((at(0x02000F00)))u16 AtRAM[4]={0x0001,0x0002,0x0003,0x0004};
//常量地址定位到ROM地址0x08000F00
__attribute__((at(0x08000F00)))const u16 AtROM[4]={0x0001,0x0002,0x0003,0x0004};复制代码
编译通过后双击工程文件夹,弹出.map文件
搜索一下,看是不是真的编译到指定的位置
最后再硬件调试,memory窗口查看一下就ok了
评分
参与人数 1蝴蝶豆 +2
收起
理由
STMCU
+ 2
查看全部评分
赞
1
评论
回复
支持 1
反对 0
wenyangzeng
回答时间:2019-8-24 15:53:43
a0a.1 32b0c
FLASH保存代码和常量,全局、静态变量只能保存在RAM中
评分
参与人数 1蝴蝶豆 +2
收起
理由
STMCU
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
tanic
回答时间:2019-8-24 16:31:21
a0a.1 32b0c
您好,是保存在flash中,可以指定具体地址的,不过操作难度过高,不建议您这么做。可以试着用别的方案
赞
0
评论
回复
支持
反对
zhao.zhao
回答时间:2019-8-24 17:52:09
a0a.1 32b0c
全局变量的地址位于芯片内部的SRAM中,系统分配的,初始化值默认为0,不需要保存在FLASH。如果不是0,则值应该保存在FLASH中,位置不定,由编译连接的时候决定。
评分
参与人数 1蝴蝶豆 +2
收起
理由
STMCU
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
zhao.zhao
回答时间:2019-8-24 18:18:32
a0a.1 32b0c
如果要指定FLASH中的位置,你先要做个程序B,把FLASH的驱动写好,再在指定的地址写上初始化的值,还要地址足够大,保证不能被原先的程序冲掉。然后回到原先的程序A, 同样做FLASH的驱动,再在指定的地址读出上初始化的值
赞
0
评论
回复
支持
反对
a707083746
回答时间:2019-8-24 19:26:45
a0a.1 32b0c
wenyangzeng 发表于 2019-8-24 15:53
FLASH保存代码和常量,全局、静态变量只能保存在RAM中
非0初始值还是保存在flash里的,不然哪里来的初值?
赞
0
评论
回复
支持
反对
a707083746
回答时间:2019-8-24 19:29:17
a0a.1 32b0c
tanic 发表于 2019-8-24 16:31
您好,是保存在flash中,可以指定具体地址的,不过操作难度过高,不建议您这么做。可以试着用别的方案
...
哈哈,我放弃这个方案了。
原来是这些值出现在了我不想让它出现的地方,所以想指定位置。
现在用分散加载的方法间接解决了。
赞
0
评论
回复
支持
反对
a707083746
回答时间:2019-8-24 19:30:04
a0a.1 32b0c
zhao.zhao 发表于 2019-8-24 18:18
如果要指定FLASH中的位置,你先要做个程序B,把FLASH的驱动写好,再在指定的地址写上初始化的值,还要地址 ...
搞不定,放弃这个方案了
赞
0
评论
回复
支持
反对
wenyangzeng
回答时间:2019-8-25 07:23:57
a0a.1 32b0c
a707083746 发表于 2019-8-24 19:26
非0初始值还是保存在flash里的,不然哪里来的初值?
那个要赋值的“初值”是常量而非变量,是属于代码的一部分
赞
0
评论
回复
支持
反对
废鱼
回答时间:2019-8-26 08:56:10
a0a.1 32b0c
FLASH里面有,但是具体的位置没有查到资料。可以通过查看hex文件,搜索能查到保存的位置。位置是否改变不确定。RAM掉电不保存,那么复位以后如何恢复到原来的定义的值呢?复位以后,会从ROM中读取这些变量的初始值。
赞
0
评论
回复
支持
反对
a707083746
回答时间:2019-8-26 15:07:29
a0a.1 32b0c
安 发表于 2019-8-26 08:56
FLASH里面有,但是具体的位置没有查到资料。可以通过查看hex文件,搜索能查到保存的位置。位置是否改变不确 ...
hex文件太复杂了,头大。。。
赞
0
评论
回复
支持
反对
废鱼
回答时间:2019-8-27 08:55:58
a0a.1 32b0c
a707083746 发表于 2019-8-26 15:07
hex文件太复杂了,头大。。。
你可以写特定的内容,比图uint8_t a[8]="string!!",然后再查一下这个字符串的内容,就可以找到地址了。我试过,但是不知道他是怎么用的。
评分
参与人数 1蝴蝶豆 +2
收起
理由
STMCU
+ 2
查看全部评分
赞
0
评论
回复
支持
反对