1、首先在某芯片的启动文件中,给出的中断向量表全是指向同一个函数。(一开始我以为是错的,自己改成各个默认中断服务函数的入口,这样就成了非接管中断)。
部分代码如下,其中irq_handler就是那个统一的中断服务函数。他被定义在调度文件los_dispatch中。
__Vectors:
.long Reset_Handler
.long vec_handler
/*
此处略去很多字
*/
/* External interrupts */
.long irq_handler /* 0: UART */
.long irq_handler /* 1: CoreTIM */
.long irq_handler /* 2: Timer0 */
.long irq_handler /* 3: Timer1 */
.long irq_handler /* 4: Timer2 */
.long irq_handler /* 5: Timer3 */
.long irq_handler
.long irq_handler /* 7: GPIO0 */
.long irq_handler /* 8: GPIO1 */
.long irq_handler /* 9: GPIO2 */
/*
此处略去很多字
*/
.long irq_handler
.long irq_handler
.long irq_handler
.size __Vectors, . - __Vectors
2、该函数irq_handler是由汇编语言编写,最终跳转到irq_dispatch函数。
irq_handler:
psrset ee
/*
此处略去很多字
*/
bsr irq_dispatch
/*
此处略去很多字
*/
3、irq_dispatch函数被定义在一个C文件中(los_hwi.c),根据向量号,查询表中的函数入口,并执行。(这些函数入口根据用户的需要自行定义,由LOS_HwiCreate注册到表中)。
4、上述的流程,结合自己的理解,如下图所示:
5、阿里的RTOS系统,应该说也算是接管中断的方式(我认为)。因为这些中断服务函数入口没有被罗列在启动文件中,而是被写在一个函数指针数组中。只是用户不需要类似华为的那种注册到数组的操作,只需要修改代码中函数指针数组的成员。大概的示意图如下:
6、如果自己哪里理解错了,希望得到指正。如果上述信息涉及到侵权,可通知我删除。
本文只做自己的学习分享,谢谢。