TI中文支持网
TI专业的中文技术问题搜集分享网站

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

Part Number:TMS320F280049C

我在使用CLA的过程中发现

CLA的初始化如下

void CLLLC_HAL_setupCLA(void)
{//// setup CLA to register an interrupt//
#if CLLLC_ISR1_RUNNING_ON == CLA_COREmemcpy((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 = 770CLA_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 = 770CLA_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
}

当我使用BackgroundTask时

__attribute__((interrupt("background")))  void Cla1BackgroundTask ( void )
{


#ifdef BUCK_CONTROL_RUNNING_ON_CLABUCK_runIsr();
#ifdef BUCK2_ENABLEBUCK2_runIsr();
#endif
#ifdef BUCK3_ENABLEBUCK3_runIsr();
#endif
#ifdef BUCK4_ENABLEBUCK4_runIsr();
#endif
#endifif(CLAtest == 1){CLLLC_HAL_setProfilingGPIO2();//GPIO22置高CLAtest = 0;}else{CLLLC_HAL_resetProfilingGPIO2();//GPIO22置低CLAtest = 1;}
}

编译就会不通过,如图

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

__attribute__((interrupt))  void Cla1Task1 ( void )
{#if(CLA_DEBUG == 1)__mdebugstop();#endif
#ifdef BUCK_CONTROL_RUNNING_ON_CLABUCK_runIsr();
#ifdef BUCK2_ENABLEBUCK2_runIsr();
#endif
#ifdef BUCK3_ENABLEBUCK3_runIsr();
#endif
#ifdef BUCK4_ENABLEBUCK4_runIsr();
#endif
#endifif(CLAtest == 1){CLLLC_HAL_setProfilingGPIO2();//GPIO22置高CLAtest = 0;}else{CLLLC_HAL_resetProfilingGPIO2();//GPIO22置低CLAtest = 1;}
}

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

Green Deng:

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

,

Green Deng:

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

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

,

YingJed Ying:

Background我是打开的

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

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

#ifndef __TMS320C28XX_CLA__#define BUCK_DCL_CTRL_TYPEDCL_DF22#define BUCK_DCL_CTRL_DEFAULTSDF22_DEFAULTS#define BUCK_DCL_SPS_TYPEDCL_DF22_SPS#define BUCK_DCL_SPS_DEFAULTSDF22_SPS_DEFAULTS#define BUCK_DCL_RESETDCL_resetDF22#define BUCK_DCL_LOAD_PIDDCL_loadDF22asSeriesPID#define BUCK_DCL_LOAD_ZPKDCL_loadDF22asZPK#define BUCK_DCL_UPDATEDCL_updateDF22#define BUCK_DCL_RUN_IMMEDIATEDCL_runDF22_C5#define BUCK_DCL_RUN_PARTIALDCL_runDF22_C6#define BUCK_DCL_RUN_CLAMPDCL_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// the .cla file since they are not visible to it.//#define BUCK_DCL_CTRL_TYPEDCL_DF22_CLA#define BUCK_DCL_RUN_IMMEDIATEDCL_runDF22_L2#define BUCK_DCL_RUN_PARTIALDCL_runDF22_L3#define BUCK_DCL_RUN_CLAMPDCL_runClamp_L1#endif

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

,

Green Deng:

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

,

YingJed Ying:

不是吧,那我不能理解啊

它报错的是不能使用这个

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

,

YingJed Ying:

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

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

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

,

Green Deng:

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

,

YingJed Ying:

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

,

Green Deng:

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

,

YingJed Ying:

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

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F280049C: 关于CLA的BackgroundTask和Task1的区别
分享到: 更多 (0)