5438A里面定义超大数组出错,为什么?
例如:char a;
void main(void)
{
long i;
for(i=0;i<10240;i++)
{
a=0x00;
}
while(1);
}
用IAR调试时就会死在data20的初始化处,这是为什么?难道不能建立大数组吗? 是不是堆栈溢出了 回复【1楼】changlyou77
-----------------------------------------------------------------------
没关看门狗。即使关了,也不行,要加一段话。in __low_level_init
http://supp.iar.com/Support/?note=37778&from=search+result 应该不是,是不是超过了RAM的大小了?
另外:5438A是什么? 回复【3楼】yanxiao1227
-----------------------------------------------------------------------
msp430 F5438的增强型吧 回复【楼主位】fjf429
-----------------------------------------------------------------------
加上 no_init 就可以了 IAR编译的方法,导致看门狗溢出了。 单片机上电的时候看门狗已经启动, 但是在进入main函数之前,软件会首先去初始化你用到的一些数据,比如数组之类的, 如果你的数组定义的比较大, 那么初始化的时间就会很长,当然在这过程中,看门狗的时间就到了,单片机复位,然后在启动,在初始化……,这样循环。
解决方法是,使用低级初始化函数, IAR编译的时候,会自动把低级初始化的函数放在程序的最开始处,这样你可以在低级初始化函数里面先把看门狗关掉, 等低级初始化函数执行完了,才会进行数据初始化的处理,在然后才执行main函数,
详细解决方法参考IAR的这篇文档:http://supp.iar.com/Support/?note=37778&from=search+result
按照IAR的这个方法,如果你觉得添加文件麻烦,实际上最简单的是,自己编写一个 __low_level_init 函数, 就行了, 这个函数不需要你在主函数里面调用, 这个函数会被编译器编译在程序的最开始部分。
下面是我写的一个简单的程序,测试通过,供参考:
#include "msp430f5438.h"
unsigned char buffer0;
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 % 256;
}
while(1)
{
for(i=0;i<10240;i++)
P1OUT = buffer0;
}
}
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 这个函数,直接把关闭看门狗的语句写道主函数里面,单片机将永远进入不了main。
当然你也可以把所有的硬件初始化的语句写在这个函数里面,这样硬件将会在单片机复位后第一时间进行初始化。 回复【6楼】huchunlei
-----------------------------------------------------------------------
非常感谢6楼的朋友,问题解决了。
页:
[1]