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.

关于CLA的问题:TMS320F28035

Other Parts Discussed in Thread: TMS320F28035

现在我用TMS320F28035在做应用,但是CLA Prog RAM的空间不足,实际只有4K,我现在CLA的程序达到5K左右,超出了一部分,

后来删除了一些代码,空间够了,此时看map文件时,如下:

 output                                  attributes/
section   page    origin      length       input sections
--------  ----  ----------  ----------   ----------------
.pinit     0    003e8000    00000000     UNINITIALIZED

Cla1Prog   0    003e8000    00000c88     RUN ADDR = 00009000
                  003e8000    000007b2     CLA_slopedyn.obj (Cla1Prog)
                  003e87b2    000004d6     CLA_slopedyn.obj (Cla1Prog:retain)

其中CLA代码是CLA_slopedyn.cla,编译后的目标文件是CLA_slopedyn.obj,

我的问题是:为什么有两个目标文件,如上图

Cla1Prog和Cla1Prog:retain有什么区别,都会占用CLA Prog RAM吗?

另外如果CLA Prog RAM空间不够,除了缩减代码之外,还有其他什么建议吗?

谢谢!

  • Move to the right forum

  • Cla1Prog和Cla1Prog:retain区别不大,都会占用CLA的RAM空间。你的CLA task中应该使用了函数调用,Cla1Prog中存储的是被调用函数的代码。除了缩减代码,没有更好的方法。

  • 关于Cla1Prog和Cla1Prog:retain的问题: 我所有CLA代码全部放在一个.cla的文件里面,没有使用其他文件的函数。

    另外最追加一个问题,CCS6.0支持在CLA源程序里面进行单步调试吗?

    我现在在cla的一个task里面加了一个__mdebugstop(),之后可以在汇编语言里面进到这条指令,但是我选择"shouw source"时,总是显示没有源程序的错误

    如下图:

  • 1,请将cla文件中的程序贴出来看一下。

    2,CCS6.0支持在CLA源程序里面进行单步调试。显示“no source available”并不是错误,并不是每一条汇编语句都会有相应的C程序语句来对应,所以会这样提示。__mdebugstop()并不存在于实际的芯片内部,只在调试时起作用。

  • 这是Taks8的一部分代码
    __interrupt void Cla1Task8 ( void )
    {
        uint32 ulTmp;
        uint16 uiTmp1,uiTmp2;
        __mdebugstop();

        uiTmp1 = (uint16)(g_tEloadGlobalVariable.eOperateType);
        uiTmp2 = (uint16)OPER_TYPE_CNST;
        //if(g_tEloadGlobalVariable.eOperateType == OPER_TYPE_CNST)
        if(uiTmp1 == uiTmp2)
        {
            ClaEloadCTask();
            
        g_Cla2CPUData = g_Cla2CPUData +100;
        if(g_Cla2CPUData>60000)
        {
            g_Cla2CPUData =0;
        }
         return;
        
            
        }
        else
        {
            ClaEloadDynTask();
        }    

    。。。。

  • ClaEloadDynTask();和ClaEloadCTask(); 这些函数的代码是存在“Cla1Prog”中的,剩下的代码是存在“Cla1Prog:retain”中的。

  • 你的意思是说中断函数中调用的函数是存在Cla1Prog中, 中断函数本身的代码是存在Cla1Prog:retain的是吧。

    另外,现在可以进行源代码单步调试了,仔细看了一下cla wiki, 里面谈到需要load symbols, 我这样做了之后可以进行C源码单步调试了,谢谢,继续试下。

  • 是的,中断函数本身的代码是存储在retain区域的,中断函数中调用的函数存在Cla1Prog中。

  • 还有一个问题: 在CPU28X里面定义的enum数据类型,在CLA程序里面工作不正常? CLA是否支持enum数据类型?编译器里面哪里设置一下能让CLA支持enum数据类型吗,谢谢!

  • CLA不能直接使用C28数据区的数据,你可以在CLA程序中重新定义一个enum数据。或者C28的数据放到CPU-TO-CLA RAM区域,这样CLA可以读其数据,但不能为其赋值或修改数据。

  • 帮忙确认一下,CAL里面调用的函数必须位于CLA Prog RAM里面是吧?

  • 我现在是将CPU里面的enum数据放到了CPU-TO-CLA RAM里面,但是在CLA里面访问enum数据时不正确,

    例如在CPU里面定义

    typedef enum tagEnumData

    {

         ENUM_DATA1=0,ENUM_DATA2

    }TEnumDaTa

    #pragma DATA_SECTION(tEnumData,"CpuToCla1MsgRAM");

    TEnumData tEnumData

    下面的语句在CPU里面工作都正常,但是在CLA代码里面工作不正常,是不是CLA不支持enum数据类型?

    if(tEnumData == ENUM_DATA1)

    {

         // TODO:

    }

    else

    {

       // TODO:

    }

  • 是的,CAL里面调用的函数必须位于CLA Prog RAM中。

  • 请将“TEnumData tEnumData”改成“TEnumDaTa tEnumData”。

  • 这个改动有什么区别吗?

    后来我将TEnumData tEnumData修改为uint16 tEnumData可以了。

  • 您好,可以实现下面的功能吗?
    例如现在有A+B(或C)+D代码需要放到CLA中执行,如果A+B+C+D全部放到CLA中去,空间不够,
    如果单独加载A+B+D或A+C+D则空间是够的
    如何在CPU程序中实现一下功能
    if(用户选择B)
    {
       加载A+B+D到CLA Prog RAM
    }
    else if(用户选择C)
    {
       加载A+C+D到CLA Prog RAM
    }
    有相关的函数(如MemCopy)或例程么?先谢了!

  • TEnumDaTa你是定义过其类型的,TEnumData因为一个字符的差别,所以你并没有定义过其类型。

  • 这样无法实现,所有CLA代码还是被放到一个obj文件中,无法拆开来copy。

  • 还有三个问题,请帮忙确认一下: (1)在CLA里面只能访问ADC的转换结果,不能触发AD转换是吧? (2)在CLA里面不能通过写SPIBUFF触发SPI发送是吧? (3)可否将认为调整中断系统的优先级,例如将CLA中断优先级提高?

  • 1,可以通过ETFRC寄存器的SOCA或SOCB来强制触发一个EPWMxSOCx信号来触发AD转换。2,是的,不可以。3,不可以。

  • 你好,我也遇到这样的问题。我现在想看看是否进了cla的task,但是不知道怎么验证啊~求解!

  • 好贴,收藏了