zjczm 发表于 2018-9-20 14:23:05

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

本帖最后由 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.

andeyqi 发表于 2018-9-20 17:01:57


修改链接脚本,增加指定的段,并把数据定义到该段中就可以。

qwert00000 发表于 2018-9-20 19:11:12

没看明白

Dandjinh 发表于 2018-9-20 20:29:00

gcc不允许直接写地址,要先在.ld文件定义个section,然后用__attribute__(section())

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中找数据找了好多边没找到,后来才醒悟。浪费了点时间。非常低级的错误。

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 编辑

:P,用户手册里面有这个描述,在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

学习了
页: [1]
查看完整版本: TrueStudio中常量如何定义到flash固定位置?