u-boot分析(四)---设置异常向量表|设置SVC模式
u-boot分析(四)
通過前三篇的分析,我們對u-boot已經有了整體的認識和掌握,但是我們仍然對于其部分硬件是如何初始化的不太清楚,所以接下來幾篇博文我將會對我們在http://www.cnblogs.com/wrjvszq/archive/2015/01/10/4215627.html一文中總結出的u-boot的工作流程中的重要環節,結合文檔加以分析。
今天我們會用到的文檔:
1.??????? ARM Architecture Reference Manual:http://download.csdn.net/detail/wrjvszq/8354473
?
今天我們將會分析以下內容:
1.????? ?設置中斷向量表
2.????? 設置CPU為SVC模式
?
l? 設置異常向量表
我們知道arm上電后u-boot干的第一件事就是設置異常向量表,那么什么是異常?異常又有什么類型呢?等等一大堆問題,下面我們一一解決。
1.?????? 異常
異常其實是中斷的一種,我們的中斷按中斷事件來源進行分類,主要有兩類:
1)??????? 中斷:由CPU以外的事件引起的中斷,如I/O中斷、時鐘中斷、控制臺中斷等。????
2)????? 異常:來自CPU的內部事件或程序執行中的事件引起的過程。如由于CPU本身故障、程序故障和請求系統服務的指令引起的中斷等。?
2.?????? 異常的類型
根據《ARM Architecture Reference Manual》手冊中的2.6節我們找到了如下表格,說明我們的arm處理器支持的異常有七種
我們的arm處理器有兩種入口地址,默認情況下我們選擇Normal address,只有當設置了協處理器CP15的相關寄存器以后,才會啟用High vector address。
特別提醒:Data Abort和IRQ這兩種異常的入口地址一個為0x00000010一個為0x00000018中間差了4個字節,在arm指令解析一節中我們提到arm的一條指令為4個字節剛好差了一條指令,所以我們看到u-boot這樣設置異常向量表。
1 _start: 2 b reset //0x00000000復位異常 3 ldr pc, _undefined_instruction //0x00000004未定義指令異常 4 ldr pc, _software_interrupt //0x00000008軟中斷異常 5 ldr pc, _prefetch_abort //0x0000000c預取異常 6 ldr pc, _data_abort //0x00000010數據異常 7 ldr pc, _not_used//中間多差的一條指令。0x00000014 8 ldr pc, _irq //0x00000018外部中斷異常 9 ldr pc, _fiq //0x0000001c快速中斷異常3.?????? 異常向量:
當異常發生的時候,由硬件機制處理器自動的跳到一個固定地址去執行相關異常處理程序,而這個固定地址就是所謂的異常向量。
l? 設置CPU為SVC模式
1.?????? U-boot工作的模式:
由于我們的u-boot需要執行更多的指令,訪問更多的寄存器對芯片進行初始化設置,所以要工作在SVC模式。
注:在http://www.cnblogs.com/wrjvszq/p/4199682.html 一文介紹過arm處理器的工作模式
2.?????? 如何設置CPU工作在SVC模式
同樣在http://www.cnblogs.com/wrjvszq/p/4199682.html 一文中我們介紹過通過CPSR寄存器設置處理器的工作模式,其實就是設置CPSR中的M[0-4]為0b10011這也就很容易明白u-boot為什么這么設置了。
?
1 reset: 2 /* 3 * set the cpu to SVC32 mode 4 */ 5 mrs r0, cpsr //導入CPSR寄存器的值到R0 6 bic r0, r0, #0x1f//0b1 1111對M[0-4]清零 7 orr r0, r0, #0xd3//0b1 0011對M[0-4]置1 8 msr cpsr,r0//將R0寫入CPSR中?
?
今天有點不舒服,所以就到此為止了,明天繼續分析。
內容有點少,大家諒解!!!
?
轉載于:https://www.cnblogs.com/wrjvszq/p/4219919.html
總結
以上是生活随笔為你收集整理的u-boot分析(四)---设置异常向量表|设置SVC模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模式-视图-控制器模式2.0
- 下一篇: ALM 中查看某个 test 的更改 h