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 单元正常工作。 我在每条语句的下面添加了计数器。 但奇怪的是、偶数任务不起作用。
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 和 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 专家的看法。 我仍然很感谢您的帮助、我想了解真正的问题是什么。
[引用 user="Frozen (冻结)] CLA 的主要问题是我无法在.CLA 文件中使用断点。 [/报价]
在 F28004x CLA 2类上、有两种方法可以在 CLA 代码中设置断点。 请参阅特定于器件的 TRM。 搜索 MDEBUGSTOP。
[引用 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