TI中文支持网
TI专业的中文技术问题搜集分享网站

关于dsp28035的中断抢占

我要测试RX中断(INT9.1)的中断程序能够打断外部中断3(INT12.1)的中断程序,但是从仿真来看,高优先级的RX中断抢占不了外部中断3呢?

外部中断3程序,用63hz去触发,用一些运算占周期的90%时间。

__interrupt void xint3_isr(void)
{
xintcnt++;
LED_H;
level = 1;
//Cla1ForceTask8andWait();
for(i=0;i<40000;i++)//63hz
{
result = 123456.789 * 789345.123;
}
LED_L;
level = 0;
// Acknowledge this interrupt to get more from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP12;
}

RX中断,为什么if (level == 1)的断点进不去,也就是抢占不了外部中断。

__interrupt void sciaRxFifoIsr(void)
{
//LED_L;
//if (GpioDataRegs.GPADAT.bit.GPIO16 == 1)
if (level == 1)
{
SCILED_H;
}
else
{
SCILED_L;
}
SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
if (i >= 4)
{
i = 0;
}

SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag

PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ack
}

user5860441:中断支持抢占吗

我要测试RX中断(INT9.1)的中断程序能够打断外部中断3(INT12.1)的中断程序,但是从仿真来看,高优先级的RX中断抢占不了外部中断3呢?

外部中断3程序,用63hz去触发,用一些运算占周期的90%时间。

__interrupt void xint3_isr(void)
{
xintcnt++;
LED_H;
level = 1;
//Cla1ForceTask8andWait();
for(i=0;i<40000;i++)//63hz
{
result = 123456.789 * 789345.123;
}
LED_L;
level = 0;
// Acknowledge this interrupt to get more from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP12;
}

RX中断,为什么if (level == 1)的断点进不去,也就是抢占不了外部中断。

__interrupt void sciaRxFifoIsr(void)
{
//LED_L;
//if (GpioDataRegs.GPADAT.bit.GPIO16 == 1)
if (level == 1)
{
SCILED_H;
}
else
{
SCILED_L;
}
SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
if (i >= 4)
{
i = 0;
}

SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag

PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ack
}

Susan Yang:

回复 user5860441:

支持的,低优先级的可以抢占高优先级的中断。

您可以看一下 www.ti.com.cn/…/sprui10.pdf 的 1.6 Peripheral Interrupt Expansion (PIE)

所有C2000芯片都支持中断嵌套,但默认是不使能的。

例程的话,您可以参考

C:\ti\controlSUITE\device_support\f2803x\v130\DSP2803x_examples_ccsv5\sw_prioritized_interrupts

我要测试RX中断(INT9.1)的中断程序能够打断外部中断3(INT12.1)的中断程序,但是从仿真来看,高优先级的RX中断抢占不了外部中断3呢?

外部中断3程序,用63hz去触发,用一些运算占周期的90%时间。

__interrupt void xint3_isr(void)
{
xintcnt++;
LED_H;
level = 1;
//Cla1ForceTask8andWait();
for(i=0;i<40000;i++)//63hz
{
result = 123456.789 * 789345.123;
}
LED_L;
level = 0;
// Acknowledge this interrupt to get more from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP12;
}

RX中断,为什么if (level == 1)的断点进不去,也就是抢占不了外部中断。

__interrupt void sciaRxFifoIsr(void)
{
//LED_L;
//if (GpioDataRegs.GPADAT.bit.GPIO16 == 1)
if (level == 1)
{
SCILED_H;
}
else
{
SCILED_L;
}
SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
if (i >= 4)
{
i = 0;
}

SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag

PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ack
}

user5860441:

回复 Susan Yang:

低优先级的可以抢占高优先级的中断???

我要测试RX中断(INT9.1)的中断程序能够打断外部中断3(INT12.1)的中断程序,但是从仿真来看,高优先级的RX中断抢占不了外部中断3呢?

外部中断3程序,用63hz去触发,用一些运算占周期的90%时间。

__interrupt void xint3_isr(void)
{
xintcnt++;
LED_H;
level = 1;
//Cla1ForceTask8andWait();
for(i=0;i<40000;i++)//63hz
{
result = 123456.789 * 789345.123;
}
LED_L;
level = 0;
// Acknowledge this interrupt to get more from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP12;
}

