嵌入式軟件開發(fā)流程及ARM的中斷調(diào)試方法介紹
參照嵌入式軟件的開發(fā)流程。第一步:工程建立和配置。第二步:編輯源文件。第三步:工程編譯和鏈接。第四步:軟件的調(diào)試。第五步:執(zhí)行文件的固化。
在整個流程中,用戶首先需要建立工程并對工程做初步的配置,包括配置處理器和配置調(diào)試設備。編輯工程文件,包括自己編寫的匯編和C語言源程序,還有工程編譯時需要編寫的鏈接腳本文件,調(diào)試過程中需要編寫存儲區(qū)映像文件和命令腳本文件,以及上電復位時的程序運行入口的啟動程序文件。
對后四種文件的理解很重要,其作用解釋如下。
(1) 鏈接腳本文件:在程序編譯時起作用。該文件描述代碼鏈接定位的有關(guān)信息,包括代碼段,數(shù)據(jù)段,地址段等,鏈接器必須使用該文件對整個系統(tǒng)的代碼做正確的定位。在SDRAM中調(diào)試程序、在FLASH中調(diào)試或固化后運行的鏈接腳本文件應加以區(qū)分。(在IDE開發(fā)環(huán)境中使用擴展名*.Ld)
(2)命令腳本文件:在SDRAM中調(diào)試程序時起作用。在集成環(huán)境與目標連接時、軟件調(diào)試過程中以及目標板復位后,有時需要集成環(huán)境自動完成一些特定的操作,比如復位目標板、清除看門狗、屏蔽中斷寄存器、存儲區(qū)映射等。這些操作可以通過執(zhí)行一組命令序列來完成,保存一組命令序列的文本文件稱為命令腳本文件(在 IDE開發(fā)環(huán)境中使用擴展名*.Cs)。
(3)存儲區(qū)映像文件:在SDRAM中調(diào)試程序時起作用。在軟件調(diào)試過程中訪問非法存儲區(qū)在部分處理器和目標板上會產(chǎn)生異常,如果異常沒有處理,則會導致軟件調(diào)試過程無法繼續(xù),為了防止以上問題并調(diào)整仿真器訪問速度以達到最合適的水平,提供這樣一種用于描述各個存儲區(qū)性質(zhì)的文件叫存儲區(qū)映像文件(在IDE開發(fā)環(huán)境中使用擴展名*.Map)。
在程序的調(diào)試過程中可以選擇使用存儲區(qū)映像文件*.Map和命令腳本文件*. Cs配合程序的調(diào)試。
(4) 啟動文件:它主要是完成一些和硬件相關(guān)的初始化的工作,為應用程序做準備。一般,啟動代碼的第一步是設置中斷和異常向量;第二步是完成系統(tǒng)啟動所必須的寄存器配置;第三步設置看門狗及用戶設計的部分外圍電路;第四步是配置系統(tǒng)所使用的存儲區(qū)分配地址空間; 第五步是變量初始化;第六步是為處理器的每個工作模式設置棧指針;最后一步是進入高級語言入口函數(shù)(Main函數(shù))。
2 中斷程序設計
中斷調(diào)試方面可以采用類似矢量中斷動態(tài)處理方式,讓中斷對應的確定地址代碼調(diào)轉(zhuǎn)到RAM的固定地址處,定義一個函數(shù)指針指向該固定地址,就可以隨時通過替換RAM固定地址處的代碼,實現(xiàn)動態(tài)改變中斷處理函數(shù)。
具體方法是:
(1)將中斷源函數(shù)指針定義在RAM中相對的固定地址,建立中斷矢量表;
Void SetInterrupt (U32 Vector, Void (*Handler)())
{
InterruptHandlers[Vector] = Handler;
}
(2)在程序中,調(diào)用具體某中斷源的中斷處理函數(shù);
如: SetInterrupt(IIC_INT,IICWriteIsr);
/* 聲明IIC中斷處理函數(shù),其中IIC_INT為 IIC中斷源序號,IICWriteIsr為 IIC的寫中斷處理函數(shù) */
(3)在0x18處的IRQ或0x1C處的FIQ中斷入口函數(shù)中,獲取中斷源、清除中斷掛起標志、通過已定義的中斷源函數(shù)指針進入用戶具體某中斷處理程序。
Void ISR_IrqHandler(Void)
{
IntOffSet = (Unsigned Int)INTOFFSET;
Clear_PendingBit(IntOffSet>>2) ;
(*InterruptHandlers[IntOffSet>>2])();
// 調(diào)用具體某中斷處理程序
}
采用動態(tài)的中斷處理方法,在中斷源較多的情況下,中斷響應時間和程序性能得到優(yōu)化。另外,在調(diào)試方面,此處理方法具有便于跟蹤調(diào)試的優(yōu)點,并且根據(jù)需要,可以方便變換中斷處理函數(shù)。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論