1.兩種流程處理
1.查詢方式
特點:簡單、但占用較多資源
2.中斷方式
特點:負責、但占用資源少
常見的中斷有(中斷也是異常的一種):
按鍵(外部中斷)、定時器中斷、網絡數據
常見的異常有
指令異常、數據訪問出錯、Reset
2.中斷處理過程
2.1 硬件初始化
設置中斷源
設置中斷控制器(屏蔽、優先級)
設置CPU總開關(使能中斷)
2.2 執行程序
2.3 產生中斷
eg:
中斷信號
按下按鍵
中斷控制器
CPU
CPU每執行完一條指令,都會檢查有誤異常(中斷)產生
發現異常(中斷)產生,開始處理
對于不同的異常,會跳去不同的地址(異常向量)執行程序
這些地址上,只是一條跳轉指令(跳去執行其他函數)
2.4 執行中斷
1.保存現場(各類寄存器)
2.中斷處理
3.恢復現場
3.ARM的7種模式(Mode)
正常模式
User (usr): The normal ARM program execution state
用戶模式(不可以直接進入其他模式)
System (sys): A privileged user mode for the operating system
系統模式
異常模式
FIQ (fiq): Designed to support a data transfer or channel process
快中斷模式
IRQ (irq): Used for general-purpose interrupt handling
中斷模式
Supervisor (svc): Protected mode for the operating system
管理模式
Abort mode (abt): Entered after a data or instruction prefetch abort
中止模式
Undefined (und): Entered when an undefined instruction is executed
未定義指令模式
除了用戶模式以外的6中模式 成為特權模式(Privileged Mode),可以編程操作CPSR(當前程序狀態寄存器)直接進入其他模式
不同模式是為了更好的應對所對應的異常(差別在于:寄存器的資源)
banker register 為備份寄存器,可以成為專屬寄存器,R13(SP棧指針)、R14(LR返回地址)
SPSR(保存程序狀態寄存器):用來保存“被中斷模式的CPSR”,相當于CPSR的備份寄存器,eg:當正處于User Mode,發生中斷,進入IRQ Mode,SPSR_irq就保存了User Mode那一時刻的CPSR
3.1 異常向量表
4.ARM的2種狀態(State)
ARM State:
使用ARM指令集,占據4個字節
Thumb State:
使用Thumb指令集,占據2個字節
M0~M4:模式位 Mode bit (7種模式)
T:狀態位 State bits(ARM or Thumb)
5.異常的處理流程
5.1 進入異常
進入異常時的動作(硬件部分實現)
1.異常模式下的LR存放 [被中斷模式的下一條指令的地址](PC+4/PC+8)
2.異常模式下的SPSR = CPSR
3.修改CPSR的[M4~M0],進入異常模式
4.跳到向量表
5.2 退出異常
退出異常時的動作(硬件部分實現)
1.PC = 異常模式下的LR - Offest(offest根據下表來確定)
2.CPSR = 異常模式下的SPSR(恢復CPSR)
3.清除中斷標志位
6.程序以thumb指令集運行
6.1 gcc以thumb編譯
thumb指令集編譯、使得代碼以thunb狀態運行,在makefile中的gcc編譯加上-mthunb
arm-linux-gcc -mthumb -c -o $@ $<
6.2 如何從arm切換至thumb
[x]在start.S中需要使用ARM指令集的用.code 32指定,用thumb指令集的用.code 16指定
使用BX指令(其是ARM指令系統中的帶狀態切換跳轉指令),BX命令后面的那個值如果最低位為1的話,則切換到thumb指令
.code 32
/*..............*/
/* 從ARM State 切換到Thumb State*/
adr r0,thumb_func
add r0,r0,#1 /*bit0 = 1時,bx就會切換CPU狀態至thumb state*/
bx r0
.code 16
thumb_func:
/*..............*/
6.3 注意
對于thumb指令,不能向PC直接賦值
eg:ldr pc, =main(這樣不行),需要先把值賦值寄存器,再把寄存器賦值給PC
gcc disable built-in memcpy
當使用thumb編譯時,gcc會調用memcy,我們可以把變量改成static(存放在data段),這樣就不會讓gcc去調用了
上一篇:【ARM裸板】未定義指令異常分析及示例
下一篇:【ARM裸板】內存控制器、SDRAM基礎與代碼重定位
推薦閱讀
史海拾趣
進入20世紀60年代,ERNI開始關注連接器技術的發展。他們意識到,隨著電子設備的日益復雜和多樣化,對連接器技術的需求也將不斷增長。因此,ERNI投入大量資源進行研發,終于在1967年成功開發出第一個背板連接器,這一創新技術迅速成為公司的核心產品,也為ERNI在連接器市場贏得了聲譽。
隨著全球對環保問題的日益關注,ECLIPTEK公司積極響應環保號召,將綠色環保理念融入其產品研發和生產過程中。公司采用環保材料和清潔能源,減少生產過程中的廢棄物和污染物排放。同時,ECLIPTEK還積極參與環保公益活動,推動電子行業的可持續發展。
隨著技術的成熟,AC Photonics Inc開始積極拓展市場。公司不僅在國內建立了完善的銷售網絡,還積極開拓海外市場。同時,AC Photonics Inc還與其他知名電子企業建立了戰略合作關系,共同推動光電技術在各個領域的應用。這些合作不僅提升了公司的知名度和影響力,還為公司的長遠發展提供了有力支持。
在快速發展的同時,Bce Sud始終關注企業社會責任和可持續發展。公司積極參與環保、公益等活動,致力于為社會做出貢獻。同時,公司還注重員工的培訓與發展,為員工提供良好的工作環境和職業發展機會。這些舉措不僅提升了公司的社會形象,也為公司的長遠發展奠定了堅實基礎。
這些故事基于一般的電子行業公司成長經歷構建,旨在展示一個虛構的電子行業公司如何從初創走向成功的過程。雖然故事中的公司名稱和具體細節是虛構的,但其中的發展邏輯和經驗教訓對于現實中的電子行業公司來說仍具有一定的參考價值。
隨著科技的不斷發展,電子行業的技術創新日新月異。在這個過程中,BSI通過提供最新的技術信息和標準,為企業的技術創新提供了有力支持。BSI建立了龐大的標準數據庫,涵蓋了電子行業的各個領域,為企業提供了豐富的技術資源和參考依據。同時,BSI還積極參與新技術的研發和推廣工作,為電子行業的創新發展提供了動力。
第一節: 心情和時鐘 說實話我能夠使用的單片機不多,我總是以為無論什么單片機都能開發出好的產品。 前些年用51,總是向各位大大學習,無休止的索取,在網上狂覽一通。心里感激的同時也想奉獻一些,可是我會什么?后來使用avr(公司要求)還是 ...… 查看全部問答∨ |
|
原來在windows mobile 6.0上開發了個應用程序,現在想移植到wince6.0 的PND上(找別人買的,好象沒有提供SDK),不知該如何做,我用VS2005,只能選擇mobile 6.0的開發環境。我想在在這個pnd上開發程序,并能在其模擬器運行與調試… 查看全部問答∨ |
愛晶電子 基于ENC28J60的PIC以太網開發板(PIC實驗板/PIC開發板) ¥450 http://item.taobao.com/auction/item_detail-db2-cdaacf2253921bc4ab5b5d41b991e651.jhtml 小新電子 PIC18F97J60 以太網開發板 一 口 價: 298.00元 http:/ ...… 查看全部問答∨ |
最近做一個項目,把兩個現有設備并湊到一起。兩個設備CPU需要通信,所有接口都有其他用途,只剩下一個Jtag,有沒有辦法使用Jtag進行通信?系統是基于Linux的,想不重寫驅動就可以通信,不知有沒有可能,本人對Jtag沒什么了解,望達人指教。… 查看全部問答∨ |
【VxWorks5.x -->VxWorks6.x 移植問題】 大家好,誰有沒有做過 PPC的BSP 從 5.X ---> 6.X 的移植啊? 我所知道的是,從6.x對5.X的支持是兼容的,那么我就先把 5.X 的BSP文件夾 如 ppc_myself_XXX 放到 h/config/ 下,然后新建立 BSP 工程,進行編譯,可是編譯的時候,發現ERROR超多啊 ...… 查看全部問答∨ |
103系列的好用的USB iap現在挪到105下不好用了。 對這個USB很不了解。 現在哪里能找到基于USB-OTG的USB iap例程? 哪位能分享一下例程不勝感激… 查看全部問答∨ |