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

TrueStudio中常量如何定义到flash固定位置?

[复制链接]
zjczm 提问时间:2018-9-20 14:23 /
本帖最后由 zjczm 于 2018-9-21 16:37 编辑

我需要把某些常量放到固定的flash空间(目的是以后想更新,就在该固定位置更新)。

参考keil做法: const uint16_t test[] __attribute__((at(0x08010000))的模式,结果是直接被忽略了。
尝试了:const uint16_t test[] __attribute__((section(".ARM.__at_0x08010000"))) 还是不行。
这个__attribute__如何用,一下子也没有搞懂。
网上搜索了很久,也没找到好的方法。

请问各位大侠,该怎么实现?
谢谢!

已解决。感谢andeyqi.

TrueStudio常量定位到flash的方法.pdf

下载

295.15 KB, 下载次数: 248, 下载积分: ST金币 -1

常量定位到stm32Flash固定地址

收藏 2 评论9 发布时间:2018-9-20 14:23

举报

9个回答
andeyqi 回答时间:2018-9-20 17:01:57
QQ截图20180920165421.png
修改链接脚本,增加指定的段,并把数据定义到该段中就可以。

评分

参与人数 2ST金币 +2 蝴蝶豆 +4 收起 理由
zero99 + 4
zjczm + 2 赞一个!

查看全部评分

qwert00000 回答时间:2018-9-20 19:11:12
没看明白
Dandjinh 回答时间:2018-9-20 20:29:00
gcc不允许直接写地址,要先在.ld文件定义个section,然后用__attribute__(section())

评分

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

查看全部评分

zjczm 回答时间:2018-9-21 10:36:14
根据andeyqi提供的方法,测试编译通过。但常量定位还是没有成功。
继续再研究一下,看看哪里不对。
zjczm 回答时间:2018-9-21 13:04:56
终于搞定了。按andeyqi的 3步方法即可。非常感谢andeyqi的帮助。
调试期间犯了点小错误:  
1. 修改 STM32F103CB_FLASH.ld文件时,
.mydata :
  {
    . = ALIGN(4);  //--> 这里的点后面有个空格,不能省略,否则编译失败。格式很重要!!!
    *(.mydata)
  } >FLASH1

2. 测试时testdata在程序没有被调用,导致直接被编译器优化没了。我在flash中找数据找了好多边没找到,后来才醒悟。浪费了点时间。非常低级的错误。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3 结帖奖励

查看全部评分

jihesong-101921 回答时间:2019-4-21 23:04:37
超级感谢,可是,另一个,定义到RAM固定地址似乎不行,keil行。
jihesong-101921 回答时间:2019-4-22 19:52:15
本帖最后由 jihesong-1019213 于 2019-4-22 20:11 编辑

,用户手册里面有这个描述,在133页,手册就是打开tureSTUDIO帮助菜单第一行,有手册链接,几百页,超详细:

原来如果这样:
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 16K
MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K
}

修改成这样:
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 64K
IP_CODE (x) : ORIGIN = 0x08010000, LENGTH = 64K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 8K
MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K
}

.ip_code :
{
*(.IP_Code*);
} > IP_CODE

用法(放前面),原话这么说的:
attribute__((section(".IP_Code"))) before the function declaration.

手册举例:
attribute ((section(".IP_Code"))) int placed_logic()
{
/* TODO - Add your application code here */
return 1;
}

总结:
和楼主基本一致,重点是:声明时候“放前面”,然后,链接器就把东西就放在那个ROM地址上了。
第134 页: 要将代码放在外部ram中,需要对链接描述文件进行一些修改;
真是‘抛砖引玉’了,其实我在找扩展外部RAM后,怎么定位的事,相当good,继续找,手册上应该有的。

是什么啊?奇怪了,不是我敲的



zxcv1ddd 回答时间:2019-4-22 21:47:56
多谢分享
bigpigbug 回答时间:2019-11-26 09:24:10
学习了

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版