TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS570LS1227: 急求,TMS570内存被篡改,崩溃中……

Part Number:TMS570LS1227

  我有一个工程,功能很简单,定义了两个中断:

一个40us的定时器中断,目前没有重定义rtiNotification函数,库中自带week函数;

另一个是500us的het  pwm中断,重定义pwmNotification函数,在此函数中调用一个算法函数ArthmetricTask();

还定义了两个结构体,fcrParamDef fcrCtrlParamStu,fcrCtrlParamStu结构体作为参数传递进函数使用,没有想到,程序执行完计算后,这个结构体的内容被篡改了。

更诡异的是,这个结构体的第一个元素的值变成了ExcUIPIDCtrlStu这个结构体的地址,

有MAP文件为证:

void pwmNotification(hetBASE_t * hetREG,uint32 pwm, uint32 notification)
{
/* enter user code between the USER CODE BEGIN and USER CODE END. */
/* USER CODE BEGIN (35) */
        if((pwm == 1U) && (notification == pwmEND_OF_PERIOD))
       {

             ArthmetricTask();

       }

       fcrCtrlParamStu2.f32IfKB = 1.0;
       /********************/
       /* USER CODE END */
}

void ArthmetricTask(void)
{
          float32_t f32DataU=0.0F,f32DataI=0.0F;
          float32_t f32DataU2=0.0F,f32DataI2=0.0F;
          uint8_t u8norDataCnt=0U;
          float32_t f32three_vec_sum=0.0f;
          ExcAdjustPID(0,0,0,0,&ExcUIPIDCtrlStu,&fcrCtrlParamStu);

}

void ExcAdjustPID(uint32_t u32Exc_on_cmd,float32_t f32Ug_rel,float32_t f32If_rel,fcrCtrlDef *fcrCtrl,ExcPIDCtrlDef *ExcUIPIDCtrl,fcrParamDef *fcrCtrlParam)
{
         float32_t f32Result=0.0F,f32DataTemp=0.0F;
         float32_t f32IfLb1=0.0F,f32IfLb2=0.0F,f32IfLb=0.0F;
         float32_t f32avr_uc=0.0F,f32AvrUcTmp=0.0F;
         float32_t f32Va2=0.0F;

         f32Result = DealteU_DeltaT_Reset(f32Ug_rel,f32If_rel,fcrCtrlParam->f32If_up_limit,&IIR1_Deltau_tStu,&IIR1_Deltau_tParamStu);

}

ToffDef ToffDeltau_tStu={
.u32TmrNum=6000U,
.u32Delay=0U,
.u32Out=0U
};

ExcPIDCtrlDef ExcUIPIDCtrlStu={
.f32avr_setp = 1.0F,
.f32If_ExiSetp_en = 0U,
.u32navr_avr_uc_sel=0U,
};

float32_t DealteU_DeltaT_Reset(float32_t f32Ug_rel,float32_t f32If_rel,float32_t f32up_limt,IIRFormIIDef *iirInfor,IIR1ParamDef *iir1Param)
{
     uint32_t u32CtrlBit=0U;
     float32_t f32uplim=0.0F;
     float32_t f32Res=0.0F;
     Filter_IIR1_FormII(f32Ug_rel,iirInfor,iir1Param);
     if(iirInfor->f32Result < -0.5F)
    {
          u32CtrlBit = bTrue;
     }
     Toff(u32CtrlBit,&ToffDeltau_tStu);
     if(ToffDeltau_tStu.u32Out == bTrue)
    {
         f32uplim = 0.5F*f32up_limt;
     }
     else
     {
          f32uplim = 1.5F*f32up_limt;
     }
     f32Res = f32If_rel;
     if(f32Res > f32uplim)
     {
           f32Res = f32uplim;
     }
     if(f32Res < -1000.0F)
     {
           f32Res = -1000.0F;
     }
     return f32Res;
}

void Toff(uint32_t u32In,ToffDef *ToffInfor)
{
     uint32_t u32Temp=0U;
     if(u32In == 0U)
     {
            ToffInfor->u32Delay++;
     }
     else
     {
            ToffInfor->u32Delay = 0U;
      }
      if(ToffInfor->u32Delay >= 65530U)
      {
           ToffInfor->u32Delay = 65530U;
      }
      if(ToffInfor->u32Delay > ToffInfor->u32TmrNum)
      {
             u32Temp = bTrue;
       }
       ToffInfor->u32Out = ~u32Temp;
}

主函数

uint32_t u32system_start_flg=0U;

/* USER CODE END */

int main(void)
{
/* USER CODE BEGIN (3) */

        hetInit();

         rtiInit(); /*compare1 40us*/
         rtiEnableNotification(rtiNOTIFICATION_COMPARE1);
         rtiStartCounter(rtiCOUNTER_BLOCK1);

          _enable_interrupt_();

         u32system_start_flg = bTrue;
         while(1)
         {

         }
/* USER CODE END */

          return 0;
}

/¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥/

最奇怪的是,如果我注释掉main函数中的定时器的初始化,或者将rti的中断改为compare0,程序功能就会恢复正常

(1)第一种恢复正常的修改

(2)第二种恢复正常的修改

求大神指点,我一度怀疑是不是这个CPU的compare1有bug

DigtalFiledExc_New.zip

这是完整工程的压缩包

Links:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

TRANSLATE with x

English

Arabic
Hebrew
Polish

Bulgarian
Hindi
Portuguese

Catalan
Hmong Daw
Romanian

Chinese Simplified
Hungarian
Russian

Chinese Traditional
Indonesian
Slovak

Czech
Italian
Slovenian

Danish
Japanese
Spanish

Dutch
Klingon
Swedish

English
Korean
Thai

Estonian
Latvian
Turkish

Finnish
Lithuanian
Ukrainian

French
Malay
Urdu

German
Maltese
Vietnamese

Greek
Norwegian
Welsh

Haitian Creole
Persian

TRANSLATE with

COPY THE URL BELOW

Back

EMBED THE SNIPPET BELOW IN YOUR SITE

Enable collaborative features and customize widget: Bing Webmaster Portal
Back

,

user1658391:

请问是否有了结果?是不是中断嵌套的问题?是否需要用户自己在FIQ嵌套IRQ的时候做现场保护?应该如何做?

,

user1658391:

请问测试结果如何了?

从现象看,很像是定时器中断嵌套了pwm中断,现场保护有问题,出栈的时候把08001500的地址弹出到了变量fcrCtrlParamStu的第一个元素,我尝试在程序中增加或删减变量,使得变量ExcUIPIDCtrlStu的地址发生改变,发现函数执行后,fcrCtrlParamStu的第一个元素的地址仍然是ExcUIPIDCtrlStu改变后的地址。

赞(0)
未经允许不得转载:TI中文支持网 » TMS570LS1227: 急求,TMS570内存被篡改,崩溃中……
分享到: 更多 (0)