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.

280049c CLA task&isr

好的,非常感谢,我刚测试了,claisr7 和claisr8都能进入。在请问您一个问题,task7 和task8与claisr7和claisr8是什么关系?task7和task8是用的汇编,请问task7和task8是什么一直在运行吗?还是和claisr7和claiscla8一样在cla的中断触发源到来之后运行?谢谢您的指导!
  • user6154541 说:
    好的,非常感谢,我刚测试了,claisr7 和claisr8都能进入。

    若是解决您的问题,请点击“确认此为答案”

    user6154541 说:
    task7 和task8与claisr7和claisr8是什么关系?task7和task8是用的汇编,请问task7和task8是什么一直在运行吗?还是和claisr7和claiscla8一样在cla的中断触发源到来之后运行?

    该问题和最开始的帖子不同,我会将该帖子拆分为新帖以便于查看

  • CLA是任务驱动的浮点引擎。最多可以使用8个任务,每个任务都可以由软件可编程源(例如软件或外围中断)触发。每个任务将执行一些CLA代码,直到遇到MSTOP指令为止。

    您所指的CLA ISR是CPU在完成CLA任务后可能执行的ISR。这是CPU通知CLA已完成其任务的方式。
  • 您好,我自己做了一个工程,包括1个adc中断,1个pwm中断,还有cla。现在是cla不响应。我cla想用c语言来完成,只使用了8个task,没有用例程里边的cla isr。我感觉是cla的中断任务向量地址错了,但是我不知道怎么改。我做了很久了,一直没整出来,贵公司的例程,我也看了,还是不知道怎么改。我可以把工程发给您,帮我看看吗?
  • 可以的,您可以将工程压缩后私信给我

  • 您好,我已将我的工程私信发送给您,麻烦您帮我看看。cla不响应,我感觉是cla task的任务向量地址不对。非常感谢,麻烦您了!
  • 我会在测试后给您回复
  • 我在调试时显示

    Can't find a source file at "D:\A0132542\code\Tenor_Driverlib\EXAMPLES\c2000-sfo-library\calibration\hrpwm\sfo_bitfield\f28004x_COFF_Debug/../SFO_v8_fpu_lib_build_c28.c"
    Locate the file or edit the source lookup path to include its location.
  • 您好,是有这个问题,单步运行的时候会显示这个问题,连续运行时没有这个问题。我在c2000 ware里边没找到SFO_v8_fpu_lib_build_c28.c这个c文件,只有头文件和库函数文件。不知道这个问题会不会影响HRPWM的正常运行和精度。如果方便的话也请您帮忙解释下。这个问题应该跟cla不响应没关系,还请您再帮忙看看。
  • 请问您是在何处下载的程序?程序中在哪里触发CLA TASK?
  • 您好,我配置的是EPWM3中断触发cla task1,软件触发cla task8。在BSP_HRPWM.c中EPWM3配置了中断源,在BSP_CLA.c中配置了cla task1的中断触发源为EPWM3,cla task8为软件触发,并强制触发cla task8一次。InitFlash函数在f28004x_sysctrl.c中初始化,cla的具体配置都在BSP_CLA.c程序文件里边。想截图给您看看,但是不知道这个怎么粘贴图片。

  • 参考 280049 TRM 的 5.4.2 Typical CLA Initialization Sequence可知

    CLA 的初始化流程

    对照您的初始化流程,没有看到Enable CLA tasks/interrupts等

  • 您可以点击右下角的“使用高级编辑器编辑文本”,以附件形式上传图片
  • 您好,我看了手册:Enable CLA tasks/interrupts
    Set appropriate bits in the interrupt enable register (MIER) to allow the CLA to service interrupts
    我程序里边配置了: Cla1Regs.MCTL.bit.IACKE = 1;
    Cla1Regs.MIER.all = (M_INT8 | M_INT1);
    您说的是这个吗?
  • 我在BSP_CLA.c 文件里边的void CLA_C_Init(void)函数里边配置的。

  • 您好,我想我应该发现问题了:
    // Configure the vectors for the end-of-task interrupt for all
    // 8 tasks
    //
    PieVectTable.CLA1_1_INT = &Cla1Task1;
    PieVectTable.CLA1_2_INT = &Cla1Task2;
    PieVectTable.CLA1_3_INT = &Cla1Task3;
    PieVectTable.CLA1_4_INT = &Cla1Task4;
    PieVectTable.CLA1_5_INT = &Cla1Task5;
    PieVectTable.CLA1_6_INT = &Cla1Task6;
    PieVectTable.CLA1_7_INT = &Cla1Task7;
    PieVectTable.CLA1_8_INT = &Cla1Task8;
    应该是这段程序有问题,PieVectTable应该是对应cla task的结束地址,但是我写成了cla task的开始地址。但是,我请问下,cla task的结束地址怎么给呢??
  • 可以参考例程内的写法

        //
        // Map the ISR to the CLA end-of-task interrupt.
        //
        Interrupt_register(INT_CLA1_1, cla1Isr1);
    //*****************************************************************************
    //
    //! Registers a function to be called when an interrupt occurs.
    //!
    //! \param interruptNumber specifies the interrupt in question.
    //! \param handler is a pointer to the function to be called.
    //!
    //! This function is used to specify the handler function to be called when the
    //! given interrupt is asserted to the processor.  When the interrupt occurs,
    //! if it is enabled (via Interrupt_enable()), the handler function will be
    //! called in interrupt context.  Since the handler function can preempt other
    //! code, care must be taken to protect memory or peripherals that are accessed
    //! by the handler and other non-handler code.
    //!
    //! The available \e interruptNumber values are supplied in
    //! <tt>inc/hw_ints.h</tt>.
    //!
    //! \note This function assumes that the PIE has been enabled. See
    //! Interrupt_initModule().
    //!
    //! \return None.
    //
    //*****************************************************************************
    static inline void
    Interrupt_register(uint32_t interruptNumber, void (*handler)(void))
    {
        uint32_t address;
    
        //
        // Calculate appropriate address for the interrupt number
        //
        address = (uint32_t)PIEVECTTABLE_BASE +
                  (((interruptNumber & 0xFFFF0000U) >> 16U) * 2U);
    
        //
        // Copy ISR address into PIE table
        //
        EALLOW;
        HWREG(address) = (uint32_t)handler;
        EDIS;
    }
    

  • 您好,您给的这种方法在cla_ex4例程里边有,用了cla isr,但是我的工程只用了cla task。能否麻烦您指导下,这种情况下怎么给定PieVectTable.CLA1_1_INT的地址向量值。
  • cla1Isr1是在任务task1结束之后执行的,告知CPU任务已经完成

    而您 Cla1Regs.MVECT1 = (uint16_t)(&Cla1Task1);这一句是填充了CLA的任务向量,每个向量初始化成任务的起始地址。CLA根据您配置的外设中断源来触发任务
  • 我在例程内删除

    // Configure the vectors for the end-of-task interrupt for all
    // 8 tasks
    //
    PieVectTable.CLA1_1_INT = &Cla1Task1;
    PieVectTable.CLA1_2_INT = &Cla1Task2;
    PieVectTable.CLA1_3_INT = &Cla1Task3;
    PieVectTable.CLA1_4_INT = &Cla1Task4;
    PieVectTable.CLA1_5_INT = &Cla1Task5;
    PieVectTable.CLA1_6_INT = &Cla1Task6;
    PieVectTable.CLA1_7_INT = &Cla1Task7;
    PieVectTable.CLA1_8_INT = &Cla1Task8;

    以及对应的中断服务程序,还是可以进入task的
  • void CLA_C_Init(void)
    {
    //
    // Compute all CLA task vectors
    // On Type-1 CLAs the MVECT registers accept full 16-bit task addresses as
    // opposed to offsets used on older Type-0 CLAs
    //
    EALLOW;
    Cla1Regs.MVECT1 = (uint16_t)(&Cla1Task1);
    Cla1Regs.MVECT2 = (uint16_t)(&Cla1Task2);
    Cla1Regs.MVECT3 = (uint16_t)(&Cla1Task3);
    Cla1Regs.MVECT4 = (uint16_t)(&Cla1Task4);
    Cla1Regs.MVECT5 = (uint16_t)(&Cla1Task5);
    Cla1Regs.MVECT6 = (uint16_t)(&Cla1Task6);
    Cla1Regs.MVECT7 = (uint16_t)(&Cla1Task7);
    Cla1Regs.MVECT8 = (uint16_t)(&Cla1Task8);

    Cla1Regs.MCTL.bit.IACKE = 1;
    Cla1Regs.MIER.all = (M_INT8 | M_INT1);

    //
    // Configure the vectors for the end-of-task interrupt for all
    // 8 tasks
    //
    PieVectTable.CLA1_1_INT = &Cla1Task1;
    PieVectTable.CLA1_2_INT = &Cla1Task2;
    PieVectTable.CLA1_3_INT = &Cla1Task3;
    PieVectTable.CLA1_4_INT = &Cla1Task4;
    PieVectTable.CLA1_5_INT = &Cla1Task5;
    PieVectTable.CLA1_6_INT = &Cla1Task6;
    PieVectTable.CLA1_7_INT = &Cla1Task7;
    PieVectTable.CLA1_8_INT = &Cla1Task8;

    //
    // Set the EPWM3 as the trigger for task 1
    //
    DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.TASK1 = CLA_TRIG_EPWM3INT;;

    //
    // Enable CLA interrupts at the group and subgroup levels
    //
    // PieCtrlRegs.PIEIER11.all = 0xFFFF;
    // IER |= (M_INT11 );
    EDIS;
    }

    void CLA_configClaMemory(void)
    {
    #define _FLASH

    extern uint32_t Cla1ProgRunStart, Cla1ProgLoadStart, Cla1ProgLoadSize;

    EALLOW;
    #ifdef _FLASH
    //
    // Copy over code from FLASH to RAM
    //
    memcpy((uint32_t *)&Cla1ProgRunStart, (uint32_t *)&Cla1ProgLoadStart,
    (uint32_t)&Cla1ProgLoadSize);
    #endif //_FLASH

    //
    // Initialize and wait for CLA1ToCPUMsgRAM
    //
    MemCfgRegs.MSGxINIT.bit.INIT_CLA1TOCPU = 1;
    while(MemCfgRegs.MSGxINITDONE.bit.INITDONE_CLA1TOCPU != 1){};

    //
    // Initialize and wait for CPUToCLA1MsgRAM
    //
    MemCfgRegs.MSGxINIT.bit.INIT_CPUTOCLA1 = 1;
    while(MemCfgRegs.MSGxINITDONE.bit.INITDONE_CPUTOCLA1 != 1){};

    //
    // Select LS4RAM and LS5RAM to be the programming space for the CLA
    // First configure the CLA to be the master for LS4 and LS5 and then
    // set the space to be a program block
    //
    MemCfgRegs.LSxMSEL.bit.MSEL_LS0 = 1;
    MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS0 = 1;
    MemCfgRegs.LSxMSEL.bit.MSEL_LS1 = 1;
    MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS1 = 0;
    //MemCfgRegs.LSxMSEL.bit.MSEL_LS3 = 1;
    //MemCfgRegs.LSxCLAPGM.bit.CLAPGM_LS3 = 0;

    EDIS;
    }
    EALLOW;
    EPwm3Regs.ETSEL.bit.INTSEL = ET_CTR_PRD; // Select INT on Zero event
    EPwm3Regs.ETSEL.bit.INTEN = 1; // 使能Enable INT,外设级中断允许
    EPwm3Regs.ETPS.bit.INTPRD = ET_1ST; // Generate INT on 1rd event用于ADC采样转换和CLA=120K
    //EPwm3Regs.ETPS.bit.INTPSSEL=1;
    //EPwm3Regs.ETINTPS.bit.INTPRD2=1;

    EDIS;

    这就是我的工程里边关于cla的所有的配置,按照您说的删除了相应部分后cla也没有响应,您看看是什么问题?
  • 首先您需要确认是否可以进入EPWM的中断,从而触发CLA的任务。

    您使用的是EPWM3来触发 task 1

    //
    // Set the EPWM3 as the trigger for task 1
    //
    DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.TASK1 = CLA_TRIG_EPWM3INT;;

    __interrupt void EPWM1ISR(void)这个也是对应EPWM3INT吗?
  • 您好,EPWM1ISR这个中断用的是EPWM2INT:
    EALLOW; // This is needed to write to EALLOW protected register
    PieVectTable.EPWM2_INT=&EPWM1ISR;
    EDIS;

    IER |= M_INT3; // Enable CPU Interrupt 1
    PieCtrlRegs.PIEACK.bit.ACK3 = 1;
    PieCtrlRegs.PIEIER3.bit.INTx2 = 1; //PWMINT中断允许
  • 麻烦您再帮忙看看是哪里有问题,怎么修改,非常感谢!!
  • 改成CLA_TRIG_EPWM2INT就可以了。您原来是CLA_TRIG_EPWM3INT,而程序中又没有使能EPWM3INT,所以不能触发CLA

    //
    // Set the EPWM3 as the trigger for task 1
    //
    DmaClaSrcSelRegs.CLA1TASKSRCSEL1.bit.TASK1 = CLA_TRIG_EPWM2INT;;

  • 另外需要在__interrupt void Cla1Task1 ( void )中加入下面的语句以方便调试

        __mdebugstop();

  • 非常感谢您的耐心指导,我已经解决问题了!
  • 很高兴您能解决问题