Win32環境下輕鬆調試單板安全模式軟體下載功能
來源:互聯網
上載者:User
Win32環境下輕鬆調試單板安全模式軟體下載功能溫輝敏(wenhm@sina.com)摘要:本文首先提出了在單板環境下調試軟體下載功能的低效率和複雜性,然後進行了Win32環境下調試軟體下載功能的可行性分析。給出了Win32環境下調試軟體下載功能的具體實施過程,由於可以在Win32環境下採用VC ++等良好的IDE進行開發和調試,並且避免了升級升壞了系統時的重新升級整個系統的過程,大大的提高了效率,對於要進行單板安全模式軟體下載功能開發的項目具有極大的借鑒意義。一、問題的提出局端MCU項目要實現安全模式軟體下載功能,該項目的主控程式是運行在IDT438晶片上的單板程式,由於在安全模式下檔案系統為RAMDISK方式,即所有的檔案系統都是放在記憶體中的,所有的檔案操作都是在記憶體中並不會實際反映到Flash上去的。因此若想將資料儲存到Flash上只能採取直接操作Flash分區裝置(標準字元裝置)的方式來完成。若直接在單板上調試該功能就存在如下問題:l 在單板上只能通過GdbServer來進行跟蹤調試,調試比難。l 沒有好的方式來查看寫入到Flash上的資料是否正確。l 調試階段寫入錯誤資料是不可避免的(除非程式不經任何測試一次成型,^_^),當程式寫入錯誤資料到Flash上去,由於破壞了原有的資料,系統重啟之後將起不來,只能重新升級整個系統。而每次整體升級都很費時間,大大降低效率。基於以上問題,為了迅速有效完成該功能,決定嘗試是否可以在Win32環境下完成調試,調試正確後再上單板測試這樣可以極大的縮短開發、調試時間。[1]二、解決思路2.1可行性分析在單板上對Flash分區的讀寫操作是通過操作MTD (Memory Technology Device)來進行的,MTD裝置採用標準字元裝置操作介面。通過對相應字元裝置檔案操作即可以完成對裝置的讀寫,也就是說對Flash的普通讀寫操作可以像正常檔案一樣讀寫(一致的定位、讀寫),Flash裝置操作和普通檔案操作的不同點是:1)使用特殊介面獲得flash分區大小;2)在寫一段地區之前,必須保證該地區已經是被擦除的,只有那個位元組的內容為0xFF,flash介面才允許你寫入資料到裡面去;3) 對地區的擦除是以block為單位來做的,block單位就是通過ioctl獲得的erasesize;同樣,erase一個block也是通過ioctl來實現。[2]也就是我們要用到的有別於一般檔案操作的Flash操作介面有:l 擷取Flash分區大小,包括block的大小,該介面名字為flash_getsize(底層驅動提供)。l 擦除某段地區的Flash內容,該介面名字為flash_erase(底層驅動提供)。其它操作則採用open、write、read等字元裝置操作介面,由上可見,只要我們在Win32平台上實現兩個對應的介面flash_getsize和flash_erase即可以讓操作Flash那段代碼在Win32平台運行了,而在Win32平台下可以以檔案類比作為單板上的MTD裝置。2.2具體實施2.2.1介面實現對於介面flash_getsize的Win32實現,可以直接讓該函數返回分區大小為所操作的檔案大小;block的大小由於單板上的作業系統和驅動一旦定製好block的值就是固定的了,所以block的大小返回單板上固定的block大小即可。介面flash_erase的Win32實現,可以實現為將所操作的地區的位元組全部置為0xFF即可。完成上面的工作後,操作Flash的邏輯代碼可以在Win32平台上運行起來,採用普通檔案來類比單板MTD裝置進行讀寫操作了。在Win32上使用VC++ IDE環境能方便的進行調試,開啟相應操作的檔案直接查看二進位內容就可以看到寫入到Flash上去的東西是否正確。2.2.2注意事項Windows下open二進位檔案要加O_BINARY選項,不然系統預設開啟為文字檔將對斷行符號分行符號將進行替換操作導致檔案內容和寫入資料的不一致。 三、實踐情況打好樁做好一切鋪墊工作後,就可以開始在Win32環境下調試Flash操作的邏輯代碼了,由於直接查看相應檔案的二進位內容就能方便看到寫入的資料,很迅速的就調通了如下功能:l 設定系統下次啟動是否進入安全模式的標誌位的功能l 設定IP地址進入工作模式區的功能l 設定在Flash中定址某個分區頭定位分區的功能l 鏡像檔案下載功能四、效果評價整個安全模式軟體下載更新功能中最重要的一點就是要保證寫入到Flash上的資料和下載的源檔案內容要一致,這個只要使用一個二進位檔案比較工具將完成下載操作的類比MTD裝置的檔案和源檔案比較一下就可以知道下載是否正確完成了。而如果在單板上驗證該操作的話必須重啟系統,而且要老天保佑能進入系統,進入不了的話得重新升級整個系統,可見帶來的效率是異常明顯的。整個調試過程可以在VC++ IDE環境下完成,比之使用gdbserver方便了很多提高了調試效率,雖然很多人不屑於使用Win32環境進行編程,他們喜歡使用Linux下VI編輯器來編寫代碼,喜歡使用gdb來調試代碼,但見仁見智,現在的Kdevelop、Magic C++等Linux下可視化整合式開發環境的出現和普及其實也正是因為gdb調試的不方便和VI編輯器的局限性。 五、推廣建議本文適合推廣到所有要進行單板上Flash讀寫操作(有檔案系統的普通檔案操作除外)的項目,特別是安全模式下的軟體升級等Flash操作,若產品代碼不能全部移植到Win32環境下則只需將操作Flash的那部分邏輯代碼移植到Win32環境下測試就可以了。作者有2.2中介面的C++實現,若需要可以向作者索取。 參考資料[1].來自同事李春生的一些建議。[2].http://www.linux-mtd.infradead.org/,來自同事韋東山和雷明的一些建議。