基於ARM硬體初始化的一些細節問題的解釋

2021-06-07 06:18:00 字數 1170 閱讀 1659

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 語法...