新浪博客

VxWorks的异常处理过程(以MIPS为例)

2010-07-23 01:12阅读:
一、异常初始化:
usrInit() --> excVecInit()中,将excTlbVec()、excNormVec()等异常处理代码分别拷贝到0x80000000、0x80000080地址;

二、设置IRR寄存器:
初始化IRR寄存器,将所有外部硬件的中断源映射到CAUSE_IP[7~2]这六位;这样,当外设中断到来时,cpu就会自动的去置相应的IP位,开始中断过程。

三、注册相应的中断处理函数
通过intConnect()函数注册外设的中断处理函数到相应的中断向量(该中断向量应该和IRR中设置的一致);intConnect为用户提供的回调函数与指针分配一小块内存(通过intHandlerCreate),这块内存中存放的是5条指令,用于保存中处理函数与参数的地址,以及一条跳转到该中断处理函数地址的指令;然后调用intVecSet将这段内存的地址设置到(excBsrTbl+vec*4)中去。(此处详情查看《VxWorks对中断的处理
》一文)。

四、中断响应与分发
中断到来时,在入口点excNormVec(0x80000080)中会根据CAUSE_ExcCode位判断是否为中断类型的异常(ExcCode位0),如果是则跳转到excIntStub(),在该函数除了保存以及恢复中断现场之外,主要做了以下工作:
1. 通过CAUSE和SR判断产生中断的中断源;
2. 将CAUSE[IP0~7]的值作为sysHashOrder表(ffsMsbTbl[256])的下标,可以得到优先执行的中断源号码;
3. 将以上中断源号码作为intPrioTable[]表的下标,可以得到该中断源对应的异常向量偏移vec(相对于excBsrTbl);
4. 跳转到以上偏移地址处(excBsrTbl+vec*4)所保持的值的地址,可以得到5条运行时(通过in
tConnect())构建的指令;
5. 这5条指令中包含了intConnect()运行时所注册的中断处理函数及其地址,并跳转到该函数去执行;

五、中断处理函数
这里的东西就千变万化了,在此不再详述。。。。
VxWorks的异常处理过程(以MIPS为例)



我的更多文章

下载客户端阅读体验更佳

APP专享