1. 程式人生 > >野火-Mini-RT-1052開發板-學習筆記一

野火-Mini-RT-1052開發板-學習筆記一

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():
  1. 程式碼和資料的拷貝,將RW/RO輸出段從裝載域地址複製到執行域地址
  2. 將RW-Data段賦予初值
  3. 將ZI-Data段清零

PS:上述程式碼與分散載入檔案相關

__rt_entry():
  1. STACK和HEAP的初始化,構建C語言執行環境
  2. 跳轉到使用者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的提前初始化

  1. 使用除錯指令碼初始化:在debug模式中,同過設定Debug->Initialization File來提前初始化SDRAM
  2. 使用DCD配置原始檔初始化:DCD配置功能(Device Configuration Data):晶片上電後,DCD區域的內容會被首先執行,然後再執行第一個彙編語句(若在第一句彙編程式碼這,進行SDRAM相關暫存器賦予配置值也可以達到提前初始化SDRAM的目的)

MDK的編譯過程及檔案型別全解:https://www.cnblogs.com/firege/p/5806134.html