fjf429 发表于 2011-7-15 16:30:23

5438A里面定义超大数组出错,为什么?

例如:
char a;

void main(void)
{
   long i;
   for(i=0;i<10240;i++)
   {
   a=0x00;
   }
   while(1);
}
用IAR调试时就会死在data20的初始化处,这是为什么?难道不能建立大数组吗?

changlyou77 发表于 2011-7-15 16:58:21

是不是堆栈溢出了

wozai2513 发表于 2011-7-15 17:07:13

回复【1楼】changlyou77
-----------------------------------------------------------------------

没关看门狗。即使关了,也不行,要加一段话。in __low_level_init
http://supp.iar.com/Support/?note=37778&from=search+result

yanxiao1227 发表于 2011-7-15 17:08:31

应该不是,是不是超过了RAM的大小了?

另外:5438A是什么?

wozai2513 发表于 2011-7-15 17:10:09

回复【3楼】yanxiao1227
-----------------------------------------------------------------------

msp430 F5438的增强型吧

tingbin 发表于 2011-7-15 17:11:16

回复【楼主位】fjf429
-----------------------------------------------------------------------

加上 no_init 就可以了

huchunlei 发表于 2011-7-18 02:04:41

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。

当然你也可以把所有的硬件初始化的语句写在这个函数里面,这样硬件将会在单片机复位后第一时间进行初始化。

fjf429 发表于 2011-7-25 09:36:33

回复【6楼】huchunlei
-----------------------------------------------------------------------

非常感谢6楼的朋友,问题解决了。
页: [1]
查看完整版本: 5438A里面定义超大数组出错,为什么?