CUBEIDE的外部SRAM操作的二三事,尤其是warning: 'at' attribute directive ignored相关
一:参考资料的链接
1.1 所用参考与简介
说说在前面,其实我是前面两位老哥的资料整理,我自己吧源码贴在了代码段,我只是拾人牙慧的小屁孩。
链接: STM32CUBEIDE下littleVGL的移植+分配外部SRAM.
链接: STM32 .ld链接文件分析及一次bug解决过程 .
stm32cubeide里面的C语言编译器的文档,没有at这个属性,所以在keil中的at指向地址不能用,要改成section,否则报错
下面展示一些 内联代码片
。
// An highlighted block
u32 testsram[250000] __attribute__((at(0X68000000)));//测试用数组
1.2 所用开发板 正点原子探索者 F407ZGT6
关于地址都是Ox68000000(你们都骗不了我那我知道)
二:需要修改的源码
2.1 mian 里面的源码
下面展示一些 mian里的源码
。
// An highlighted block
static u32 testsram[250000] __attribute__((section(".sram")))
for(ts=0;ts<250000;ts++)testsram[ts]=ts;//预存测试数据
fsmc_sram_test(60,170);//测试 SRAM 容量
for(ts=0;ts<250000;ts++)LCD_ShowxNum(60,190,testsram[ts],6,16,0);
这个fsmc_sram_test是正点原子的源码,我之后会上传,源文件有能力的自己看。
2.2 flash.ld 里面的源码
下面展示一些 flash.ld 里的源码
。
// An highlighted block
MEMORY
{
CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K
SRAM (rx) : ORIGIN = 0x68000000, LENGTH = 1024K
}
// An highlighted block
.sram :
{
. = ALIGN(4);
__SRAM_SYMBOLS = .; /* create a global symbol at ccmram start */
*(.sram)
*(.sram*)
. = ALIGN(4);
__SRAM_SYMBOLS = .; /* create a global symbol at ccmram end */
} >SRAM AT> FLASH
三:原理说明
u32 testsram[250000] attribute((section(".sram")))
正点原子的源码用的是at,这里用section指向在flash里面声明的0x68000000
link文件中划分一个新的段,将这个变量放到这个段内就可以解决了。与scatter文件不同,由cubeide生成的工程使用的是flash.ld文件,
给出地址的划分区间,这里增加了一个由malloc使用的MALLOC段,放在外部SRAM上,地址0x68000000,大小为1024K
这一部分实际上指定了程序的各个内容该如何放置在flash上或者ram上,有几个用法:
1 . = ALIGN(4);是指4字节对齐
2 .,小数点表示当前的地址位置,例如__SRAM_SYMBOLS = .;的意思是`__SRAM_SYMBOLS 的地址就是.sram段的地址
3 结尾的>MALLOC指上面花括号内的内容都放在第二部分中定义的MALLOC空间中。如果没有AT> FLASH,那么编译bin文件时地址是连续的