本帖最后由 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, 下载次数: 254, 下载积分: ST金币 -1
常éå®ä½å°stm32Flashåºå®å°å
评分
查看全部评分
继续再研究一下,看看哪里不对。
调试期间犯了点小错误:
1. 修改 STM32F103CB_FLASH.ld文件时,
.mydata :
{
. = ALIGN(4); //--> 这里的点后面有个空格,不能省略,否则编译失败。格式很重要!!!
*(.mydata)
} >FLASH1
2. 测试时testdata在程序没有被调用,导致直接被编译器优化没了。我在flash中找数据找了好多边没找到,后来才醒悟。浪费了点时间。非常低级的错误。
评分
查看全部评分
,用户手册里面有这个描述,在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,继续找,手册上应该有的。
是什么啊?奇怪了,不是我敲的