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.
修改链接脚本,增加指定的段,并把数据定义到该段中就可以。
没看明白 gcc不允许直接写地址,要先在.ld文件定义个section,然后用__attribute__(section()) 根据andeyqi提供的方法,测试编译通过。但常量定位还是没有成功。
继续再研究一下,看看哪里不对。 终于搞定了。按andeyqi的 3步方法即可。非常感谢andeyqi的帮助。
调试期间犯了点小错误:
1. 修改 STM32F103CB_FLASH.ld文件时,
.mydata :
{
. = ALIGN(4);//--> 这里的点后面有个空格,不能省略,否则编译失败。格式很重要!!!
*(.mydata)
} >FLASH1
2. 测试时testdata在程序没有被调用,导致直接被编译器优化没了。我在flash中找数据找了好多边没找到,后来才醒悟。浪费了点时间。非常低级的错误。
超级感谢,可是,另一个,定义到RAM固定地址似乎不行,keil行。 本帖最后由 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,继续找,手册上应该有的。
是什么啊?奇怪了,不是我敲的
多谢分享 学习了
页:
[1]