arm硬體啟動程式的工作一般包括:
1.分配中斷向量表;
2.初始化儲存器系統;
3.初始化各工作模式下的堆疊;
4.初始化有特殊要求的硬體模組;
5.初始化使用者程式的執行環境;
6.切換處理器的工作模式;
7.呼叫主應用程式;
這裡主要講解寫初始化應用程式執行環境:
乙個典型的可執行程式的映像結構通常如表所列。
可執行程式映像的結構
分割槽說明
zi(初始化為0的可讀/寫資料)
只定義了變數名的全域性變數
rw(可讀/寫資料)
定義了帶初始值的全域性變數
ro(**和唯讀資料)
編譯後的程式
映像一開始總是儲存在rom/flash中的,其ro部分既可以在rom/flash中執行,也可以轉移到速度更快的ram中執行;而rw和zi這兩部分必須轉移到可寫的ram中。所謂應用程式執行環境的初始化,就是必須完成必要的從rom到ram的資料傳輸和內容清空。
下面是在ads整合開發環境中,一種常用儲存器模型的直接實現。
ldr r0,=|image$$ro$$limit|
ldr r1,=|image$$rw$$base|
ldr r3,=|image$$zi$$base|
cmp r0,r1
beq %f1
0 cmp r1,r3
ldrcc r2,[r0],#4
strcc r2,[r1],#4
bcc %b0
1
ldr r1,=|image$$zi$$limit|
mov r2,#0
2 cmp r3,r1
strcc r2,[r3],#4
bcc %b2
程式實現了rw資料的複製和zi區域的清空。其中引用到的4個符號是由鏈結器定義的。
程式先把rom中|image$$ro$$limit|位址開始的rw初始資料複製到ram中|image$$rw$$base|開始的位址,當ram這邊的目標位址到達|image$$zi$$base|後,
就表示rw區的結束和zi區的開始,然後就對這片zi區進行清零操作,直到遇到結束位址|image$$zi$$limit|。
關於char陣列初始化的一些細節
cpp view plain copy include include int main else for i 0 i 100 i printf n printf len d n strlen s printf sizeof d n sizeof s return 0 char陣列全部初始化為0後,...
Java初始化的細節
class animal class dog extends animal animal animalc new animal animalc public class initialization 執行結果如下 這是在animal的構造方法裡面!我是 animalb 這是在animal的構造方法裡...
關於資料初始化的一些筆記
最近有乙個需求,是需要對線上的一些存量資料進行初始化,在投產當天,出現了效能問題,主要是使用了 update select 這種語法。ps 使用的資料庫是db2.背景 由於是銀行信貸系統,部分表資料量比較大,需要關聯 join 的表也比較多。當時由於沒有經驗,直接使用update select 語法...