S3C44B0的初始化程式的理解(ran

2021-08-26 22:26:49 字數 2592 閱讀 4986

s3c44b0的初始化程式就是初始化各個關鍵的暫存器,建立中斷向量,然後轉移到主函式去執行程式。不過s3c44b0不支援位址對映,所以程式不copy到ram種執行。s3c44b0初始化對我們廣大初學者來說,比較難理解的是中斷的處理和一些少見的操作符號,s3c44b0的中斷子程式位址存放在初始化程式最後就是

handleadc # 4

handlertc # 4

handleutxd1 # 4

handleutxd0 # 4

handlesio # 4

handleiic # 4

handleurxd1 # 4

handleurxd0 # 4

這一段,它的其實位址是isr_startaddress,個人寫中斷程式的時候,子程式位址被編譯器連放在相應的位置。初始化完成後,程式轉通過bl main 轉到使用者定義的主程式上執行。以下是我個人的一些理解,有錯誤的地方希望大家指出來。

gbll thumbcode

[ = 16

thumbcode setl

code32

|thumbcode setl

][ thumbcode

code32 ;for start-up code for thumb mode

]×××××××××××××××××××××××

其中[=if ,|=else ,]= endif, code32 表明一下操作都在arm狀態。這些都是偽操作

這段我理解為設定thumcode的值,然後確定,使用者的程式是在arm狀態還是thum狀態。不過不管thumcode是何值,下面**都是arm狀態

這段沒有什麼很複雜的,就是這三個[,|,]操作符讓我迷惑了半天,翻了半天書才找到解釋

macro 巨集 偽操作

$handlerlabel handler(巨集的名稱) $handlelabel(巨集的引數)

$handlerlabel

sub sp,sp,#4 ;decrement sp(to store jump address)

stmfd sp!, ;push the work register to stack(lr does't push because it return to original address)

ldr r0,=$handlelabel;load the address of handle*** to r0

ldr r0,[r0] ;load the contents(service routine start address) of handle***

str r0,[sp,#4] ;store the contents(isr) of handle*** to stack

ldmfd sp!, ;pop the work register and pc(jump to isr)

mend

*******************************

這段當初我覺得比較難理解,不過通過看各種程式,對這段有了乙個基本的理解。這個巨集的作用是把各個中斷程式的位址裝入當前的pc,44b0有兩種裝斷模式 一種是沒有中斷向量表,一種是使用中斷向量表的

使用中斷向量表只能是irq方式,當使用中斷向量表的時候,中斷發生時由44b0的中斷控制器自動跳轉到

相應的位置。比如在中斷向量表的模式下,乙個外部中斷0發生程式自動跳轉到 位址0x20處,0x20位址單元的指令時ldr pc,=handlereint0

因而程式pc跳到handlereint0處,執行這個巨集操作,把外部中斷的函式的位址賦給pc。 44b0裡面定義了乙個

#define pisr_eint0 (*(unsigned *)(_isr_startaddress+0x84)) ,_isr_startaddres是中斷程式位址的起始位址,_isr_startaddress+0x84是handleeint0的位址

例如乙個外部中斷函式名void exint(),程式裡執行 pisr_eint0=(unsigned)exit,就把自己的函式位址賦給了標號為handleeint0處的記憶體單元

import |image$$ro$$limit| ; end of rom code (=start of rom data)

import |image$$rw$$base| ; base of ram to initialise

import |image$$zi$$base| ; base and limit of area

import |image$$zi$$limit| ; to zero initialise

××××××××××××××××××××××××××××××××××

這段我個人的理解為這些是聯結器生成的於輸出段相關的符號,是在沒有使用scatter檔案的情況可以呼叫。這段指出了在rom和ram種的資料的位址,這些位址應該是聯結器生成的,不過為什麼能呼叫

聯結器生產的符號,我不大明白其中的原因,還希望各位說說自己的理解

isrirq ;using i_ispr register.

sub sp,sp,#4 ;reserved for pc

stmfd sp!,

;important caution

;if i_ispc isn't used properly, i_ispr can be 0 in this routine.

S3C44B0的初始化程式的理解(ran

s3c44b0的初始化程式就是初始化各個關鍵的暫存器,建立中斷向量,然後轉移到主函式去執行程式。不過s3c44b0不支援位址對映,所以程式不copy到ram種執行。s3c44b0初始化對我們廣大初學者來說,比較難理解的是中斷的處理和一些少見的操作符號,s3c44b0的中斷子程式位址存放在初始化程式最...

S3C44B0的中斷模式

對於各種中斷源的響應,s3c44b0有兩種中斷模式 向量中斷模式和非向量中斷模式,這就導致在軟體處理上,可以很靈活的處理中斷請求。一般來說做如下處理 如果系統採用的rom定位在位址0x00,則中斷向量標應該包含一系列分支語句,跳轉到相應的中斷處理程式 這也是s3c44b0所支援的模式 如果rom定位...

U Boot在S3C44B0上的移植方法

bootloader 給嵌入式作業系統提供板上硬體資源資訊,並進一步載入 引導嵌入式作業系統。由於bootloader 的功能直接與cpu和微處理器系統相關,所以不同的cpu體系將需要不同的bootload er。除了依賴於cpu的體系結構外,bootloader 實際上也依賴於具體的嵌入式板級裝置...