關於 Arduino Ameba 的 100 篇 - 程式記憶體配置 -1 (2/100)
如果從編譯器/連結器談起, 可能會是很大一篇, 還好 google 大神越來越厲害了,
找到幾篇先提供作為參考
編譯器與連接器的基本概念
GNU 的 LD 手冊
如 第一篇toolchain 所說:
Arduino 安裝後 ld script 的位置
windows 會放在 :
C:/Users/<使用者名稱>/AppData/Local/Arduino15/packages/<平台安裝package名稱>/hardware/<硬體名稱>/<硬體版本>/variants/xxx/linker_scripts/gcc 下
MAC OS 會放在 :
/Users/<使用者名稱>/Library/Arduino15/packages/<平台安裝package名稱>/hardware/<硬體名稱>/<硬體版本>/variants/xxx/linker_scripts/gcc 下
Arduino linker 呼叫位置/參數
定義在 hardware/platform.txt 檔
## Combine gc-sections, archives, and objectsrecipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} "-L{build.variant.path}/linker_scripts/gcc" "-T{build.variant.path}/{build.ldscript}" "-Wl,-Map={build.path}/{build.project_name}.map" {compiler.c.elf.extra_flags} -o "{build.path}/target.axf" "-L{build.path}" -Wl,--start-group {object_files} {sys_obj_files} -Wl,--end-group "{build.path}/{archive_file}" "{build.variant.path}/{build.variant_system_lib}" "{build.variant.path}/librtos.a" "{build.variant.path}/libtest.a" -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys
記憶體定義
在 ld script 寫法:
MEMORY
{
xxxx
}
如果我們去看 Arduino DUE 的定義, 可以發現他有 512K 的 flash 和 96K 的 SRAM
* SRAM / DRAM 差別, 可以參考 這篇 記憶體小常識
在 Ameba 內部有 4百多 K 的 SRAM 可以使用.
從 0x1FFFF0000 開始, 有 64K TCM (緊密耦合記憶體) 可以使用. (速度比 SRAM 快)
另外一般 Ameba, 外部 SDRAM 有 2M 可以使用
MEMORY | |
{ | |
TCM (rwx) : ORIGIN = 0x1FFF0000, LENGTH = 65536 | |
BD_RAM (rwx) : ORIGIN = 0x10000bc8, LENGTH = 455735 | |
SDRAM_RAM (rwx) : ORIGIN = 0x30000000, LENGTH = 2M | |
} | |
Ameba LD Script
如果不使用外部 SDRAM 2M 的記憶體, 這時候必須要修改 ld script file
也因此, 在燒錄程式 binfiletool , 製作 ram_all.bin 時, 也需用 objcopy 來對應 section 產生機械碼.
留言
張貼留言