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.

[参考译文] LAUNCHXL-F280049C:CLA 示例问题。 偶数任务不起作用。#39;T

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/794599/launchxl-f280049c-cla-example-problem-tasks-with-even-number-doesn-t-work

器件型号:LAUNCHXL-F280049C

你(们)好

我正在尝试使 CLA 单元正常工作。 我在每条语句的下面添加了计数器。 但奇怪的是、偶数任务不起作用。

void initCLA (void)
{
/*启用 CLA 时钟*/
SYSCTL_enablePeripheral (SYSCTL_Periph_CLK_CLA1);

/* CLA 硬复位*/
CLA_performHardReset (CLA1_base);

//
//在配置之前将程序和常量从闪存复制到 RAM 中
// CLA
//
#if defined (_FLASH)
memcpy (((uint32_t *)&Cla1ProgRunStart、(uint32_t *)&Cla1ProgLoadStart、
(uint32_t)和 Cla1ProgLoadSize);
memcpy (((uint32_t *)&Cla1ConstRunStart、(uint32_t *)&Cla1ConstLoadStart、
(uint32_t)&Cla1ConstLoadSize);
#endif //defined (_flash)

//
// CLA 程序将驻留在 RAMLS0中,数据驻留在 RAMLS1、RAMLS2中
//
MemCfg_setCLAMemType (MEMCFG_Sect_LS0、MEMCFG_CLA_MEM_program);
MemCfg_setCLAMemType (MEMCFG_Sect_LS1、MEMCFG_CLA_MEM_DATA);
MemCfg_setCLAMemType (MEMCFG_Sect_LS2、MEMCFG_CLA_MEM_DATA);
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);

//
抑制从指针到较小整数的#770-D 转换
// CLA 地址范围为16位,因此传递到 MVECT
//寄存器的地址将位于低64KW 地址空间中。
在为 MVECT 分配地址后、重新打开警告//

#pragma diag_suppress=770

//
//分配任务矢量并设置任务1和7的触发器
//
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_setTriggerSource (CLA_task_1、CLA_TRIGGER_SOFTWARE);
CLA_setTriggerSource (CLA_task_2、CLA_trigger_software);
CLA_setTriggerSource (CLA_task_3、CLA_trigger_software);
CLA_setTriggerSource (CLA_task_4、CLA_TRIGGER_SOFTWARE);
CLA_setTriggerSource (CLA_task_5、CLA_TRIGGER_SOFTWARE);
CLA_setTriggerSource (CLA_task_6、CLA_TRIGGER_SOFTWARE);
CLA_setTriggerSource (CLA_task_7、CLA_TRIGGER_SOFTWARE);


//
//启用任务1和7。 由于任务7是在软件中强制执行的、因此我们必须执行
//启用软件强制(IACKE)
//
CLA_enableTasks (CLA1_base、CLA_TASKFLAG_1);
CLA_enableTasks (CLA1_base、CLA_TASKFLAG_2);
CLA_enableTasks (CLA1_base、CLA_TASKFLAG_3);
CLA_enableTasks (CLA1_base、CLA_TASKFLAG_4);
CLA_enableTasks (CLA1_base、CLA_TASKFLAG_5);
CLA_enableTasks (CLA1_base、CLA_TASKFLAG_6);
CLA_enableTasks (CLA1_base、CLA_TASKFLAG_7);
CLA_enableIACK (CLA1_base);

//
//后台任务将由软件触发;它共享
//与任务8相同的触发源。 禁用硬件触发
//后台任务的机制(如果已启用),然后
//将任务8的触发源设置为0,表示软件
//触发。
//
//启用后台任务并启动它。 启用背景
//任务禁用任务8。
//
#pragma diag_warning=770
CLA_setTriggerSource (CLA_task_8、CLA_trigger_software);
CLA_enableBackgroundTask (CLA1_base);
cla_startBackgroundTask (CLA1_base);



} 

这就是我在环路中调用的内容。

void CLA_Task (void * CLAtaskParameter)
{
for (;;)
{
if (xSemaphoreTake (testSemaphore_smph、portMAX_DELAY))
{
C2000_Var.semaphorecounter_i16++;
CLA_forceTasks (CLA1_base、CLA_TASKFLAG_1);
vTaskDelay (100);
CLA_forceTasks (CLA1_base、CLA_TASKFLAG_2);
vTaskDelay (100);
CLA_forceTasks (CLA1_base、CLA_TASKFLAG_3);
vTaskDelay (100);
CLA_forceTasks (CLA1_base、CLA_TASKFLAG_4);
vTaskDelay (100);
CLA_forceTasks (CLA1_base、CLA_TASKFLAG_5);
vTaskDelay (100);
CLA_forceTasks (CLA1_base、CLA_TASKFLAG_6);
vTaskDelay (100);
CLA_forceTasks (CLA1_base、CLA_TASKFLAG_7);
vTaskDelay (100);

}
}


和我的调试屏幕。

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

    我怀疑其他计数器似乎都为零的问题与 int 的大小有关。

    • 对于 CLA、int 为32位
    • 对于 C28x、int 为16位

    为了避免在 CLA 和 C28x 之间共享数据时出现歧义、强烈建议您使用包含大小信息的类型声明(例如、中定义的 int32_t 和 uint16_t) )。

    要调试此问题、请在其中一个偶数任务中放置一个断点。  确保 CLA 已连接、然后查看是否已达到断点。  从那里单步执行代码、以查看计数器递增时会发生什么情况。  

    如果你没有命中断点、那么检查 CLA 设置(矢量是正确的、任务是被启用的、等等)。

    此致

    Lori

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

    CLA 的主要问题是我无法在.CLA 文件中使用断点。 不断变化的变量类型无法解决我的问题。 实际上、当我尝试将变量从计数器更改为静态时、我发现了非常奇怪的事情。 我将它们声明为

    T1 = 101

    T2 = 102

    T3 = 103

    T4 = 104

    T5 = 105

    T6 = 106

    T7 = 107

    但是、当我按下调试按钮时、我看到了这一点

    T1 = 101

    T2 = 0

    T3 = 102

    T4 = 0

    T5 = 103

    T6 = 0

    T7 = 104

    我真的不知道发生了什么、但当我删除项目并创建新项目时、我的问题得到解决。 我认为 CLA 还不是一个可靠的模块。 我不知道 TI 专家的看法。 我仍然很感谢您的帮助、我想了解真正的问题是什么。

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

    单击此处了解更多 CLA 常见问题解答和资源。

    [引用 user="Frozen (冻结)] CLA 的主要问题是我无法在.CLA 文件中使用断点。 [/报价]

    在 F28004x CLA 2类上、有两种方法可以在 CLA 代码中设置断点。  请参阅特定于器件的 TRM。  搜索 MDEBUGSTOP。

    http://www.ti.com/lit/sprui33

    [引用 user="FROZEN ]实际上、当我尝试将变量从计数器更改为静态变量时、我发现了非常奇怪的事情。 我已将其声明为[/引用]

    显示的代码是初始化、而不是声明。 声明应使用 C99数据类型、以便变量的大小不模糊。

    此博客文章对其进行了很好的描述: https://barrgroup.com/Embedded-Systems/How-To/C-Fixed-Width-Integers-C99

    例如

    //
    //在共享头文件和 main .c 文件中
    //不指示变量的大小
    // C28x 上的 unsigned int 为16位,CLA 上的 unsigned int 为32位
    // 
    unsigned int t0; unsigned int t1; // 改为使用带有大小信息 的 C99数据类型// #include uint16_t t0; uint16_t t1;

    此致、Lori