打印

存储数据到指定的Flash区域问题?

[复制链接]
3555|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qiang6091|  楼主 | 2010-4-13 11:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序中有一部分数据需要存储在指定的Flash地址部分,此部分数据可以更新。存储方式如下: u16 Numbers[2] __at(Flash_Addr)={3246,1048};
   其中Flash_Addr = 0x08038000; 以这样的方式定义后用Flash Loader烧写时速度很慢。主要原因是原来程序是30k,这样定义后程序变成了210k,烧写速度大大降低。 将Flash_Addr 定义在Flash结尾处主要是为了预留足够的空间升级。
    我想是否可以将Flash_Addr定义在Flash起始地址?但是不知道怎么实现,请做个的朋友帮忙指点一下。谢谢!
沙发
mohanwei| | 2010-4-13 11:33 | 只看该作者
IAP?那么不要指定Numbers的地址,用取地址的方式来访问就可以了:
u16 Numbers[2];

访问时:
u16 *p=&Numbers;//得到Numbers的地址,下一步操作指针p就可以了

使用特权

评论回复
板凳
ShakaLeo| | 2010-4-13 11:35 | 只看该作者
为什么要把数据放到那么靠后的位置呢?直接把Flash_Addr放在flash比较靠前的位置就可以,编译器在连接的时候应该会避开存储数据的位置,就是说,程序区不会和Flash_Addr相冲突。

使用特权

评论回复
地板
qiang6091|  楼主 | 2010-4-13 11:47 | 只看该作者
2# mohanwei
必须指定地址,因为要实现外部更新。

使用特权

评论回复
5
qiang6091|  楼主 | 2010-4-13 11:48 | 只看该作者
3# ShakaLeo

定义前面的话不能避开程序区,我试过了。

使用特权

评论回复
6
ShakaLeo| | 2010-4-13 11:50 | 只看该作者
怎么个避不开法?烧写之后,那个位置被改写了?
看来这个编译器的连接功能不太智能啊

使用特权

评论回复
7
qiang6091|  楼主 | 2010-4-13 11:58 | 只看该作者
6# ShakaLeo
编译后会出现警告。烧写后STM32不能启动。我用得是MDK

使用特权

评论回复
8
qiang6091|  楼主 | 2010-4-13 12:21 | 只看该作者
咋就没个明白人呢。

使用特权

评论回复
9
ShakaLeo| | 2010-4-13 12:28 | 只看该作者
没用过MDK,IAR是可以在把变量定义在绝对地址的,但这种变量不能有初始值。
按你的想法,定义在flash的起始地址肯定是不行的,因为flash起始地址是中断向量表。
而且你的程序还要改写这个变量,需要进行擦除操作,所以得占用至少一页的空间才能不影响其它数据和代码。
建议你好好看看MDK的连接配置那部分,帮助文档里应该有说明的。

使用特权

评论回复
10
qiang6091|  楼主 | 2010-4-13 12:54 | 只看该作者
9# ShakaLeo

MDK也可以定义绝对地址,定义在起始地址我没做过。谢谢!

使用特权

评论回复
11
southboy| | 2010-4-13 16:56 | 只看该作者
试试用"_at_"

使用特权

评论回复
12
qiang6091|  楼主 | 2010-4-13 17:10 | 只看该作者
11# southboy

用得就是__at。和用at没关系。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

124

帖子

0

粉丝