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