This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F280039C: 数据发生隐士转换时导致机器死机

Part Number: TMS320F280039C

typedef long                                    int32;
typedef int                                     int16;

int32   llc_dbt_curr_comp = 79; 
int16	s16LLC_Pr_PwmDeadTime =59;	

s16LLC_Pr_PwmDeadTime = s16LLC_Pr_PwmDeadTime - llc_dbt_curr_comp;



上述代码执行后,s16LLC_Pr_PwmDeadTime会发生溢出

并且有时候会出现死机现象导致看门口重启,请问这是为什么

  • 检查一下是不是减数和被减数搞反了,计算结果为负值了。

  • 可是s16LLC_Pr_PwmDeadTime本身是有符号的变量,范围为-32768-32767,这个也没有超出他的范围啊

  • s16LLC_Pr_PwmDeadTime是不是赋值到EPwmxRegs.DBRED.bit.DBRED寄存器了,寄存器不支持负数。

  • 后面有限幅会强制矫正

  •   
     //int32 llc_dbt_curr_comp
     //int16 s16LLC_Pr_PwmDeadTime
      
        LLC_Modul.s16LLC_Pr_PwmDeadTime =   (int16)(-(int32)LLC_Modul.u32LLC_PwmPeriod*(int32)LLC_Modul.u32LLC_PwmPeriod*(int32)LLC_Modul.u32LLC_PwmPeriod*0.000000364
                                            +(int32)LLC_Modul.u32LLC_PwmPeriod*(int32)LLC_Modul.u32LLC_PwmPeriod*0.0008
                                            -(int32)LLC_Modul.u32LLC_PwmPeriod*0.599+177);
    
    
        llc_dbt_curr_comp =   (-(int32)LLC_Modul.u32LLC_PwmPeriod*(int32)LLC_Modul.u32LLC_PwmPeriod*(int32)LLC_Modul.u32LLC_PwmPeriod*0.00000021
                            +(int32)LLC_Modul.u32LLC_PwmPeriod*(int32)LLC_Modul.u32LLC_PwmPeriod*0.0005
                            -(int32)LLC_Modul.u32LLC_PwmPeriod*0.3821+94);
        llc_dbt_curr_comp = llc_dbt_curr_comp*abs(LlcSamplVal.s16LLC_BatCurr_Raw)/500;
    
      LLC_Modul.s16LLC_Pr_PwmDeadTime = LLC_Modul.s16LLC_Pr_PwmDeadTime - llc_dbt_curr_comp;
      //程序运行到现在都没有任何问题,在ccs中观察值都在预期内
    
    
    
    
    //但是接下来一旦我对s16LLC_Pr_PwmDeadTime进行操作程序就会死机
    //例如对s16LLC_Pr_PwmDeadTime进行限幅操作
    
    UpDownLmt(LLC_Modul.s16LLC_Pr_PwmDeadTime,LLC_PWM_DEAD_TIME_900NS,LLC_PWM_DEAD_TIME_340NS);
    //#define 	UpDownLmt(Var,Max,Min)	(Var) = (Var)>=(Max)?(Max):((Var)<=(Min)?(Min):(Var))
    
    //或者是对s16LLC_Pr_PwmDeadTime赋值赋别的值
    LLC_Modul.s16LLC_Pr_PwmDeadTime=Othervalue;
    
    
    我绞尽脑汁也想不明白:(

  • 大佬有何高见,有什么可能会导致这个问题吗,这个Bug已经卡我几天了,发生问题时ccs提示如下

  • 妖怪的问题,之前也遇到过,按照经验,说几句可能没啥用的,仅供参考,排查

    1.你贴的这些所有代码,是放在哪儿,放在中断吗?放在cla里面吗?你有测试过语句执行时间吗?

    2.检查cmd文件空间定义是否有重复,或不连续的存在

    3.查: //程序运行到现在都没有任何问题,在ccs中观察值都在预期内,加入这句话后面的程序都不要,你编译下,看map文件,看是不是某块flash或ram空间,快接近了最大空间?即所剩不多?  

    4.增大heap stack空间大小

    5.关闭优化等级或增大优化等级,都试试

  • 再view->Memory Allocation检查一下Flash和RAM空间是不是快超了。

  • 好的,我一一试试

  • 多谢您的回复