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 可以啊,你這樣也可以沒毛病