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

AM5728: A15核的纯裸机中断异常的问题

Part Number:AM5728Other Parts Discussed in Thread:AM5729,

板子是beaglebone AI,CPU是AM5729,编译器是CCS10,开启的A15的定时器3的溢出中断,中断参数的配置和步骤如下:

第一步 :调用F:\ti\pdk_am57xx_1_0_17目录下的中断向量表初始化函数,将定时器3中断服务函数注册到向量表中

void CSL_A15_INIT_copyVectorTable(void)
{
uint32_t vectorBase = 0x40300000U;

uint32_t vectorOffset = (512U * 1024U) – 0x400U;

uint32_t *dest;
uint32_t const *src = (uint32_t const *)vecTbl;
uint32_t count;

if (&__vector_base__)
{
vectorBase = (uint32_t) &__vector_base__;
}
else
{
vectorBase += vectorOffset;
}

dest = (uint32_t *) vectorBase;
CSL_a15SetVectorTable(vectorBase);

for(count = 0; count < (sizeof(vecTbl)/sizeof(vecTbl[0])); count++)
{
dest[count] = src[count];
}
//Intc_IntRegister(4, (IntrFuncPtr)Ethernet_RX_ISR,0);//注册千兆网接收中断,编号为4
//Intc_IntRegister(7, (IntrFuncPtr)Ethernet_TX_ISR,0);//注册千兆网发送中断,编号为7
//Intc_IntRegister(8, (IntrFuncPtr)MDIO_ISR, 0);//注册千兆网MDIO中断,编号为8
Intc_IntRegister(39,(IntrFuncPtr)Timer3_ISR, 0);//注册TIMER3中断,编号为39
}

第二步 :分别配置T3的中断参数和A15中断控制器GIC的参数

void Init_MPU_INTC(void)
{
Intc_Init();

Init_TIMER3_INTC();
IntMasterIRQEnable(); //使能主IRQ中断
}

void Init_TIMER3_INTC(void)
{
GICDRegs.Priority[17] = 0x80F0F0F0;//39号中断优先级
Intc_SystemEnable(39); //使能39号中断,对应TIMER3中断
}

void Init_Timer_Interrupt_Parameter(void)
{
GPTIMER3_Regs.IRQEnableSet.bit.OverFlow = 1;//使能定时器溢出中断
GPTIMER3_Regs.TCLR.bit.Start_Stop = 1; //打开定时器
}

第三步:中断服务函数

interrupt void Timer3_ISR(void)
{
Uint32 Status;
Count++;
Test1 = 1;
if(GICDRegs.ISACTIVE[2] == 128)
{
Test2 = ~Test2;
Count1++;
}
GPTIMER3_Regs.IRQSTATUS.bit.OverFlow = 1;
GPTIMER3_Regs.IRQ_EOI.bit.Line_Num = 0;
Status = GICCRegs.IAR;
GICCRegs.EOIR = 71;
//while(GICCRegs.HPPIR != 71);
//Status = GICCRegs.IAR;
Test1 = 0;
}

中断服务函数中,Test1和Test2分别是板子上的两个IO口,外接裸机分析仪。进调试模式后,能进T3中断,如果正常运行的话,逻辑分析仪应该可以在Test1上测量到连续的脉冲串,但实际的测量结果如下:

对单个脉冲进行局部放大后的情况如下:

很明显,每次中断退出后,又在快速的进了一次中断,这明显有问题。而且T3中断基本每次运行287次后就进入系统默认中断,跑进死循环了。

这两个相邻的脉冲中,GICDRegs.ISACTIVE[2] == 128 这个事件发生在第一个脉冲里面,第二个脉冲,也就是快速进第二次中断后,这个事件就不成立了,在A15的GIC文档中有提到假中断的问题,不清楚这是不是属于假中断。中断函数中,变量Count的计数值是287,Count1因为是在GICDRegs.ISACTIVE[2] == 128这个事件成立时才开始自加一,故其计数值是144,之后中断就进入系统默认中断了。

另外,我开启千兆网的MDIO中断,就是检测网线是否接入的中断,每次插上或者拔下网线后,依然是同样的情况。且在AM5728上测试,都是同样的现象

针对上述问题,在ARM的官网上下载了有关中断控制器GIC的文档看了很久,也看了A15内核方面的官方文档,都没看出哪里有问题

user18914063:

补充一下,逻辑分析仪的截图,测量的是Test1对应的IO口,事件GICDRegs.ISACTIVE[2] == 128,是因为T3的中断优先级配置的是0x80,也就是128这个数值

,

Nancy Wang:

建议您到英文论坛咨询,会有相关专家给您提供支持,如果您无法在英文论坛发帖,请告知,我们会帮您升级处理。

e2e.ti.com/…/processors-forum

,

user18914063:

那麻烦你们帮我在英文论坛那边咨询下吧,我这边不好操作,谢谢了哈Slight smile

,

Nancy Wang:

有几个问题再跟您确认一下:

user18914063 说:而且T3中断基本每次运行287次后就进入系统默认中断,跑进死循环了

具体是哪个中断?

user18914063 说:,第二个脉冲,也就是快速进第二次中断后,这个事件就不成立了,

请问第二个异常脉冲发生时是无法进入ISR中断函数的吗?

user18914063 说:在A15的GIC文档中有提到假中断的问题,不清楚这是不是属于假中断。

这部分内容可否贴出来一下。

,

user18914063:

1:T3中断异常后,进入的系统默认中断如下截图:

此中断位于F:\ti\pdk_am57xx_1_0_17\packages\ti\csl\arch\a15\src

2:两个脉冲都是在进入中断后逻辑分析仪测量到的,都是同一个IO口

3:在ARM的官方文档 ARM® Generic Interrupt Controller  Architecture version 2.0  Architecture Specification第26页介绍GICC,即中端控制器CPU接口章节提到了,截图如下

另外,下午我尝试加大堆栈,发现堆栈设置的越大,进T3中断的次数越多,但无论设置多大的堆栈,最终都会进入1中截图的默认中断,我的猜测是,T3中断退出后,系统没有将使用的堆栈退出,而是一直占用,每进一次中断,占用的堆栈数量累加,最终导致堆栈消耗完毕,系统进入默认中断的死循环。但无论进中断次数是多是少,都一直是出现连续两次快速进中断的情况。总体说来,我感觉还是堆栈那边的问题。

,

Nancy Wang:

请关注:

e2e.ti.com/…/am5728-a15-bare-metal-timer3-interrupt-exception

赞(0)
未经允许不得转载:TI中文支持网 » AM5728: A15核的纯裸机中断异常的问题
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1