问:MSP430初始化大量数据时跑飞的问题 问者 Qingcui Lu

    我最近在用MSP430F5438A写一个fft(快速傅立叶)算法时,发时程序无法时行调试也无法进入中断。在TI的外国论坛上看到原因大概是因为文件中有大量的待初始化数据,在完成数据初始化之前,看门狗不会关闭,当数据初始化用时过多时会因为看门狗复位使程序无法正常运行。据说要在初始化数据之前调用 __system_pre_init() ,但鄙人英文不太好,不知道具体的该如何。希望 大家给予解惑,谢谢!


回复: by Heng Zhao

你这个问题我之前遇到过,我当时是这么解决的:把需要初始化的数组和变量先定义成 __no_init 类型的,然后在主程序里初始化这些数组和变量,这样就不会出现这个问题了。


问者: by Qingcui Lu

这样定义吗:__no_init dat[256];

编译出错说什么定义这个类型。具休怎么用,举个例子吧,谢了!

答者 Lina Lian

Qingcui Lu,

将下列代码放在main函数之前即可。你先试试。会在初始化数据之前,会先进入下列函数将看门狗关掉。

#include <intrinsics.h>
#include "msp430.h"

int _system_pre_init(void)
{
/* Insert your low-level initializations here */

/* Disable Watchdog timer to prevent reset during */
/* long variable initialization sequences. */
WDTCTL = WDTPW | WDTHOLD;

/*==================================*/
/* Choose if segment initialization */
/* should be done or not. */
/* Return: 0 to omit initialization */
/* 1 to run initialization */
/*==================================*/
return 1;
}

回复: by Lina Lian

上述代码是用于CCS的,若为IAR,则为:

// global variable for storing the reset cause
__no_init unsigned int SysRstIv;
 
int __low_level_init(void)
{
  // stop WDT
  WDTCTL = WDTPW + WDTHOLD;
 
  // Perform data segment initialization
  return 1;
}


回复: by Qingcui Lu

确实是这样,非常感谢!