打印

关于MSP430堆栈的问题

[复制链接]
2822|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ar_m_cu|  楼主 | 2014-6-23 18:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
MSP430AFE253 程序运行一段时间后堆栈出错,错误信息如下:



从图中可以看出,程序在运行了大约50分钟后出现了这个问题,有人遇到过这样的问题吗,求指导?
说明:看门狗已关闭,使用内部DCO时钟,8MHz
程序很简单,只有一个 SD24A 的采样程序,连续采样,程序如下:
void main(void)
{
  StartUp();
  Sd24aInit();
  while(1)
  {
    StartConvert();                  // 触发一次转换
    __bis_SR_register(LPM0_bits);    // 进入低功耗模式,采样完成后在中断中退出低功耗
    if(Sd24aFlag & Sd24aSelfCal)     // SD24A 自校准模式
    {
      Sa24aDataSum[0] += Sd24aTemp[0];   // 采样值累加
      Sa24aDataSum[1] += Sd24aTemp[1];
      Sa24aDataSum[2] += Sd24aTemp[2];
      Sd24aSampleCnt++;
      if(Sd24aSampleCnt >= Sd24aSelfCalCntMax)
      {
        CalZeroData[0] = Sa24aDataSum[0] / Sd24aSampleCnt; // 求平均
        CalZeroData[1] = Sa24aDataSum[1] / Sd24aSampleCnt;
        CalZeroData[2] = Sa24aDataSum[2] / Sd24aSampleCnt;
        Sa24aDataSum[0] = 0;                               // 累加和清零
        Sa24aDataSum[1] = 0;
        Sa24aDataSum[2] = 0;
        Sd24aSampleCnt = 0;                                // 采样计数清零
        //if(a >= 0)
        {
        SD24INCTL0 = SD24A0_INCH | SD24A0_GAIN;            // 切换采样通道
        SD24INCTL1 = SD24A1_INCH | SD24A1_GAIN;
        SD24INCTL2 = SD24A2_INCH | SD24A2_GAIN;
        Sd24aFlag &= ~Sd24aSelfCal;                        // 清校准状态标志
        Sd24aFlag |= Sd24aSelfCalFin;                      // 置校准完成标志
        }
        //a++;
      }
    }
    else
    {
      Sa24aDataSum[0] += Sd24aTemp[0];   // 采样值累加
      Sa24aDataSum[1] += Sd24aTemp[1];
      Sa24aDataSum[2] += Sd24aTemp[2];
      Sd24aSampleCnt++;
      if(Sd24aSampleCnt >= Sd24aSelfCalCntMax)
      {
        ConvertData[0] = Sa24aDataSum[0] / Sd24aSampleCnt; // 求平均
        ConvertData[1] = Sa24aDataSum[1] / Sd24aSampleCnt;
        ConvertData[2] = Sa24aDataSum[2] / Sd24aSampleCnt;
        Sa24aDataSum[0] = 0;                               // 累加和清零
        Sa24aDataSum[1] = 0;
        Sa24aDataSum[2] = 0;
        Sd24aSampleCnt = 0;                                // 采样计数清零
        ConvertData[0] -= CalZeroData[0] - 212;                  // 减去偏移值
        ConvertData[1] -= CalZeroData[1] - 491;
        ConvertData[2] -= CalZeroData[2] + 575;                  // 以下计算端口采样电压
        ConvertVoltage[0] = 1250.0 * ConvertData[0] / 0xFFFFF / SD24A0_GAIN_VALUE;
        ConvertVoltage[1] = 1250.0 * ConvertData[1] / 0xFFFFF / SD24A1_GAIN_VALUE;
        ConvertVoltage[2] = 1250.0 * ConvertData[2] / 0xFFFFF / SD24A2_GAIN_VALUE;
      }
    }
  }
}

/**
  * @brief  SD24A 配置
  * @param  None
  * @retval None
  */
