W800默认所有函数都是xip运行,xip相比于ram运行速率更低,如果算法对算力有要求,可以指定一些函数在ram运行,实现方法如下:
__attribute__((section(".sram.text")))
int TestSram(void)
{
return 0;
}
*(.sram.text)
W800还支持某些文件或者某些库的代码段都在ram运行,实现方法如下:
*(.text)
*(.text*)
*(.text.*)
替换为
*(EXCLUDE_FILE (*libuser.a *wm_diy_demo.o).text*)
*(.text*)
W800支持一些只读全局变量加载到ram,实现方法如下
__attribute__((section(".sram.data")))
char sram_buf[16] = "hello";
*(.sram.data)
以上内容来源于大神@Alex
@heeson 你这种写法再ARMCC是可以的,但是800系列是gcc 还是有一点去别的,我临时整了一下,你自己照着改改吧,找到 gcc_csky.ld 链接文件,在MEMORY定义处添加如下内容
在下面定义一个属于自己的section段 如下
.ExternRAM : {
. = ALIGN(4);
__ExternRAM_start = .;
*(.ExternRAM)
*(.ExternRAM*)
. = ALIGN(4);
__ExternRAM_end = .;
} > REGION_EPSAM AT > REGION_RODATA
在C文件中定义一个数组如下
编译之后查看 map文件即可
又来了一位大神,好嗨哦
你试下调到288K以上的数组,应该就报错了
@heeson 大哥 我怎么记得D-SRAM 分配的总大小就那么大一点,总得给程序其他变量留点活路吧
@ZYQ 外扩了一个8mb的Psram,我想直接定义一个100K的数组到外部PSRAM地址,是不能这样搞?stm32可以的
uint8_t membase[100*1024] __attribute__((at(0x30000000)));---内存溢出
@heeson 嗯,刚看了下map文件,地址还是在内存里的,不是在ox30000000地址
@heeson 可以的,你只需要在链接脚本里定义号你的PSRAM 的起始地址和大小,然后仿造下面的书写形式就可以了,然后定义数组的时候再在后面加上——attribute 限定你的地址就OK
@heeson 简单点直接写uint8_t membase = (uint8_t )(0x30000000);这样是在psram里的。
uint8_t membase = (uint8_t )(0x30000000);这样是在psram里的。
咦,打不上指针*号
@abcd 可以啊,你这样也可以没毛病