查看: 3947|回复: 12
[已解决]
全局变量的初始值保存在flash的什么位置?
[复制链接]
a707083746
a707083746
当前离线
在线时间158 小时
UID415068
ST金币871
蝴蝶豆7
注册时间2010-1-16
该用户从未签到
18
主题142
帖子7
蝴蝶豆
金牌会员
金牌会员, 积分 2154, 距离下一级还需 2846 积分
最后登录2024-3-5
发消息
电梯直达
楼主
发表于 2019-8-24 15:16:23
|
只看该作者
|倒序浏览
|阅读模式
大家好,全局变量、静态变量的初始值保存在flash的什么位置,是否可以指定呢?
我用的编译器是KEIL4
收藏0
淘帖0
支持0
反对0
回复
使用道具
举报
哀歌与世无争
哀歌与世无争
当前离线
在线时间60 小时
UID3402056
ST金币275
蝴蝶豆20
注册时间2017-7-12
该用户从未签到
3
主题77
帖子20
蝴蝶豆
高级会员
高级会员, 积分 788, 距离下一级还需 212 积分
最后登录2021-1-14
发消息
推荐
发表于 2019-8-24 16:12:54
|
只看该作者
可以用 __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
反对 0
使用道具
举报
wenyangzeng
wenyangzeng
当前离线
在线时间1885 小时
UID45393
ST金币4016
蝴蝶豆82
注册时间2008-5-4
该用户从未签到
74
主题3420
帖子82
蝴蝶豆
社区小助手
最后登录2024-7-7
发消息
板凳
发表于 2019-8-24 15:53:43
|
只看该作者
FLASH保存代码和常量,全局、静态变量只能保存在RAM中
评分
参与人数 1蝴蝶豆 +2
收起
理由
STMCU
+ 2
查看全部评分
回复
支持
反对
使用道具
举报
tanic
tanic
当前离线
在线时间229 小时
UID3231476
ST金币447
蝴蝶豆163
注册时间2015-12-15
该用户从未签到
44
主题647
帖子163
蝴蝶豆
金牌会员
金牌会员, 积分 3609, 距离下一级还需 1391 积分
最后登录2021-4-25
发消息
地板
发表于 2019-8-24 16:31:21
|
只看该作者
您好,是保存在flash中,可以指定具体地址的,不过操作难度过高,不建议您这么做。可以试着用别的方案
回复
支持
反对
使用道具
举报
zhao.zhao
zhao.zhao
当前离线
在线时间357 小时
UID3258526
ST金币2804
蝴蝶豆176
注册时间2016-4-6
该用户从未签到
3
主题971
帖子176
蝴蝶豆
论坛元老
最后登录2021-4-1
发消息
5#
发表于 2019-8-24 17:52:09
|
只看该作者
全局变量的地址位于芯片内部的SRAM中,系统分配的,初始化值默认为0,不需要保存在FLASH。如果不是0,则值应该保存在FLASH中,位置不定,由编译连接的时候决定。
评分
参与人数 1蝴蝶豆 +2
收起
理由
STMCU
+ 2
查看全部评分
回复
支持
反对
使用道具
举报
zhao.zhao
zhao.zhao
当前离线
在线时间357 小时
UID3258526
ST金币2804
蝴蝶豆176
注册时间2016-4-6
该用户从未签到
3
主题971
帖子176
蝴蝶豆
论坛元老
最后登录2021-4-1
发消息
6#
发表于 2019-8-24 18:18:32
|
只看该作者
如果要指定FLASH中的位置,你先要做个程序B,把FLASH的驱动写好,再在指定的地址写上初始化的值,还要地址足够大,保证不能被原先的程序冲掉。然后回到原先的程序A, 同样做FLASH的驱动,再在指定的地址读出上初始化的值
回复
支持
反对
使用道具
举报
a707083746
a707083746
当前离线
在线时间158 小时
UID415068
ST金币871
蝴蝶豆7
注册时间2010-1-16
该用户从未签到
18
主题142
帖子7
蝴蝶豆
金牌会员
金牌会员, 积分 2154, 距离下一级还需 2846 积分
最后登录2024-3-5
发消息
7#
楼主|
发表于 2019-8-24 19:26:45
|
只看该作者
wenyangzeng 发表于 2019-8-24 15:53
FLASH保存代码和常量,全局、静态变量只能保存在RAM中
非0初始值还是保存在flash里的,不然哪里来的初值?
回复
支持
反对
使用道具
举报
a707083746
a707083746
当前离线
在线时间158 小时
UID415068
ST金币871
蝴蝶豆7
注册时间2010-1-16
该用户从未签到
18
主题142
帖子7
蝴蝶豆
金牌会员
金牌会员, 积分 2154, 距离下一级还需 2846 积分
最后登录2024-3-5
发消息
8#
楼主|
发表于 2019-8-24 19:29:17
|
只看该作者
tanic 发表于 2019-8-24 16:31
您好,是保存在flash中,可以指定具体地址的,不过操作难度过高,不建议您这么做。可以试着用别的方案
...
哈哈,我放弃这个方案了。
原来是这些值出现在了我不想让它出现的地方,所以想指定位置。
现在用分散加载的方法间接解决了。
回复
支持
反对
使用道具
举报
a707083746
a707083746
当前离线
在线时间158 小时
UID415068
ST金币871
蝴蝶豆7
注册时间2010-1-16
该用户从未签到
18
主题142
帖子7
蝴蝶豆
金牌会员
金牌会员, 积分 2154, 距离下一级还需 2846 积分
最后登录2024-3-5
发消息
9#
楼主|
发表于 2019-8-24 19:30:04
|
只看该作者
zhao.zhao 发表于 2019-8-24 18:18
如果要指定FLASH中的位置,你先要做个程序B,把FLASH的驱动写好,再在指定的地址写上初始化的值,还要地址 ...
搞不定,放弃这个方案了
回复
支持
反对
使用道具
举报
wenyangzeng
wenyangzeng
当前离线
在线时间1885 小时
UID45393
ST金币4016
蝴蝶豆82
注册时间2008-5-4
该用户从未签到
74
主题3420
帖子82
蝴蝶豆
社区小助手
最后登录2024-7-7
发消息
10#
发表于 2019-8-25 07:23:57
|
只看该作者
a707083746 发表于 2019-8-24 19:26
非0初始值还是保存在flash里的,不然哪里来的初值?
那个要赋值的“初值”是常量而非变量,是属于代码的一部分
回复
支持
反对
使用道具
举报