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.

TMS320F280049C: 关于CLA的BackgroundTask和Task1的区别

Part Number: TMS320F280049C

我在使用CLA的过程中发现

CLA的初始化如下

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void CLLLC_HAL_setupCLA(void)
{
//
// setup CLA to register an interrupt
//
#if CLLLC_ISR1_RUNNING_ON == CLA_CORE
memcpy((uint32_t *)&Cla1ProgRunStart, (uint32_t *)&Cla1ProgLoadStart,
(uint32_t)&Cla1ProgLoadSize );
//
// first assign memory to CLA
//
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS0, MEMCFG_LSRAMMASTER_CPU_CLA1);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS1, MEMCFG_LSRAMMASTER_CPU_CLA1);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS2, MEMCFG_LSRAMMASTER_CPU_CLA1);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS3, MEMCFG_LSRAMMASTER_CPU_CLA1);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS4, MEMCFG_LSRAMMASTER_CPU_CLA1);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS5, MEMCFG_LSRAMMASTER_CPU_CLA1);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS6, MEMCFG_LSRAMMASTER_CPU_CLA1);
MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS7, MEMCFG_LSRAMMASTER_CPU_CLA1);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

当我使用BackgroundTask时

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
__attribute__((interrupt("background"))) void Cla1BackgroundTask ( void )
{
#ifdef BUCK_CONTROL_RUNNING_ON_CLA
BUCK_runIsr();
#ifdef BUCK2_ENABLE
BUCK2_runIsr();
#endif
#ifdef BUCK3_ENABLE
BUCK3_runIsr();
#endif
#ifdef BUCK4_ENABLE
BUCK4_runIsr();
#endif
#endif
if(CLAtest == 1)
{
CLLLC_HAL_setProfilingGPIO2();//GPIO22
CLAtest = 0;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

编译就会不通过,如图

但当我把相同的任务内容放在Task1时

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
__attribute__((interrupt)) void Cla1Task1 ( void )
{
#if(CLA_DEBUG == 1)
__mdebugstop();
#endif
#ifdef BUCK_CONTROL_RUNNING_ON_CLA
BUCK_runIsr();
#ifdef BUCK2_ENABLE
BUCK2_runIsr();
#endif
#ifdef BUCK3_ENABLE
BUCK3_runIsr();
#endif
#ifdef BUCK4_ENABLE
BUCK4_runIsr();
#endif
#endif
if(CLAtest == 1)
{
CLLLC_HAL_setProfilingGPIO2();//GPIO22
CLAtest = 0;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

程序就能编译通过并正常运行,这是什么原因?

  • 你好,问题已经收到,我会与CLA方面的专家沟通后给你答复

  • CLA 编译器不允许在后台任务中进行函数调用。允许使用内联函数,并且可以改为使用内联函数。

    此外,确保编译标志 --cla_background_task(Advanced Options-> Runtime Model Options)已打开。

  • Background我是打开的

    CLA不能函数调用只能使用内联函数也对,但是CLATASK1是可以运行的啊说明它确实是内联的,函数是一模一样的啊,但是放到Background就不行,是Background有区别嘛?

    那又回到我之前问你的那个问题了

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #ifndef __TMS320C28XX_CLA__
    #define BUCK_DCL_CTRL_TYPE DCL_DF22
    #define BUCK_DCL_CTRL_DEFAULTS DF22_DEFAULTS
    #define BUCK_DCL_SPS_TYPE DCL_DF22_SPS
    #define BUCK_DCL_SPS_DEFAULTS DF22_SPS_DEFAULTS
    #define BUCK_DCL_RESET DCL_resetDF22
    #define BUCK_DCL_LOAD_PID DCL_loadDF22asSeriesPID
    #define BUCK_DCL_LOAD_ZPK DCL_loadDF22asZPK
    #define BUCK_DCL_UPDATE DCL_updateDF22
    #define BUCK_DCL_RUN_IMMEDIATE DCL_runDF22_C5
    #define BUCK_DCL_RUN_PARTIAL DCL_runDF22_C6
    #define BUCK_DCL_RUN_CLAMP DCL_runClamp_C2
    #else
    //
    //#####BEGIN_INTERNAL#####
    //todo Figure out how to replace the FPU32 equivalents of _RESET, _LOAD_PID, _LOAD_ZPK, _UPDATE
    //#####END_INTERNAL#####
    // NOTE: the above are still used in the CLA case. Just that they get defined out when compiling
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    对于这样的定义,你之前跟我说当CLA调用该头文件时"__TMS320C28XX_CLA__"会被定义就会执行"#else"的内容,而现在执行出来的效果是,CLATASK1调用有这个效果,而Background调用,没有这个效果

  • CLA 编译器不允许在Background task中进行函数调用,这里没用英文,抱歉。

  • 不是吧,那我不能理解啊

    它报错的是不能使用这个

    你的DCL的用户手册不是说这个就是给CLA用的嘛?难道你这个不是内联的?

  • 还是说,调用的方式有问题,那就又回到这个问题了

    https://e2echina.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/211492/tms320f280049c-__tms320c28xx_cla__

    怎么样才能让Background的任务调用CLA对应的DCL算法了

  • 是的,此功能适用于 CLA,但它不是内联函数。 函数调用可用于正常的 CLA task。 只有Background task有这个限制。

  • 那如果我要在Background中使用应该怎么做?为什么background有这个限制?能解答嘛?

  • Background task只能使用内联函数,不能调用函数。至于为什么。。。这个我也不了解。

  • 那再问一个问题,CLA任务的运行顺序是1~7串行,然后background是独立一个运行顺序的嘛?我的意思是这8个任务有没有哪几个是并行运行的?