關於 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 產生機械碼. 



留言

熱門文章