OMAPL138中断嵌套解决办法

本文探讨了在使用OMAPL138主控芯片的项目中,如何解决因中断优先级导致的中断嵌套问题。通过软件手段实现中断嵌套,确保在计算过程中数据采集不停止,优化了实时性和任务调度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OMAPL138中断嵌套解决办法

问题由来

在一个数据采集项目中,采用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的切换时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值