问题由来
在一个数据采集项目中,采用OMAPL138作为主控芯片。在DSP侧开启一个125us的定时器,采集80个通道的AD数据后,然后启动DMA数据传输,在传输完成中断中,进行计算处理。
采集数据大约需要100us,数据传输大约需要140us,计算需要14ms。明显的计算过程比较耗时,但是计算周期是20ms,只需要在20ms内完成计算即可,所以也是可以的。定时器采用4号中断,DMA采用8号中断.。
但是问题是由于OMAPL138的中断优先级,仅仅在当两个中断同时到来时才有效。也就是说如果同时发生4号和8号中断,则会优先响应4号中断,但是如果8号中断正在执行,此时若发生4号中断cpu是不会响应的。由此带来的问题是:在计算过程中是停止采样的,显然这是不允许的。而如果将计算过程放到主循环中,由于主循环时间不能保证,所以不能保证计算的实时性。因此,需要解决在低优先级中断执行过程中,被高优先级中断打断的问题。
解决方法
通过查阅TI的官方文档sprufe8b.pdf
可知,通过软件可以实现中断嵌套问题。
#include <c6x.h>
interrupt void xxISR(){
unsigned int restore_irp;
unsigned int restore_pgie;
unsigned int restore_itsr;
/*this is used for nest interrupt*/
//save context
restore_irp=IRP;
restore_pgie=CSR & 2;
restore_itsr=ITSR;
CSR|=1;//enable GIE
IER|=1<<4;
//your isr code
....
/*this is used for nest interrupt*/
//restore context
CSR &=0xfffe;//clear gie
CSR |=restore_pgie;
ITSR=restore_itsr;
IRP=restore_irp;
}
以上代码在实际中可以使用,达到了预定目标。实际使用中会损失几us的切换时间。