野火-Mini-RT-1052開發板-學習筆記一
阿新 • • 發佈:2018-12-09
RT-1052啟動細節
一、基本概念
- Code :程式程式碼
- RO-Data:只讀資料(定義的常量或const型的變數)
- RW-Data:靜態初始化,即有初值的變數
- ZI-Data:未初始化的靜態變數(一般這類變數,被初始化為0)
- Total RO Size = Code + RO-Data
- Total RW Size = RW-Data + ZI-Data
- Total ROM Size = Code + RO-Data + RW-Data
- ROM(Flash) Size = Code + RO-Data + RW-Data
- RAM(記憶體) Size = RW-Data + ZI-Data
PS:RW-Data既佔用了ROM也佔用了RAM(因為RW-Data是有初始值的,該初始值存放在ROM中,而ZI-Data初始值都為0,不需要再ROM中存初值)
二、__main函式過程
在使用者main函式之前將執行__main函式,由以下兩部分組成
__scatterload():
- 程式碼和資料的拷貝,將RW/RO輸出段從裝載域地址複製到執行域地址
- 將RW-Data段賦予初值
- 將ZI-Data段清零
PS:上述程式碼與分散載入檔案相關
__rt_entry():
- STACK和HEAP的初始化,構建C語言執行環境
- 跳轉到使用者main函式
關於系統堆疊的教程: http://www.cnblogs.com/xinjie/archive/2009/08/15/1546760.html
三、分散載入檔案
- 分散載入檔案用來指導ARM連結器生成映像檔案時如何分配Code、RO-Data、RW-Data、ZI-Data等資料的存放地址
- 分散載入檔案是由一個或多個載入時域構成,而一個載入時域是由一個或多個執行時域構成
- 一個執行域是由一個或多個輸入段描述組成,輸入段描述由目標檔案濾波器及濾波器屬性構成(也就是從輸入的目標檔案中篩選出擁有相應屬性的檔案:目的是將這部分檔案存放在這個執行域中)
- 一個C檔案編譯後,其所有的變數、程式碼會作為一個整體,除非在該C檔案中使用段定義來劃分空間(在分散載入檔案中,通過段名稱來給段分配地址)
- 載入域的第一個執行域必須和該載入域的起始地址相同,其大小一般也與載入時域相同
PS:分散載入檔案有一個功能:可以將Flash的程式碼拷貝到RAM中執行,這一段拷貝程式碼存在__main()函式中(也就是上面的函式__scatterload()),拷貝程式碼不能夠拷貝自身,所以規定載入時域的第一個執行時域中存放的程式碼不會被拷貝到RAM中(也就是說拷貝程式碼前包括自身的程式碼是不能夠拷貝的,這些程式碼必須位於第一個執行時域之中)
四、SDRAM的提前初始化
- 使用除錯指令碼初始化:在debug模式中,同過設定Debug->Initialization File來提前初始化SDRAM
- 使用DCD配置原始檔初始化:DCD配置功能(Device Configuration Data):晶片上電後,DCD區域的內容會被首先執行,然後再執行第一個彙編語句(若在第一句彙編程式碼這,進行SDRAM相關暫存器賦予配置值也可以達到提前初始化SDRAM的目的)
MDK的編譯過程及檔案型別全解:https://www.cnblogs.com/firege/p/5806134.html