ARM Cortex-M底層技術(九)KEIL MDK 分散加載示例1-更改程序運行基址

 

 

KEIL MDK 分散加載示例1-更改程序運行基址

    小編我一向主張在實戰中學習,不主張直接去去學習規則&定義,太枯燥,在實際應用中去摸索,纔會真正理解具體的技術細節,下面我們就通過實際的簡單用例來搞清楚分散加載。 

更改程序運行基址

    我們先來做一個最簡單的示例,然後逐步深入。

    這裏選擇一顆簡單一些的MCU,LPC824,一顆M0+作爲示例(因爲其比較簡單,作爲示例比較合適),我們先來看其默認的分散加載:

    

    加載域地址從0x00000000地址開始,大小爲0x8000(32KB),運行域(RO)從0x00000000開始,運行域(RW+ZI)從片內SRAM地址開始0x10000000。

    我們嘗試讓程序從0x00001000地址上開始運行,我們該如何修改?加載域以及RO運行域直接改成0x00001000???可行嗎?我們試試,我們把分散加載修改過來試試,看程序能不能運行。

    

    按照上圖修改分散加載,我們點擊DEBUG,看程序是否能夠正常調試,程序進入如下狀態:

    

    我們再之前的文章裏面介紹過,你可以去查一下芯片的Memory MAP,這個地址空間其實是BOOT ROM(之前文章有過介紹。不知道BOOT ROM是啥的出門左轉)你調試一下就會發現程序在裏面死循環無法正常運行。

    納尼?不能跑??WHY???分散加載不好使了?????我們仔細分析一下,哪裏出了問題,我們之前的文章說過MCU上電從BOOTROM啓動起來之後會默認去0x00000000地址上去找MSP,從0x00000004地址上去找PC,但現在程序的加載地址以及運行地址都變成0x00001000了,而不是0x00000000地址了,我們需要告訴MCU,默認地址變了,不是0x00000000。那怎麼告訴MCU呢?

    其實在M0+/M3/M4內核裏面有一個叫VTOR的寄存器(M0核裏面我記得是沒有),地址是0xE000ED08,這個寄存器用於設置異常&中斷向量表默認地址,我們需要在程序運行起來之前設置VTOR寄存器,告訴MCU,地址變成0x00001000了,那怎麼做呢?在這裏,如下圖:

    

    這裏有一個仿真器初始化文件,可以在程序下載之前寫一些寄存器做一些初始化之類的工作,是一個擴展名爲.ini的文件,也有其自己的語法,按照下圖編寫這個ini文件:

   

    這裏簡單解釋下這個ini文件的意思:FUNC的意思是定義一個函數,Setup()是對應的函數,內容大家都看得懂,直接給MSP以及PC賦值,然後寫0xE000ED08(VTOR寄存器)地址,告知MCU地址啓動地址改變了,最後一行代碼的意思是調用Setup()函數。然後把寫好的ini文件放到剛纔的位置上,如下圖:

    我們再次運行一次程序,如下,我們的程序完美運行:

    

    這只是一個最簡單的分散加載使用示例,我們會嘗試把代碼加載到RAM中運行,就像電腦和手機一樣;我們也會嘗試把單獨的一個函數或者一個變量加載到固定地址上;我們還會有把一個Flash空間加載多個image的示例等等。

    當然上面提到的.ini文件能做的事情也遠不止於此,以後我們還會多次涉及這個文件的用法。

原文鏈接:https://blog.csdn.net/weixin_39118482/article/details/80066566

發佈了17 篇原創文章 · 獲贊 16 · 訪問量 2458
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章