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.

TMS320F28388D: CLA软件触发中断延时

Part Number: TMS320F28388D

我用测试C28核和CLA并行处理时(进行同样的代码),发现软件采用CLA_forceTasks(CLA1_BASE,CLA_TASKFLAG_1)启动TASK1时,并没有立即进入CLA_tas(),延时了1us才进入task。

__interrupt void Cla1Task1 ( void )
{
    //
    //Local Variables
    //
   // num = 0;
    GPIO_writePin(78,1);
//    GpioDataRegs.GPBSET.bit.GPIO33 = 1;
    int xTblIdx; //integer valued Table index
    float A0,A1,A2; //Table coefficients
    float *entry;
    float result;
    int i;
    //
    //Preprocessing
    //
    //__mdebugstop();
    xTblIdx = fVal * TABLE_SIZE_M_1; //convert table index to u16-bits
    xTblIdx = xTblIdx * 3; //Table is ordered as 3 32-bit coefficients, the
                           //index points to these triplets, hence the *3*sizeof(float)
//    entry = &CLAasinTable[xTblIdx];
//    A0 = *entry++;
//    A1 = *entry++;
//    A2 = *entry;
//    result = A0 + fVal*(A1 + A2*fVal);
//
//    //
//    //Post processing
//    //
//    if(fVal < 0)
//    {
//        result = - result;
//    }
    xTblIdx = xTblIdx * 3333;
    xTblIdx = xTblIdx * 3234 + xTblIdx * 367 ;
    fResult = xTblIdx;
//    GpioDataRegs.GPBCLEAR.bit.GPIO33 = 1;
    GPIO_writePin(78,0);
}
void main(void)
{

    //
    // Intialize device clock and peripherals
    //
    Device_init();
    //
    // Initialize GPIO and configure the GPIO pin as a push-pull output
    //
    GPIO_setPadConfig(78, GPIO_PIN_TYPE_STD);
    GPIO_setPinConfig(GPIO_78_GPIO78);
    GPIO_setDirectionMode(78, GPIO_DIR_MODE_OUT);
    GPIO_setMasterCore(78, GPIO_CORE_CPU1_CLA1);
    GPIO_setDirectionMode(80, GPIO_DIR_MODE_OUT);
    GPIO_setPinConfig(80);

    //
    // Disable pin locks and enable internal pullups.
    //
    //Device_initGPIO(); //skipped for this example

    //
    // Initialize PIE and clear PIE registers. Disables CPU interrupts
    //
    Interrupt_initModule();

    //
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    //
    Interrupt_initVectorTable();

    //
    // Configure the CLA memory spaces first followed by
    // the CLA task vectors
    //
    CLA_configClaMemory();
    CLA_initCpu1Cla1();

    //
    // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
    //
    EINT;
    ERTM;

    //
    // Run the test
    //

    //CLA_runTest();
    for(;;)
    {
        int xTblIdx1; //integer valued Table index
        float result1;
        int i;
        GPIO_writePin(80,1);
        CLA_forceTasks(CLA1_BASE,CLA_TASKFLAG_1);


            xTblIdx1 = fVal * TABLE_SIZE_M_1; //convert table index to u16-bits
            xTblIdx1 = xTblIdx1 * 3; //Table is ordered as 3 32-bit coefficients, the
                                   //index points to these triplets, hence the *3*sizeof(float)

            xTblIdx1 = xTblIdx1 * 3333;
            xTblIdx1 = xTblIdx1 * 3234 + xTblIdx1 * 367 ;
            fResult = xTblIdx1;
            GPIO_writePin(80,0);
        DEVICE_DELAY_US(50);
    }
}

测试发现GPIO78引脚都是再GPIO80拉高后1us才被拉高,而且主函数执行时间才750ns,而CLA执行了4.2us,

蓝色为CPIO80,红色为GPIO78.

