Part Number:TMS320F28374SOther Parts Discussed in Thread:C2000WARE, SYSCONFIG
专家好:
参考C2000Ware例程写了一个CLA的程序,使用PWM过零触发ADC,ADC转换完成后会触发CLA进行闭环计算。目前只使用到了CLA的任务1(任务2给也设置了地址,但没有设置触发方式,因此不执行)
任务1里目前是个空白函数,任务1对应的中断里,只有清除相应ACK的操作。
测试发现,只进入了1次任务1对应的中断,之后CLA寄存器的状态就变成如下
可以看到,MIFR中的INT1是置位状态,表示产生了任务请求
但不知道为啥MIOVF的INT1也被置位了,从手册看MIOVF置位了表示在MIFR为1的时候又再次受到了任务请求,不知道是否是这样理解?
那这里就有点奇怪,第一次收到MIFR任务请求的时候,应该就会进入相应的任务去执行相关操作(任务是个空白函数),之后这个MIFR应该就会被自动清除掉,因此下一次被触发的时候MIFR应该为0才对。
另外,MIRUN的INT1一直为1,表示了任务1的函数当前正在执行,可是我的任务1对应的函数是个空白函数啊,为何会这样呢?
软件配置如下:
void CLA_DSP_configClaMemory(void) {extern INT32U Cla1ProgRunStart, Cla1ProgLoadStart, Cla1ProgLoadSize;#ifdef _FLASH// Copy over code from FLASH to RAMmemcpy((INT32U *)&Cla1ProgRunStart, (INT32U *)&Cla1ProgLoadStart, (INT32U)&Cla1ProgLoadSize);#endifMemCfg_initSections(MEMCFG_SECT_MSGCLA1TOCPU);while(!MemCfg_getInitStatus(MEMCFG_SECT_MSGCLA1TOCPU)){};MemCfg_initSections(MEMCFG_SECT_MSGCPUTOCLA1);while(!MemCfg_getInitStatus(MEMCFG_SECT_MSGCPUTOCLA1)){};MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS0, MEMCFG_LSRAMMASTER_CPU_CLA1);MemCfg_setCLAMemType(MEMCFG_SECT_LS0, MEMCFG_CLA_MEM_DATA);MemCfg_setLSRAMMasterSel(MEMCFG_SECT_LS1, MEMCFG_LSRAMMASTER_CPU_CLA1);MemCfg_setCLAMemType(MEMCFG_SECT_LS1, MEMCFG_CLA_MEM_PROGRAM); } void CLA_DSP_initCpu1Cla1() {#pragma diag_suppress=770CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_1, (uint16_t)&Cla1Task1);CLA_setTriggerSource(CLA_TASK_1, CLA_TRIGGER_ADCA1);CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_2, (uint16_t)(&Cla1Task2));//CLA_setTriggerSource(CLA_TASK_2, CLA_TRIGGER_ADCD1);#pragma diag_warning=770CLA_enableIACK(CLA1_BASE);CLA_enableTasks(CLA1_BASE, CLA_TASKFLAG_1);CLA_enableTasks(CLA1_BASE, CLA_TASKFLAG_2);Interrupt_register(INT_CLA1_1, &cla1Isr1);Interrupt_register(INT_CLA1_2, &cla1Isr2); } void CLA_init() {CLA_DSP_configClaMemory();CLA_DSP_initCpu1Cla1(); }
任务1:
__interrupt void Cla1Task1 (void)
{
return;
}
任务1对应的中断函数:
__interrupt void cla1Isr1 ()
{
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP11);
}
//更新后续操作现象
单步调试的时候,发现进入了任务1后,单步执行退出任务1后不知道为啥又进入了task2
任务1执行完后,单步执行下一步就进入了任务2
任务2的触发方式未做设置,按理说不应该会触发任务2吧?
想请教一下,这个是为啥呢,该如何修改?
另外,有点不明白为啥任务被触发后,还需要进一步触发相应的CLA任务中断呢?感觉不使能中断也并不影响任务的触发与执行
Yale Li:
先回答你这个问题:
user980814 said:另外,有点不明白为啥任务被触发后,还需要进一步触发相应的CLA任务中断呢?感觉不使能中断也并不影响任务的触发与执行
这个主要是用来在CLA与CPU之间做交互用,CLA任务执行完毕后通过中断的方式通知CPU,起到协同的作用;
user980814 said:但不知道为啥MIOVF的INT1也被置位了,从手册看MIOVF置位了表示在MIFR为1的时候又再次受到了任务请求,不知道是否是这样理解?
是的;
任务1每次执行完成后,就会触发任务1中断。任务1执行的时间比任务1中断执行的时间还要短,所以任务1中断就会一直处于触发及overflow的状态。
我建议你在例程的基础上进行修改。
,
user980814:
感谢您的回复!
Yale Li said:我建议你在例程的基础上进行修改。
目前这个是在例程上修改的,只是需要将例程加入目前已有的工程文件中,所以做了简化处理。
另外,目前例程基本都是寄存器操作形式提供的,仅有一个arccos的是用driverlib的形式提供,且其中还用到了sysconfig这种图形化配置界面,请问还有其他可以参考的以driverlib形式提供的例程吗?
Yale Li said:任务1执行的时间比任务1中断执行的时间还要短
这个会有什么问题吗?假设CLA的任务触发周期是1s,任务执行时间0.1s,中断执行时间0.2s,那中断执行完毕后,清除了CLA对应的中断标志位,之后就等待0.7s直到任务继续被触发吧?没明白任务执行时间和中断执行时间长短关系有何影响
,
Yale Li:
例程全都在C2000ware中了;
不好意思,之前没有看到有关触发的描述,
user980814 said:假设CLA的任务触发周期是1s,任务执行时间0.1s,中断执行时间0.2s,那中断执行完毕后,清除了CLA对应的中断标志位,之后就等待0.7s直到任务继续被触发吧?
你说的是没有问题的。
根据你之前描述的现象来看,如果器件没有问题的话,很大可能还是触发的问题。你上传上来的代码只有内存及相关任务、中断的配置。我建议你还是从触发的角度排查一下问题。
,
user980814:
感谢回复。
任务的触发在上面的代码中也给出来了,如下:
CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_1, (uint16_t)&Cla1Task1); CLA_setTriggerSource(CLA_TASK_1, CLA_TRIGGER_ADCA1); CLA_mapTaskVector(CLA1_BASE, CLA_MVECT_2, (uint16_t)(&Cla1Task2)); //CLA_setTriggerSource(CLA_TASK_2, CLA_TRIGGER_ADCD1);
是用ADCA1的中断来触发任务1,ADCD1的中断来触发任务2(测试中任务2的触发被屏蔽)
触发应该是比较简单的配置下就行吧,不明白这里可能有啥问题,而且单步调试发现任务2的触发方式被屏蔽了,但是任务1执行完毕后就直接进入了任务2
,
Yale Li:
ADC的速率是多少?
硬件用的是什么板子?TI的demo板还是自己做的?
方便直接跑一下例程看一下吗?排除一下器件方面的原因。