嵌入式調試方式(IAR 環境)

對嵌入式軟件的開發,講解的教程、教材都比較多,但這些都還只是在理論上進行說明,並且,對開發環境、仿真器的作用對於一個嵌入式開發的門外漢來講都是非常複雜的知識,這裏就將我所總結出來的嵌入式開發過程的相關概念進行一下解釋,主要是對ARM嵌入式中關於片內flash,片外flash,片內RAM,片外RAM的相關調試工作進行一下詳細的說明。

我所獲取的知識的實踐環境還是老樣子:IAR+JLINK V7.0,這套環境說明一下:IAR是一套非常成熟的嵌入式開發環境,之所以選擇它,是因爲入門時的項目就是拿他做的,當時用的是LM1138 是M3的ARM核。作爲一個嵌入式的門外漢辛辛苦苦的詳細瞭解了IAR環境的一個調試過程,然後就產生了惰性,哈哈,懶得用別的開發環境了。其實就是這樣的,做軟件開發的,尤其是嵌入式軟件開發,你用什麼開發工具其實都是一樣的,幾種開發工具ADS,IAR,MDK其實都是各有優缺點的,我感覺IAR的環境下官方例程較多,如果採用比較常見的MCU的話,基本在裏面都能找到相應的例程的;並且IAR是在不斷更新的,目前的最新版本已經到了5.4.1了,相對非常成熟,對各種新的核心支持非常及時;ADS是早期對ARM開發支持的最好的環境之一,兼容所有ARM指令集、僞指令集,應該可以說是標準的開發環境了,但ADS環境永遠停留在了1.2版本上,對新ARM核的支持已經無從談起,它在設計上比較優越的就是將軟件調試AXD與編輯ADS是分開兩個程序的,我們可以使用ASD對非ADS開發的bin程序進行調試,算是比較方便的,網上的資源相對來講也是比較多的,如果是嵌入式愛好者使用ADS作爲開發環境還是相當不錯的。MDK沒有用過,不太清楚,不過MDK是ARM在放棄ADS環境支持後選擇的第二個官方編譯環境,對新內核的支持也是非常迅速的。總的說來,做嵌入式軟件開發,選用哪一中開發環境其實都是沒有什麼關係的,從開發上來講,他們的主要區別主要還是集中在彙編指令不同、程序入口函數名不同等等,這些非常細節上的東西,對程序主體所使用的C語言是完全相同的。這些開發環境在網上都有相應的破解版,如果是個人作爲學習之用選擇哪一個都是無所謂的。

作爲仿真器來講,JLINK我認爲是非常值得推薦的,主要原因還是JLINK破解的非常完善,隨便在淘寶上一搜就有一堆,現在的價錢又非常的便宜,一般在80塊左右使用起來就沒有問題了,與正版的JLINK在功能上現在已經沒有什麼區別了。JLINK支持幾乎所有片內flash燒錄,以及大部分的Norflash的燒錄。但JLINK不支持直接的NANK flash的燒錄。而目前對產品開發來說所使用的仿真器如ZLG的AK100來說是支持NAND flash的直接燒錄的。並且在IAR下不論使用JLINK方式還是RDI的調試方式,都是不能使用JLINK的Norflash燒錄程序的,只能使用片內flash的燒錄算法。

好啦,上面的工具說明就說到這裏;下面主要說一下關於IAR環境調試的主要方式。在嵌入式開發中,由於對flash芯片的燒錄速度較慢,讀取flash芯片的速度也非常慢,而調試的時候需要頻繁修改程序,對程序的讀取、寫入速度對開發速度影響很大。因此對調試來說,一般講程序直接燒入片內ram或者是片外的ram中運行的,這樣調試速度極快。這在IAR中是通過在linker中所設置的icf文件所實現的,在調試時,我們一般講icf中RAM ROM都設置爲片內ram的地址範圍,這樣程序在鏈接時所使用的地址範圍都在片內ram中,IAR調試時將程序鏡像放於片內RAM中,跳轉到入口程序__iar_start就可以對程序進行調試了。但有時片內RAM空間並不夠使用,我們需要使用片外的RAM,但是我們需要知道,使用片外RAM的話我們需要首先設置CPU內相應的存儲器管理寄存器,告訴CPU如何訪問片外RAM(主要有片外RAM 地址、大小、位寬、時序等)這部分工作是需要在程序寫入片外RAM之前就完成的,所以將這部分指令實現爲IAR下的linker設置中的mac文件,在該文件中完成對CPU相關寄存器的設置後,IAR通過仿真器向片外RAM寫入數據。這裏需要說明一個問題就是異常向量的訪問,我們在片內或者片外RAM中調試程序的時候,是不能夠運行正常的異常向量的,我們知道異常向量表是在地址空間0x000000的位置的,一般是flash空間,(不經過Remap,MMU的修改,關於Remap,MMU在這裏就不進行展開說明了,改日再討論)而我們的程序都是寫入RAM地址空間的,這就導致我們的程序如果進入異常狀態那就肯定會跑飛,就是說程序跳轉到異常處理函數,而異常處理函數又指向一個不存在的函數地址,這樣就非常不方便調試異常狀態了。

再說一下關於片內flash,片外flash的調試方法,首先,我們要明確,只要是flash不管是NAND,還是Norflash,對flash芯片的訪問都是需要驅動程序的,這是嵌入式初學者經常糊塗的地方,對Norflash來說,它的地址線、數據線連接與片外SRAM,SDRAM其實是差不多的,爲什麼對SRAM,SDRAM我們只需要在mac文件中設置寄存器而flash確一定要使用驅動程序那,這裏,主要是對RAM的訪問,我們只需要設置地址、大小、位寬、時序就可以訪問了,而對flash來說,我們在向其中寫入或者讀出數據,我們首先要向flash芯片內相應的寄存器寫入命令才能都完成後續的讀取、寫入、設置的操作,這就是flash芯片驅動程序的作用。可能有人發現,IAR下對片內flash並沒有設置flash驅動程序啊,其實這部分在我們設置工程中使用的DEVICE名稱時就自動設置好啦,如我們使用LM1138的芯片,IAR在將程序寫入片內flash時,自動調用LM1138的flash驅動函數向flash中寫入程序。這樣片外flash又該如何操作那,這裏就要說一下啦,只要是flash就必須要有驅動,對flash芯片的燒錄過程就是首先,IAR在芯片的片內RAM中運行flash驅動程序,將程序燒錄入片內或者片外的flash芯片中。片內非flash驅動IAR已經自動設置好啦,片外的flash就需要我們來寫驅動了,這裏就有兩種方式來調用驅動了,一個是在IAR下編譯根據flash芯片的數據手冊編寫驅動,然後通過IAR的flashloader調用編譯好的驅動程序,片外flash芯片寫入數據。還有就是功能比較全面的仿真器,可以直接在設置時指定片外flash芯片驅動程序,IAR通過相應的調試接口支持相關的仿真器的在線調試。使用JLINK的話只能通過在IAR下編寫片外flash芯片驅動的方式開實現對片外flash芯片讀寫的需要。

最後說一下程序鏈接與程序燒錄的關係,在程序鏈接時指定ROM,RAM地址的範圍,ROM,RAM其實就相當於程序燒錄地址,也就是說,設置鏈接器地址時需要對應芯片數據手冊、開發板的地址空間範圍等,設計好程序運行地址空間,設置鏈接地址。

對很多概念我也不是很清楚,歡迎大家討論!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章