MSP430定義超大數(shù)組的問題
IAR編譯的方法,導(dǎo)致看門狗溢出了。 單片機(jī)上電的時(shí)候看門狗已經(jīng)啟動(dòng), 但是在進(jìn)入main函數(shù)之前,軟件會(huì)首先去初始化你用到的一些數(shù)據(jù),比如數(shù)組之類的, 如果你的數(shù)組定義的比較大, 那么初始化的時(shí)間就會(huì)很長(zhǎng),當(dāng)然在這過程中,看門狗的時(shí)間就到了,單片機(jī)復(fù)位,然后在啟動(dòng),在初始化……,這樣循環(huán)。
解決方法是,使用低級(jí)初始化函數(shù), IAR編譯的時(shí)候,會(huì)自動(dòng)把低級(jí)初始化的函數(shù)放在程序的最開始處,這樣你可以在低級(jí)初始化函數(shù)里面先把看門狗關(guān)掉, 等低級(jí)初始化函數(shù)執(zhí)行完了,才會(huì)進(jìn)行數(shù)據(jù)初始化的處理,在然后才執(zhí)行main函數(shù),
詳細(xì)解決方法參考IAR的這篇文檔:http://supp.iar.com/Support/?note=37778&from=search+result
按照IAR的這個(gè)方法,如果你覺得添加文件麻煩,實(shí)際上最簡(jiǎn)單的是,自己編寫一個(gè) __low_level_init 函數(shù), 就行了, 這個(gè)函數(shù)不需要你在主函數(shù)里面調(diào)用, 這個(gè)函數(shù)會(huì)被編譯器編譯在程序的最開始部分。
下面是我寫的一個(gè)簡(jiǎn)單的程序,測(cè)試通過,供參考:
#include "msp430f5438.h"
unsigned char buffer0[10240];
void main(void)
{
unsigned int i;
P5SEL |= 0x0C; // Port select XT2
UCSCTL6 &= ~XT2OFF; // Enable XT2
UCSCTL3 |= SELREF_2; // FLLref = REFO
// Since LFXT1 is not used,
// sourcing FLL with LFXT1 can cause
// XT1OFFG flag to set
UCSCTL4 |= SELA_2; // ACLK=REFO,SMCLK=DCO,MCLK=DCO
// Loop until XT1,XT2 & DCO stabilizes
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
UCSCTL6 &= ~XT2DRIVE0; // Decrease XT2 Drive according to
// expected frequency
UCSCTL4 |= SELS_5 + SELM_5; // SMCLK=MCLK=XT2
P1DIR |= BIT0; // P1.0 output
for(i=0;i<10240;i++)
{
buffer0[i] = i % 256;
}
while(1)
{
for(i=0;i<10240;i++)
P1OUT = buffer0[i];
}
}
int __low_level_init(void)
{
WDTCTL = WDTPW+WDTHOLD; // Stop WDT
/* Insert your low-level initializations here */
/*
* Return value:
*
* 1 - Perform data segment initialization.
* 0 - Skip data segment initialization.
*/
return 1;
}
如上,如果沒有 __low_level_init 這個(gè)函數(shù),直接把關(guān)閉看門狗的語句寫道主函數(shù)里面,單片機(jī)將永遠(yuǎn)進(jìn)入不了main。
當(dāng)然你也可以把所有的硬件初始化的語句寫在這個(gè)函數(shù)里面,這樣硬件將會(huì)在單片機(jī)復(fù)位后第一時(shí)間進(jìn)行初始化。