1 嵌入式軟體開發流程
參照嵌入式軟體的開發流程。第一步:工程建立和配置。第二步:編輯源檔案。第三步:工程編譯和連結。第四步:軟體的調試。第五步:執行檔案的固化。
在整個流程中,使用者首先需要建立工程並對工程做初步的配置,包括配置處理器和配置調試裝置。編輯工程檔案,包括自己編寫的彙編和C語言來源程式,還有工程編 譯時需要編寫的連結指令檔,調試過程中需要編寫儲存區映像檔案和命令指令檔,以及上電複位時的程式運行入口的啟動程式檔案。
對後四種檔案的理解很重要,其作用解釋如下:
(1) 連結指令檔:在程式編譯時間起作用。該檔案描述代碼連結定位的有關資訊,包括程式碼片段,資料區段,位址區段等,連結器必須使用該檔案對整個系統的代碼做正確的定 位。在SDRAM中偵錯工具、在FLASH中調試或固化後啟動並執行連結指令檔應加以區分。(在IDE開發環境中使用副檔名*.ld)
(2)命令指令檔:在SDRAM中偵錯工具時起作用。在Integration Environment與目標串連時、軟體調試過程中以及目標板複位後,有時需要Integration Environment自動完成一些特定的操 作,比如複位目標板、清除看門狗、屏蔽中斷寄存器、儲存區映射等。這些操作可以通過執行一組命令序列來完成,儲存一組命令序列的文字檔稱為命令指令檔 (在 IDE開發環境中使用副檔名*.cs)。
(3)儲存區映像檔案:在SDRAM中偵錯工具時起作用。在軟體調試過程中訪問非法儲存區在部分處理器和目標板上會產生異常,如果異常沒有處理,則會導致 軟體調試過程無法繼續,為了防止以上問題並調整模擬器訪問速度以達到最合適的水平,提供這樣一種用於描述各個儲存區性質的檔案叫儲存區映像檔案(在IDE 開發環境中使用副檔名*.map)。
在程式的調試過程中可以選擇使用儲存區映像檔案*.map和命令指令檔*. cs配合程式的調試。
(4) 開機檔案:它主要是完成一些和硬體相關的初始化的工作,為應用程式做準備。一般,啟動代碼的第一步是設定中斷和異常向量;第二步是完成系統啟動所必須的寄 存器配置;第三步設定看門狗及使用者設計的部分外圍電路;第四步是配置系統所使用的儲存區配置地址空間; 第五步是變數初始化;第六步是為處理器的每個工作模式設定棧指標;最後一步是進入進階語言入口函數(Main函數)。
2 中斷程式設計
中斷調試方面可以採用類似向量中斷動態處理方式,讓中斷對應的確定地址代碼調轉到RAM的固定地址處,定義一個函數指標指向該固定地址,就可以隨時通過替換RAM固定地址處的代碼,實現動態改變中斷處理函數。
具體方法是:
(1)將中斷源函數指標定義在RAM中相對的固定地址,建立中斷向量表;
void SetInterrupt (U32 vector, void (*handler)()){ InterruptHandlers[vector] = handler;} |
void SetInterrupt (U32 vector, void (*handler)())
{
InterruptHandlers[vector] = handler;
}
(2)在程式中,調用具體某中斷源的中斷處理函數;
如: SetInterrupt(IIC_INT,IICWriteIsr);
/* 聲明IIC中斷處理函數,其中IIC_INT為 IIC中斷源序號,IICWriteIsr為 IIC的寫中斷處理函數 */
(3)在0x18處的IRQ或0x1C處的FIQ中斷入口函數中,擷取中斷源、清除中斷掛起標誌、通過已定義的中斷源函數指標進入使用者具體某中斷處理常式。
void ISR_IrqHandler(void){ IntOffSet = (unsigned int)INTOFFSET; Clear_PendingBit(IntOffSet>>2) ;(*InterruptHandlers[IntOffSet>>2])();// 調用具體某中斷處理常式} |
void ISR_IrqHandler(void)
{
IntOffSet = (unsigned int)INTOFFSET;
Clear_PendingBit(IntOffSet>>2) ;
(*InterruptHandlers[IntOffSet>>2])();
// 調用具體某中斷處理常式
}
採用動態中斷處理方法,在中斷源較多的情況下,中斷回應時間和程式效能得到最佳化。另外,在調試方面,此處理方法具有便於跟蹤調試的優點,並且根據需要,可以方便變換中斷處理函數。
3 中斷調試
軟體調試可以在SDRAM中或FLASH中進行。在SDRAM中,讀寫方便,訪問速度快。一般軟體調試應在RAM中完成,但當RAM空間小於FLASH程 序空間,程式只能在FLASH運行和調試時,或者使用者希望瞭解程式在FLASH中實際運行情況時,就可以在FLASH中進行程式調試。
進行中斷調試時,應注意中斷入口位於SDRAM中或FLASH中0x18或0x1c地址,連結指令檔必須使整個系統的代碼正確定位於0x0起始處,但SDRAM或FLASH對應的連結指令檔及工程配置注意區別。
(1)程式在SDRAM中運行
在SDRAM中調試,使用SDRAM對應的連結指令檔。調試過程需要以下幾步:編譯、連結工程;串連模擬器和電路板;下載程式(在IDE開發環境中使用副檔名*.elf);調試。
下載程式前必須啟動命令指令檔完成前述的一些特定的操作,命令指令檔的啟動在串連模擬器時自動進行,其中儲存區映射應與程式在SDRAM中運行時相 同,保證整個系統的代碼正確定位於0x0起始處。下載程式的起始地址也為0x0,下載成功後便可進行調試工作。
(2)程式在FLASH中運行
在FLASH中調試,使用FLASH對應的連結指令檔。調試過程需要以下幾步:編譯、連結工程;串連模擬器和電路板;程式格式轉換(*.elf轉換為*.bin);固化*.bin程式;調試。
串連模擬器後不需要下載程式,儲存區映射由本身工程中開機檔案運行完成,不需要命令指令檔。在本環境調試過程中,可以設定兩個硬體斷點。
(3)程式從FLASH中調到SDRAM中運行
在某些應用場合,強調程式運行速度的情況下,希望程式在SDRAM中運行,這樣就需要將FLASH中儲存的程式,在系統上電後搬運到SDRAM某空間位置,然後自動運行。這種所謂的Bootloader技術,在DSP系統中常被採用。
調試過程分兩步:
(a)首先將使用者程式在SDRAM中調試通過,然後將*.bin檔案固化到FLASH某一非0扇區地址空間;
(b) 將自己編寫的Bootloader搬運程式調試通過並將Bootloader.bin檔案固化到FLASH的 0扇區地址空間,搬運程式在系統上電後,將(a)中FLASH某一非0扇區地址空間儲存的程式,搬運到在SDRAM調試中同樣的空間位置,實現程式在 SDRAM中啟動並執行目的。
另外注意,因為使用者實際的程式中斷入口必須位於FLASH的0x18或0x1c地址,所以Bootloader搬運程式還應具有中斷入口的跳轉功能,即把 PC指標由此轉向處於SDRAM空間的中斷程式入口表,就是整個使用者程式被搬運到SDRAM的那一位置。
如:LDR PC, =HandleIRQ
// HandleIRQ位於SDRAM空間中斷程式入口表