嵌入式培訓教程-linux驅動開發(fā)_第1頁
嵌入式培訓教程-linux驅動開發(fā)_第2頁
嵌入式培訓教程-linux驅動開發(fā)_第3頁
嵌入式培訓教程-linux驅動開發(fā)_第4頁
嵌入式培訓教程-linux驅動開發(fā)_第5頁
已閱讀5頁,還剩69頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

AnEmbeddedLinuxTech.ProviderinMainland基于ARM的嵌入式linux驅嵌入式linux系統(tǒng)下驅動簡述異常處理機制設計 AnEmbeddedLinuxTech.ProviderinMainland嵌入式linux驅動簡 區(qū)分系統(tǒng)調用和設備驅動 序 程這樣在應用程序看來,硬件設備只是一個設備文件,序 AnEmbeddedLinuxTech.ProviderinMainland 設備驅動程序是內核的一部分,它主要完成以下功能把數據從內核傳送到硬件和從硬 數據檢測和處理設備出現的錯誤 AnEmbeddedLinuxTech.ProviderinMainland字符設備,塊設備和網絡設備的主要區(qū)別 AnEmbeddedLinuxTech.ProviderinMainland網絡設備是linux下特殊設備的典型,此類設備在dev下主次設備號,態(tài),搶先式 AnEmbeddedLinuxTech.ProviderinMainland NO_VERSION

charkernel_version[]=可少.最好,驅動程序的開頭能包含<linux/config.h>; AnEmbeddedLinuxTech.ProviderinMainland,如,close....,注意,不是fopen,fread,但是如何把系統(tǒng)調用和驅動程序關聯起來呢structfile_operations AnEmbeddedLinuxTech.ProviderinMainlandstructfile_operations

*,

*,

*,

*,

}

AnEmbeddedLinuxTech.ProviderinMainland這個結構的每一個成員的名字都對應著一個系統(tǒng)調程序,然后這個數據結構相應的函數指針,接著把控制權這是linux下設備驅動程序工作的基本原相當簡單,不是嗎 AnEmbeddedLinuxTech.ProviderinMainland一些常見的問題 AnEmbeddedLinuxTech.ProviderinMainland異?;蛑袛嘈螒B(tài)異常處理函數設計可重入中斷設計 AnEmbeddedLinuxTech.ProviderinMainland異?;蛑袛嗍怯脩舫绦蛑凶罨镜囊环N執(zhí)行流程或DataAbortPrefetchUndefined

