這兩天利用MSP430做一個小系統(tǒng),需要定義一個很大的全局?jǐn)?shù)組,編譯之后沒有問題,但是調(diào)試的時候卻遇到了問題。下面我們先來看下遇到的問題。
問題:
利用CCS軟件將代碼燒入430之后,在還沒有點擊開始運行時,程序就已經(jīng)開始自動運行了如下圖所示,在點擊暫停之后,程序就報錯了。在把那個數(shù)組元素個數(shù)改的很小之后,程序就正常了。所以可以斷定,是由于定義大數(shù)組產(chǎn)生的問題。

問題分析:
通過查找資料,發(fā)現(xiàn)產(chǎn)生這個問題的原因是因為全局?jǐn)?shù)組定義過大時,系統(tǒng)一上電,需要對這些數(shù)組初始化,初始化的時間過長,導(dǎo)致看門口溢出,從而一直進不了主函數(shù),導(dǎo)致程序跑飛了。
解決方案:
(1)編寫C啟動函數(shù)
在TI官網(wǎng)找了有關(guān)CCS的資料之后,找到了解決方案。
除了主函數(shù)之外,我們需要再定義一個函數(shù),函數(shù)名為的_system_pre_init(),在CCS編譯器中,這是一個C啟動函數(shù),是在主函數(shù)開始執(zhí)行之前執(zhí)行的,所以在該函數(shù)里,加入關(guān)閉看門口的代碼就可以解決這個問題了~
在IAR編譯器中,也有類似的函數(shù),為__low_level_init(),使用方法與上文提到的相同。
(2)將大數(shù)組放在RAM的不初始化區(qū)域
既然已經(jīng)知道是初始化時間過長導(dǎo)致這個問題,我們可以把大數(shù)組定義在RAM的不初始化區(qū)域就行了。
在IAR編譯器中,在定義變量之前,加上__no_initm命令即可,如__no_init char a; 即把a這個字符型變量放在RAM的不初始化區(qū)域。
在CCS編譯器中,沒有這樣的命令,需要做類似的操作的話,有些繁瑣,需要自己改寫CMD文件,這里就不再贅述了。大家有興趣的話,可以到TI官網(wǎng)下載相應(yīng)的文檔看一下。