按我的理解,CLA跟CPU应该是并行处理,触发AICK1,进入TASK1执行代码,CPU继续继续z主程序代码,然后等待task完成,但实测并没有得到这个结果。

  • 你好,问题已经收到,我会咨询一下CLA方面的专家之后回复你,还请耐心等待

  • 你好,工程师想了解一下是否为工程启用了优化?有时,优化可能会移动代码,使序列与它在C代码中的显示方式不完全相同。

  • 把你编译后的CLA中断文件的汇编代码贴出来看看,

    CCS编译器有个特点,如果编译设置不好,C语言得出的代码会很长,有些特殊指令会不使用的,并且,仅使用 ---- 是仅使用C28的基本指令。如果这样,特别是浮点运算,编译器会调用整型运算的内部函数,

  • 再者,C语言的写法,对编译结果有影响,一条语句,最好写一个运算,如果一条语句多条运算,会使汇编代码产生很多指令,并且跳转指令(一般4个周期)用得也多。

  • 没有开优化,Optimization level是off

  • 其实这里有两个问题,一是从触发到进入CLAtask的延时太久;二是CLA和CPU各自执行程序的时间。

  • Cla1Task1:
    $C$DW$12	.dwtag  DW_TAG_variable
    	.dwattr $C$DW$12, DW_AT_name("xTblIdx")
    	.dwattr $C$DW$12, DW_AT_type(*$C$DW$T$10)
    	.dwattr $C$DW$12, DW_AT_location[DW_OP_addr __claCla1Task1_sp+0]
    
    	.dwpsn	file "../asin.cla",line 98,column 5,is_stmt,isa 0
            MMOVIZ    MR0,#0                ; [CPU_FPU] |98| 
    $C$DW$13	.dwtag  DW_TAG_TI_branch
    	.dwattr $C$DW$13, DW_AT_low_pc(0x00)
    	.dwattr $C$DW$13, DW_AT_name("GPIO_writePin")
    	.dwattr $C$DW$13, DW_AT_TI_call
    
            MCCNDD    #GPIO_writePin        ; [CPU_FPU] |98| 
            MMOVIZ    MR1,#0                ; [CPU_FPU] |98| 
            MMOVXI    MR0,#78               ; [CPU_FPU] |98| 
            MMOVXI    MR1,#1                ; [CPU_FPU] |98| 
            ; call occurs [#GPIO_writePin] ; [] |98| 
    	.dwpsn	file "../asin.cla",line 109,column 5,is_stmt,isa 0
            MMOV32    MR0,@fVal             ; [CPU_FPU] |109| 
            MMPYF32   MR0,MR0,#17024        ; [CPU_FPU] |109| 
            MADDF32   MR0,MR0,#49024        ; [CPU_FPU] |109| 
            MF32TOI32 MR0,MR0               ; [CPU_FPU] |109| 
            MMOV32    @__claCla1Task1_sp+0,MR0 ; [CPU_FPU] |109| 
    	.dwpsn	file "../asin.cla",line 110,column 5,is_stmt,isa 0
            MMOV32    MR1,MR0               ; [CPU_FPU] 
            MMOV32    MR0,MR1               ; [CPU_FPU] |110| 
            MLSL32    MR0,#1                ; [CPU_FPU] |110| 
            MADD32    MR0,MR1,MR0           ; [CPU_FPU] |110| 
            MMOV32    @__claCla1Task1_sp+0,MR0 ; [CPU_FPU] |110| 
    	.dwpsn	file "../asin.cla",line 125,column 5,is_stmt,isa 0
            MMOVIZ    MR3,#0                ; [CPU_FPU] |125| 
            MMOVIZ    MR2,#0                ; [CPU_FPU] |125| 
            MMOVIZ    MR1,#0                ; [CPU_FPU] |125| 
            MMOVXI    MR1,#3333             ; [CPU_FPU] |125| 
    $C$L5:    
            MMOVXI    MR3,#1                ; [CPU_FPU] |125| 
            MAND32    MR3,MR3,MR1           ; [CPU_FPU] |125| 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MBCNDD    $C$L6,EQ              ; [CPU_FPU] |125| 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            ; branchcc occurs ; [] |125| 
            MADD32    MR2,MR2,MR0           ; [CPU_FPU] |125| 
    $C$L6:    
            MLSL32    MR0,#1                ; [CPU_FPU] |125| 
            MLSR32    MR1,#1                ; [CPU_FPU] |125| 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MBCNDD    $C$L5,NEQ             ; [CPU_FPU] |125| 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            ; branchcc occurs ; [] |125| 
            MMOV32    @__claCla1Task1_sp+0,MR2 ; [CPU_FPU] |125| 
    	.dwpsn	file "../asin.cla",line 126,column 5,is_stmt,isa 0
            MMOV32    MR0,MR2               ; [CPU_FPU] 
            MMOVIZ    MR1,#0                ; [CPU_FPU] |126| 
            MMOVIZ    MR3,#0                ; [CPU_FPU] |126| 
            MMOVIZ    MR2,#0                ; [CPU_FPU] |126| 
            MMOVXI    MR1,#3234             ; [CPU_FPU] |126| 
    $C$L7:    
            MMOVXI    MR3,#1                ; [CPU_FPU] |126| 
            MAND32    MR3,MR3,MR1           ; [CPU_FPU] |126| 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MBCNDD    $C$L8,EQ              ; [CPU_FPU] |126| 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            ; branchcc occurs ; [] |126| 
            MADD32    MR2,MR2,MR0           ; [CPU_FPU] |126| 
    $C$L8:    
            MLSL32    MR0,#1                ; [CPU_FPU] |126| 
            MLSR32    MR1,#1                ; [CPU_FPU] |126| 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MBCNDD    $C$L7,NEQ             ; [CPU_FPU] |126| 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            ; branchcc occurs ; [] |126| 
            MMOV32    @__claCla1Task1_sp+2,MR2 ; [CPU_FPU] |126| 
            MMOVIZ    MR1,#0                ; [CPU_FPU] |126| 
            MMOV32    MR0,@__claCla1Task1_sp+0 ; [CPU_FPU] |126| 
            MMOVIZ    MR3,#0                ; [CPU_FPU] |126| 
            MMOVIZ    MR2,#0                ; [CPU_FPU] |126| 
            MMOVXI    MR1,#367              ; [CPU_FPU] |126| 
    $C$L9:    
            MMOVXI    MR3,#1                ; [CPU_FPU] |126| 
            MAND32    MR3,MR3,MR1           ; [CPU_FPU] |126| 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MBCNDD    $C$L10,EQ             ; [CPU_FPU] |126| 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            ; branchcc occurs ; [] |126| 
            MADD32    MR2,MR2,MR0           ; [CPU_FPU] |126| 
    $C$L10:    
            MLSL32    MR0,#1                ; [CPU_FPU] |126| 
            MLSR32    MR1,#1                ; [CPU_FPU] |126| 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MBCNDD    $C$L9,NEQ             ; [CPU_FPU] |126| 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            ; branchcc occurs ; [] |126| 
            MMOV32    MR0,@__claCla1Task1_sp+2 ; [CPU_FPU] |126| 
            MADD32    MR0,MR2,MR0           ; [CPU_FPU] |126| 
            MMOV32    @__claCla1Task1_sp+0,MR0 ; [CPU_FPU] |126| 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
            MNOP      ; [CPU_FPU] 
    	.dwpsn	file "../asin.cla",line 127,column 5,is_stmt,isa 0
            MI32TOF32 MR0,@__claCla1Task1_sp+0 ; [CPU_FPU] |127| 
            MMOV32    @fResult,MR0          ; [CPU_FPU] |127| 
    	.dwpsn	file "../asin.cla",line 129,column 5,is_stmt,isa 0
    $C$DW$14	.dwtag  DW_TAG_TI_branch
    	.dwattr $C$DW$14, DW_AT_low_pc(0x00)
    	.dwattr $C$DW$14, DW_AT_name("GPIO_writePin")
    	.dwattr $C$DW$14, DW_AT_TI_call
    
            MCCNDD    #GPIO_writePin        ; [CPU_FPU] |129| 
            MMOVIZ    MR1,#0                ; [CPU_FPU] |129| 
            MMOVIZ    MR0,#0                ; [CPU_FPU] |129| 
            MMOVXI    MR0,#78               ; [CPU_FPU] |129| 
            ; call occurs [#GPIO_writePin] ; [] |129| 

    这是CLA的汇编,这个有两个问题,一是从触发到进入CLAtask的延时太久;二是CLA和CPU各自执行程序的时间差太远

  • 收到,已转述给对方工程师

  • CLA是不能直接控制GPIO的,----- 我记得是这样,可以参考:https://e2echina.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/120810/28377s-cla-gpio

    至于编译器用了个MCCNDD    #GPIO_writePin,它是转到#GPIO_writePin,这个立即数是多少?

    SPRSP14D手册中的206页,说了CPA可以访问的空间。

  • 有可能是GPIO_writePin占用了太多周期

    1、方便发布一下GPIO_writePin的汇编代码吗?

    2、能否将调用GPIO_writePin更改为直接写入GPIO寄存器的方式? 看看是否是函数开销太大导致的这个问题

    3、TRM中CLA的章节显示了中断延迟时间,从触发开始约是6个周期。

  • 总结一下,都不是上述问题引起的

    28388D中,能在CLA中操作CPIO,

    是由于原有工程中,在Properties->CCS Build->C2000 Compiler->Optimization中,需要把Optimization level改为(大于等于0)模式,默认是OFF,能解答下这几个优化模式的操作原理吗?

  • 编译器用户指南中对代码优化有详细的说明,你可以看一下最新的编译器用户指南第三章Optimizing Your Code:https://www.ti.com/lit/ug/spru514x/spru514x.pdf?ts=1643358862940&ref_url=https%253A%252F%252Fwww.google.com%252F