想做个内存管理的, 类似 stm32 的内存管理, 但是超出芯片自带内存就报错了
这样定义编译正常
uint8_t membase[1024] __attribute__ ( (at (0x30000000) ) ) ;
这样就报错内存溢出
uint8_t membase[300*1024] __attribute__ ( (at (0x30000000) ) ) ;
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
又来了一位大神, 好嗨哦
你试下调到 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 可以啊, 你这样也可以没毛病