MSP430升級程序
1、這幾天測試寫好的IAP升級程序,真是一個糟,能將程序下載進去,但無法運行。
經過各種測試,修改終于找到了問題的原因,現在大致總結下我在寫IAP程序的時候
遇到的問題和解決方案。首先要實現單片機的IAP升級程序,我們要知道自己的IDE如何能
將程序的函數或者變量的編譯地址固定,因為對于bootload程序,我們要固定它的地址,
還有從bootload跳轉到的程序運行的地址。
對于MSP430,在測試中我程序復位時跳轉到rts430x.lib:boot.obj (.text:_isr:
_c_int00_noexit)這樣一個啟動函數,之后執(zhí)行_syatem_pre_int->_auto_init->main,
在_auto_init過程中,程序會執(zhí)行memcpy函數(將.cinit段賦值到RAM里),就是初始化RAM中的全局變量了。我的程序主要錯在這個過程里,導致更新后問題不斷,還有對于.cinit段和.const段,我們也要固定地址,因為memcpy函數初始化ram的地址被固定了,且bootload是不能更新的,所以固定.cinit段后,我們memcopy操作地址就固定,不然當程序變化重新編譯后可能就會事.cinit段的地址發(fā)生變化,導致ram初始化錯誤。
這樣修改后,程序大致就能自升級了,程序只升級運行部分的程序,對bootload程序不升級。
2、_c_int00 是c語言程序的入口.首先上電后,系統執(zhí)行reset矢量代碼,該代碼是我們寫的話,我們就令cpu轉到c_int00,這段程序為c語言運行作準備,準備工作做好后,就轉到c語言的main()。
如果reset矢量代碼不是我們寫的,是ti寫的,那么就執(zhí)行bootloader程序,該程序先將從某個外部得到的真正程序放在規(guī)定的地方,然后轉過去執(zhí)行該代碼。
那么如何決定reset矢量代碼是ti寫的還是我們寫的,那就看復位后mp/mc腳的電平。
要是調試的時候我們的mp/mc腳選擇了我們不希望的方式,怎么辦?(在調試的時候一般不管bootloader的,只有項目最后成功了才管),用jtag來控制。
C程序開始運行時,必須首先初始化C運行環(huán)境,這是通過c_int0函數完成的,這個函數在運行支持庫(rts,runtime-support library)中。連接器會將這個函數的入口地址放置在復位中斷向量處,使其可以在初始化時被調用。c_int0函數進行以下工作以建立C運行環(huán)境:為系統堆棧產生.stack塊,并初始化堆棧指針。從.cinit塊將初始化數據拷貝到.bss塊中相應的變量。調用main函數,開始運行C程序。用戶可以對c_int0函數進行修改,但修改后的函數必須完成以上任務。