嵌入式开发中,中断有多重要无需我过多赘述,如果开发工程师仅停留在配置层面去理解中断,似乎有些“飘”了(对,说的就是我自己),使用配置工具配置是省事,但是很多时候我们就是一知半解,排查bug的时候才感觉到心有余而力不足。来,本文撕一下tc397中断。
(资料图片仅供参考)
1CPU如何找到中断函数前面简单地说过,每个CPU是通过其对应的中断向量表基地址和中断向量号找到中断处理函数入口地址的,可以回顾英飞凌tc397:告诉你程序真正的启动过程。本文做进一步解释,我们写的中断函数是如何被CPU找到的。
本文写一个DMA中断处理函数,讲解其被CPU0找到的过程:
,我们写一个中断处理函数DMA_SendIntHandle,该处理函数由CPU0处理,设置中断优先级为5。tc397有6个核,这里只讲解CPU0中断处理过程,其它核或者DMA处理类似。
)
,中断函数在编译的时候会分配一个函数入口地址,如下所示:,CPU通过中断向量表号(即知道其对应的中断向量表基地址)和中断优先级找到了0x802FE0A0这个地址,要在这个地址处取指令和执行指令,如下所示。如下指令告诉CPU0,跳转到0x80003914这个位置,执行我们编写的中断函数。CPU0跳转到中断函数DMA_SendIntHandle入口位置(0x80003914),至此,我们写的中断处理函数将被执行。2补充(1)宏IFX_INTERRUPT展开后,做两件事:第一,为每个中断分配一个独立段(这个段的大小为32byte);第二,执行跳转指令。如下:我们设置了一个优先级为5的中断,该中断被分配一个32byte空间(每一个中断都分配32byte空间),而这个空间的起始地址就是我们刚才计算得到的:(5<<5) +BIV存储基地址=0xA0 + 0x802FE000=0x802FE0A0。所以,如果在32byte的空间内能完成中断功能,就不必写中断处理函数,直接在这32byte空间内实现。一般来说,32byte空间不能完成我们的中断处理功能,所以32byte里面我们设置了一个跳转指令,跳转到我们编写的中断函数位置,执行我们的目标功能。
再说细一点,对于CPU0,设置的中断向量表基地址为0x802FE000:
中断优先级为1时,获取的32byte空间起始地址:
0x802FE000+32 = 0x802FE020,在此地址处开始执行指令(跳转指令),即跳转到用户中断函数
中断优先级为2时,获取的32byte空间起始地址:
0x802FE000+64 = 0x802FE040
中断优先级为3时,获取的32byte空间起始地址:
0x802FE000+96=0x802FE060
...
DMA可以设置中断优先级0:
中断优先级为0时,获取的32byte空间起始地址:
0x802FE000
...
中断优先级0也是该中断向量表的基地址,如下所示。
(2)每个中断请求节点都有一个对应的服务请求控制寄存器:Service Request Control (SRC)。TC39x对应SRC基地址如下所示:TC39x部分节点的SRC如下所示:每个节点的SRC结构一样,SRC寄存器位域如下所示,每个节点中断功能的开启均需要使能SRE(Service Request Enable)。(3)对于英飞凌tc397来说,中断处理者(CPU/DMA)只有7个,中断请求节点多达1024个,某一时刻,每个中断处理者可能要处理多个中断请求,所以得给中断优先级。中断优先级的设置由开发者决定,中断节点越重要,一般给的中断优先级越高。