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 實際上也依賴於具體的嵌入式板級裝置...