Hi.
I am trying to make CLA unit work. I added counter below the every statement. But it's strange that tasks with even number doesn't work.
void initCLA(void)
{
/* Enable CLA clock */
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CLA1);
/* CLA Hard reset */
CLA_performHardReset(CLA1_BASE);
//
// Copy the program and constants from FLASH to RAM before configuring
// the 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 Program will reside in RAMLS0 and data in 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);
//
// 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
//
// Assign the task vectors and set the triggers for task 1 and 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);
//
// Enable Tasks 1 and 7. Since task 7 is forced in software, we must
// enable software forcing (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);
//
// The background task will be triggered by software; it shares
// the same trigger source as task 8. Disable the hardware triggering
// mechanism for the background task (if it is enabled) and then
// set the trigger source for task 8 to 0 indicating a software
// trigger.
//
// Enable the background task and start it. Enabling the background
// task disables task 8.
//
#pragma diag_warning=770
CLA_setTriggerSource(CLA_TASK_8, CLA_TRIGGER_SOFTWARE);
CLA_enableBackgroundTask(CLA1_BASE);
CLA_startBackgroundTask(CLA1_BASE);
}
And this is what I call inside a loop.
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);
}
}
}
And my debug screen.