。 AnEmbeddedLinuxTech.ProviderinMainland跳轉范圍硬件處理軟件處理 AnEmbeddedLinuxTech.ProviderinMainland AnEmbeddedLinuxTech.ProviderinMainland其中FIQ_Handler()可以直接從地址0x1C處開始,省下一條跳ARM的跳轉指令(B)是有范圍限制的(±32MB),但很多況下不能保證所有的異常處理函數都定位在向量表的32MB圍內,需要大于32MB長跳轉,而且因為向量表空間的限制 AnEmbeddedLinuxTech.ProviderinMainland2.把目標地址直接賦給PC寄存器MOVPC,MOVPC, 是合法的,因為 可以過0x03循環(huán)右移4位而得到而MOVPC, 就 指令 AnEmbeddedLinuxTech.ProviderinMainland 器單元上的32位數據傳送給PC來實現跳轉。LDRPC, 器單元必須在當前指令的±4KB空間范圍內 水線中指令預取對PC值的影響,以圖-2的情況為例:offset=addresslocation–vectoraddress–pipelineeffect=0xFFC–0x4–= AnEmbeddedLinuxTech.ProviderinMainland AnEmbeddedLinuxTech.ProviderinMainland異常分支問題的提出ARM內核只有二個外部中斷輸入信號nFIQ和但對于一個系統(tǒng)來說,中斷源可能多達幾十個 AnEmbeddedLinuxTech.ProviderinMainland AnEmbeddedLinuxTech.ProviderinMainland AnEmbeddedLinuxTech.ProviderinMainland AnEmbeddedLinuxTech.ProviderinMainland異常發(fā)生時處理器的動作異常返回ARM編譯器對異常處理函數實現的擴展軟中斷處理 AnEmbeddedLinuxTech.ProviderinMainland任何一個異常發(fā)生并得到響應時,ARM核自動完注意當響應異常后,不管異常發(fā)生在ARMThumb進入ARM拷貝CPSRSPSR_<mode>設置適當的CPSR位:改變處理器狀態(tài)進入ARM AnEmbeddedLinuxTech.ProviderinMainland進入異常處理程序以后,用戶可以完全按照自己的意愿來進行程序設計,包括調用Thumb狀態(tài)的函數,等等。特別注意,清中斷 AnEmbeddedLinuxTech.ProviderinMainland 寄存器的恢復、狀態(tài)寄存器的恢復以及PC指針的恢復。的恢復可以通過一條指令來實現,下面是3個例子:MOVSpclr或SUBSpclr4或LDMFDsp!這幾條指令都是普通的數據處理指令,特殊之處就是把PC寄 CPSR的拷貝,達到恢復狀態(tài)寄存器的目的。 AnEmbeddedLinuxTech.ProviderinMainland定是正確的中斷返回地址下面,透過一個簡單指令的流水作業(yè)來詳細說 AnEmbeddedLinuxTech.ProviderinMainland3.在ARM架構里,PC值指向當前執(zhí)行指令的地址加8處。也就是說,當執(zhí)行指令A(地址0x8000)時,PC等于指令C的地址(0x8008)。假如指令A是BL指令,則當執(zhí)行時,會把PC(=0x8008)保存到LR寄存器里面,但是接下去處理器會馬上對LR進行一個自動的調整動作:LR=LR-0x4。這樣,最終保存在LR里面的是B指令的地址,所以當從BL返回時,LR里面正同樣的調整機制在所有LR自動保存操作中都存在 AnEmbeddedLinuxTech.ProviderinMainland4.對不同異常類型的返回地址比較存的地址,所以只要直接把LR恢復給PC。如果發(fā)生的是IRQ或FIQ等指因為外部中斷請求中斷了B令的執(zhí)行,當中斷返回后,需要需要把LR減4。。 AnEmbeddedLinuxTech.ProviderinMainlandARM編譯器的函數擴IRQ_HandlerSTMFDSP!,{R0-R12,LR}BLIrqHandlerLDMFDSP!,{R0-R12,LR}SUBSPC,LR,#4

進入普通處理函數,C或 AnEmbeddedLinuxTech.ProviderinMainlandARM編譯器的函數擴 且自動加入對LR進行減4的處理,符合IRQ和FIQ中斷處理的 irqvoidIRQ_Handler AnEmbeddedLinuxTech.ProviderinMainland AnEmbeddedLinuxTech.ProviderinMainland2.在C程序中調用軟件中斷需要用到編譯器的擴展功能,使用關鍵字swi來中斷函數。注意軟中斷號碼同時在函數 swi(0x24)voidmy_swi這樣當調用函數my_swi的時候,就會用SWI0x24來代替普通的函數調用BLmy_swi。 AnEmbeddedLinuxTech.ProviderinMainland3.軟中斷指令的編碼格式 AnEmbeddedLinuxTech.ProviderinMainland4.需要注意的一點是當SWI指令的執(zhí)行狀態(tài)不同時,其指令地址間隔不一樣,如果進入SWI執(zhí)行前是在ARM狀態(tài)下,需要通過LR-4來獲得SWI指令地址,如果是在Thumb狀態(tài)下進入 AnEmbeddedLinuxTech.ProviderinMainland1.缺省情況下ARM中斷是不可重入的,因為一旦進入異常響應狀態(tài),ARM自動關閉中斷使能。套,顯然新的異常處理將破壞原來的中斷現場而導致關鍵問題如LR_irq和SPSR_irq等,這一點容易想到也容易做到;.中斷處理過程中對BL的保護 AnEmbeddedLinuxTech.ProviderinMainlandSTMFDSTMFDSP!,{R0-R3,…LDMFDSP!,{R0-R3,ADD……

AnEmbeddedLinuxTech.ProviderinMainland3.程序Foo()無法正確返回中斷是在指令流BLFooSTMFDSP{R0-R3LR}執(zhí)行過程中插入的,完成跳轉操作后,進行流水線刷新,最后LR_irq保存的是STMFD后面一條指令的地址;這樣當新中斷利用(PC=LR-4)操作返回時,正好可以繼續(xù)原來的流程執(zhí)行STMFD指令。這二次對LR_irq的操作發(fā)生了,當新中斷返回后往下執(zhí)行STMFD指令,這時候壓棧的LR已不是原來需要的ADD指令的地址,從而使子程序Foo()無法正確返回。 AnEmbeddedLinuxTech.ProviderinMainland4.這個

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論