RX中断,为什么if (level == 1)的断点进不去,也就是抢占不了外部中断。

__interrupt void sciaRxFifoIsr(void)
{
//LED_L;
//if (GpioDataRegs.GPADAT.bit.GPIO16 == 1)
if (level == 1)
{
SCILED_H;
}
else
{
SCILED_L;
}
SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
if (i >= 4)
{
i = 0;
}

SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag

PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ack
}

user5860441:

回复 Susan Yang:

我现在是想高优先级的中断打断低优先级的中断程序,是不是只用在低优先级的中断程序进入时打开全局中断?

我要测试RX中断(INT9.1)的中断程序能够打断外部中断3(INT12.1)的中断程序,但是从仿真来看,高优先级的RX中断抢占不了外部中断3呢?

外部中断3程序,用63hz去触发,用一些运算占周期的90%时间。

__interrupt void xint3_isr(void)
{
xintcnt++;
LED_H;
level = 1;
//Cla1ForceTask8andWait();
for(i=0;i<40000;i++)//63hz
{
result = 123456.789 * 789345.123;
}
LED_L;
level = 0;
// Acknowledge this interrupt to get more from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP12;
}

RX中断,为什么if (level == 1)的断点进不去,也就是抢占不了外部中断。

__interrupt void sciaRxFifoIsr(void)
{
//LED_L;
//if (GpioDataRegs.GPADAT.bit.GPIO16 == 1)
if (level == 1)
{
SCILED_H;
}
else
{
SCILED_L;
}
SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
if (i >= 4)
{
i = 0;
}

SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag

PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ack
}

Susan Yang:

回复 user5860441:

我们通常讲的PIE中断优先级讲的是当几个中断同时发出请求时,CPU先响应高优先级别的中断,处理完中断服务函数之后,再响应低优先级的中断。当然,如果在这个期间,等待的中断如有新的中断事件出现的时候,就会丢失。按正常的程序设置来讲,进入中断服务函数之后,CPU会关掉全局中断使能,所以高优先级的中断打断不了低优先级别的中断。
但是C2000也是支持中断嵌套的,也就是你所需要的高优先级别的中断能够打断低优先级别的中断。当CPU在执行SCIB的中断服务函数时,可以被EPWM中断来打断,实现中断嵌套。具体的设置方法不复杂,你可以参照下面的网址:

processors.wiki.ti.com/…/Interrupt_Nesting_on_C28x

我要测试RX中断(INT9.1)的中断程序能够打断外部中断3(INT12.1)的中断程序,但是从仿真来看,高优先级的RX中断抢占不了外部中断3呢?

外部中断3程序,用63hz去触发,用一些运算占周期的90%时间。

__interrupt void xint3_isr(void)
{
xintcnt++;
LED_H;
level = 1;
//Cla1ForceTask8andWait();
for(i=0;i<40000;i++)//63hz
{
result = 123456.789 * 789345.123;
}
LED_L;
level = 0;
// Acknowledge this interrupt to get more from group 1
PieCtrlRegs.PIEACK.all = PIEACK_GROUP12;
}

RX中断,为什么if (level == 1)的断点进不去,也就是抢占不了外部中断。

__interrupt void sciaRxFifoIsr(void)
{
//LED_L;
//if (GpioDataRegs.GPADAT.bit.GPIO16 == 1)
if (level == 1)
{
SCILED_H;
}
else
{
SCILED_L;
}
SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
// SCI_RXbuf[i] = SciaRegs.SCIRXBUF.all;
// i++;
if (i >= 4)
{
i = 0;
}

SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag

PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ack
}

user5860441:

回复 Susan Yang:

示例是INT2.2抢占INT2.1中断,也就是低优先级抢占高优先级。
1、不要在该组的ISR外部修改PIEIER寄存器。例如,仅应在组1的ISR中修改PIEIER1。同样,应仅在组2的ISR中修改PIEIER2。
该修改应在该组的PIEACK位置1时进行,因此在进行修改时不会向CPU发送任何中断。
这句讲的是组内中断,如果是不同组的,又想让低优先级抢占高优先级的,怎么办?

赞(0)
未经允许不得转载:TI中文支持网 » 关于dsp28035的中断抢占
分享到: 更多 (0)