C2000-GANG: 280049C中,CLA 的TASK任务无法被触发

Part Number: C2000-GANG


首先CCS环境配置中CLA suppor已选择Type CLA1

问题描述:选择的软件触发任务,TASK 任务选择的是由.cla文件格式的C形式的程序,TASK任务无法被触发。而我之前配置的CLA TASK 任务是由.asm文件格式汇编编写的,是能够被触发更新EPWM周期。由于后期程序量增加,我将TASK任务由汇编改为了C形式,任务就不能被触发,加上  __mdebugstop();测试,也是不能停止。下边是我关于CLA的配置:

#pragma DATA_SECTION(ClaReadRegVal, "CpuToCla1MsgRAM");

union Message ClaReadRegVal;

union Message CpuWriteRegVal;

////// CPU传送数据给CLA

#pragma DATA_SECTION(CpuFlag,"CpuToCla1MsgRAM");

#pragma DATA_SECTION(CpuVar,"CpuToCla1MsgRAM");

CPUFLAG CpuFlag;

CpuToClaVar CpuVar; // 用于向CLA传递数据,CPU可以对其读、写操作,CLA只能对其读操作

////// CLA传送数据给CPU

#pragma DATA_SECTION(ClaVar,"Cla1ToCpuMsgRAM");

#pragma DATA_SECTION(ClaAD,"Cla1ToCpuMsgRAM");

 

ClaToCpuVar ClaVar;//={0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};

CLAAD ClaAD;

 

extern uint32_t Cla1ProgRunStart, Cla1ProgLoadStart, Cla1ProgLoadSize;

extern uint32_t Cla1ConstRunStart,Cla1ConstLoadStart,Cla1ConstLoadSize;

extern uint32_t Cla1mathTablesLoadStart,Cla1mathTablesLoadEnd,Cla1mathTablesRunStart,Cla1mathTablesLoadSize;//,Cla1ConstRunStart,Cla1ConstLoadStart,Cla1ConstLoadSize

void CLA_Init(void)

{

    EALLOW;

    CpuSysRegs.PCLKCR0.bit.CLA1 = 1;

    Cla1Regs.MCTL.bit.HARDRESET = 1;

    __asm(" RPT #3 || NOP");

    EDIS;

    EALLOW;

    memcpy((uint32_t *)&Cla1ProgRunStart, (uint32_t *)&Cla1ProgLoadStart,(uint32_t)&Cla1ProgLoadSize);

    memcpy((uint32_t *)&Cla1ConstRunStart, (uint32_t *)&Cla1ConstLoadStart,(uint32_t)&Cla1ConstLoadSize);

 memcpy((uint32_t *)&Cla1mathTablesRunStart, (uint32_t *)&Cla1mathTablesLoadStart, (Uint32)&Cla1mathTablesLoadSize);

    MemCfgRegs.MSGxINIT.bit.INIT_CLA1TOCPU = 1;

    while(MemCfgRegs.MSGxINITDONE.bit.INITDONE_CLA1TOCPU != 1){};

    MemCfgRegs.MSGxINIT.bit.INIT_CPUTOCLA1 = 1;

    while(MemCfgRegs.MSGxINITDONE.bit.INITDONE_CPUTOCLA1 != 1){};

    MemCfgRegs.LSxMSEL.bit.MSEL_LS5 = 1;

    MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS5 = 1;

    MemCfgRegs.LSxMSEL.bit.MSEL_LS6= 1;

    MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS6 = 0;

      Cla1Regs.MVECT2 = (Uint16)(&Cla1Task2);

    __asm(" RPT #7 || NOP");

//DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.TASK1=CLA_TRIG_NOPERPH;//ADCA1INT

DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.TASK2=CLA_TRIG_ADCAINT1;//CLA_TRIG_NOPERPH;//CLA_TRIG_ADCAINT1

   Cla1Regs.MCTL.bit.IACKE = 1;

    Cla1Regs.MIER.all = (M_INT1 |M_INT2); //M_INT1;//

    IER |= (M_INT11);

    Cla1ForceTask2();

    EDIS;

    }

其中软件触发是在中断中,此中断已测试是能够正常被触发的,CLA软件触发是设置: Cla1Regs.MIFRC.bit.INT2 = 1;

TASK2 任务由C语言形式写的:

#pragma CODE_SECTION(Cla1Task2, "Cla1Prog")

__interrupt  void Cla1Task2 (void)
{
    asm(" MEALLOW");
    __mdebugstop();
    EPwm3Regs.TBPRD = CpuWriteRegVal.bit.PeriodRegU16;
//    PFCLp.Count ++;
    asm(" MEDIS");

  __asm(" MSTOP ")

},问题现象让我不明白,不同的TASK任务实现形式是有什么不同要求吗,为什么汇编的变现出正常触发,C语言形式中断进不去呢?