void Sd24aInit(void)
{
  SD24CTL = (SD24A_CLKSRC | SD24A_CLKDIV);
  
  SD24CCTL0 = SD24A0_POLAR | SD24SNGL | SD24GRP | SD24A0_OSR | SD24LSBTOG;
  SD24CCTL1 = SD24A1_POLAR | SD24SNGL | SD24GRP | SD24A1_OSR | SD24LSBTOG;
  SD24CCTL2 = SD24A2_POLAR | SD24SNGL | SD24IE | SD24A2_OSR | SD24LSBTOG;
  
  SD24INCTL0 = SD24A_INCH_PGA | SD24A0_GAIN;
  SD24INCTL1 = SD24A_INCH_PGA | SD24A1_GAIN;
  SD24INCTL2 = SD24A_INCH_PGA | SD24A2_GAIN;
}

/**
  * @brief  SD24A 中断
  * @param  None
  * @retval None
  */
#pragma vector = SD24_VECTOR
__interrupt void SD24AISR(void)
{
  switch(SD24IV)
  {
  // 数据溢出中断
  case 2:
    break;
  // SD24_A0 中断
  case 4:
    break;
  // SD24_A1 中断
  case 6:
    break;
  // SD24_A2 中断
  case 8:
    Sd24aTemp[0] = SD24MEM0;
    Sd24aTemp[1] = SD24MEM1;
    Sd24aTemp[2] = SD24MEM2;
    Sd24aTemp[0] = (Sd24aTemp[0] << 4) + (SD24MEM0 & 0xF);
    Sd24aTemp[1] = (Sd24aTemp[1] << 4) + (SD24MEM1 & 0xF);
    Sd24aTemp[2] = (Sd24aTemp[2] << 4) + (SD24MEM2 & 0xF);
    break;
  default:
    break;
  }
  __bic_SR_register_on_exit(LPM0_bits);
}

相关帖子

沙发
comeon201208| | 2014-6-23 21:12 | 只看该作者
这个需要优化下你的程序的,,主要看下你的局部变量的,,尽量减少吧

使用特权

评论回复
板凳
dirtwillfly| | 2014-6-23 22:01 | 只看该作者
貌似变量越界了

使用特权

评论回复
地板
ar_m_cu|  楼主 | 2014-6-23 22:30 | 只看该作者
comeon201208 发表于 2014-6-23 21:12
这个需要优化下你的程序的,,主要看下你的局部变量的,,尽量减少吧

这个只是个很简单的采样程序,全局变量总共用了不到70个字节,没有使用到局部变量,可能产生的局部变量只可能是MCU计算的时候用到的中间变量

使用特权

评论回复
5
hxfxt| | 2014-6-23 22:31 | 只看该作者
这个我单步调试的时候也会遇到这样的情况!但我的貌似没对程序影响呢!你的有影响吗?

使用特权

评论回复
6
ar_m_cu|  楼主 | 2014-6-23 22:32 | 只看该作者
dirtwillfly 发表于 2014-6-23 22:01
貌似变量越界了

根据提示确实是变量越界的现象,但是程序中并没有用很多的全局变量和局部变量,很费解啊

使用特权

评论回复
7
ar_m_cu|  楼主 | 2014-6-23 22:34 | 只看该作者
hxfxt 发表于 2014-6-23 22:31
这个我单步调试的时候也会遇到这样的情况!但我的貌似没对程序影响呢!你的有影响吗? ...

恩,有点影响,调试模式全速运行,运行长时间后可能会死机,然后就出现图中的提示。

使用特权

评论回复
8
ar_m_cu|  楼主 | 2014-6-23 22:35 | 只看该作者
hxfxt 发表于 2014-6-23 22:31
这个我单步调试的时候也会遇到这样的情况!但我的貌似没对程序影响呢!你的有影响吗? ...

单步调试的时候可能是和调试器通信,进而产生大量的通信数据的原因吧

使用特权

评论回复
9
firstblood| | 2014-6-24 22:39 | 只看该作者
堆栈遵循的是先入先出原则的,,这个还要看下单片机的存储空间够不够的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:初出茅庐,天下无敌,再学三年,寸步难行

61

主题

1200

帖子

7

粉丝