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:BackgroundTask 和 Task1之间的差异

Guru**** 2538950 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1069957/tms320f280049c-different-between-backgroundtask-and-task1

部件号:TMS320F280049C

尊敬的团队:

CLA 的初始化如下:

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);

    MemCfg_setCLAMemType(MEMCFG_SECT_LS0, MEMCFG_CLA_MEM_DATA);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS1, MEMCFG_CLA_MEM_DATA);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS2, MEMCFG_CLA_MEM_DATA);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS3, MEMCFG_CLA_MEM_DATA);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS4, MEMCFG_CLA_MEM_PROGRAM);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS5, MEMCFG_CLA_MEM_PROGRAM);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS6, MEMCFG_CLA_MEM_PROGRAM);
    MemCfg_setCLAMemType(MEMCFG_SECT_LS7, MEMCFG_CLA_MEM_PROGRAM);

    //
    // Suppressing #770-D conversion from pointer to smaller integer
    // The CLA address range is 16 bits so the addresses passed to the MVECT
    // registers will be in the lower 64KW address space. Turn the warning
    // back on after the MVECTs are assigned addresses
    //
    #pragma diag_suppress = 770

    CLA_mapTaskVector(CLA1_BASE , CLA_MVECT_1, (uint16_t)&Cla1Task1);
    CLA_mapTaskVector(CLA1_BASE , CLA_MVECT_2, (uint16_t)&Cla1Task2);
    CLA_mapTaskVector(CLA1_BASE , CLA_MVECT_3, (uint16_t)&Cla1Task3);
    CLA_mapTaskVector(CLA1_BASE , CLA_MVECT_4, (uint16_t)&Cla1Task4);
    CLA_mapTaskVector(CLA1_BASE , CLA_MVECT_5, (uint16_t)&Cla1Task5);
    CLA_mapTaskVector(CLA1_BASE , CLA_MVECT_6, (uint16_t)&Cla1Task6);
    CLA_mapTaskVector(CLA1_BASE , CLA_MVECT_7, (uint16_t)&Cla1Task7);
    CLA_mapBackgroundTaskVector(CLA1_BASE, (uint16_t)&Cla1BackgroundTask);

    #pragma diag_warning = 770

    CLA_enableIACK(CLA1_BASE);
    CLA_enableTasks(CLA1_BASE, CLA_TASKFLAG_ALL);

    CLA_enableHardwareTrigger(CLA1_BASE);
    CLA_setTriggerSource(CLA_TASK_8, CLLLC_ISR2_TRIG_CLA);
    CLA_enableBackgroundTask(CLA1_BASE);

    CLA_setTriggerSource(CLA_TASK_1, CLLLC_ISR2_TRIG_CLA);//CLA_TRIGGER_ADCB1);//CLLLC_ISR1_TRIG_CLA);
#endif
}

在使用 CLA 的过程中,我的客户发现,当他使用 BackgroundTask 进行如下编程时,会出现编译错误。

__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;
    }
    else
    {
        CLLLC_HAL_resetProfilingGPIO2();//GPIO22置低
        CLAtest = 1;
    }
}

当他在任务1中放置相同的任务内容时,该程序可以正常运行。

__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;
    }
    else
    {
        CLLLC_HAL_resetProfilingGPIO2();//GPIO22置低
        CLAtest = 1;
    }
}

问题是什么?

此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨,格林登,

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

    此外,请确保已打开编译标记--CLA_background_task (高级选项->运行时模型选项)。

    此致,

    维纳

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Veena:

    错误的对象是:

    但 DCL 的用户手册中是否没有提到这是针对 CLA 的? 这不是内联函数吗?

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,格林,

    是的,此功能适用于 CLA。 它不是内联函数。 函数调用可用于正常的 CLA 任务。 只有后台任务具有此限制。

    此致,

    维纳