stm32f429 Linker Script簡介

這篇文章將會簡單的說明Linker Script在嵌入式開發上,會寫些什麼內容,如何被使用。但我並不打算詳細的說明那些語法,因為那並不是我該做的事情。我會簡要的各個段落語法的用途與意義,讓你大致掌握Linker Script在做什麼事情。
我們將以一個運行在STM32F429 Discovery上的號誌燈專案的Linker Script做為例子。

進入點

定義程式執行的進入點,吃一個symbol作為參數。要指定進入點有好幾種方式,ENTRY只是常見的一種。

配置runtime記憶體大小

指定runtime stack的記憶體位置,我們會事先指定一段heap和stack size,程式設計師必須自行保證使用的stack不會超過這範圍,如果配置太多在Link時就會炸掉

配置實體記憶體

這裡的記憶體大小必須要按照板子實際上的狀況來配置,可以看到不同的記憶體有不同的起始位置和大小。常見的有FLASH和RAM。一般來說FLASH是燒程式的地方,RAM是跑程式的地方,至於CCMRAM是幹啥的呢?CCMRAM全名是(Core Coupled Memory),他是一種SRAM,特性是無法被DMA存取,這塊記憶體一定要由CPU自己主動存取,用途是是當一般記憶體被DMA時是CPU是動不了的,此時CPU可以使用CCRAM來提昇效能。
你可能會有疑問,為什麼配置的ORIGIN並不是從0開始。這是因為板子本身的FLASH就不是從0開始,這麼做的原因是為了保留0起頭的一段記憶體位置,因為剛boot時板子一定會從0開始讀,透過Memory Alias讓板子可以從不同的記憶體區塊boot,詳情請查閱板子的記憶體配置文件。

定義section

接下來的區塊將開始定義執行檔的sections,我們可以知道執行檔是由多個object file所組合而成的,每個object file中都有自己的section,存放不同的程式內容。接下來我們將透過Linker Script告訴Linker要怎麼把大家的section組合成執行檔中的section。

我們首先建立一個被稱為.isr_vector的section,關於這個section內容要放置的東西會寫在大括號內。其實.isr_vector就是一開始的中斷向量表。
.是指location counter,代表目前的記憶體位址,ALIGN是對齊的意思,代表請對齊到最接近的4的倍數,相同或更大的記憶體位址。
KEEP意指請找出並保留(不管存不存在)所有object files內被稱為.isr_vector的section,並把這些section統統放進來
最後請把該section存到我們一開始定義的FLASH區塊內。

接下來我們要建立.text section,這裡通常是存放實際執行的程式碼,我們會蒐集所有object file中的.text, .text*, .glue_7, .glue_7t, ...放進這個區段內,並另外建立並保留init和fini區段。

.rodata

該section存放唯讀data, 一般來說是const變數和字串。

.data

保存已經初始化的全域變數和static變數

CCRAM

bss

.bss section,通常是蒐集與存放未初始化的全域變數和static變數。

.user_heap_stack

用於檢查我們需要的的heap和stack size是否會超過板子上的RAM的大小。如果超過的話該section會建不出來,就會噴錯。

/Discard/

/DISCARD/是個特別的section name,被放在這裡的input section不會被輸出成output section。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *