加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2010-07-23 01:12:28)
标签:

it

分类: VxWorks

 一、异常初始化:

 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条运行时(通过intConnect())构建的指令;
 5. 这5条指令中包含了intConnect()运行时所注册的中断处理函数及其地址,并跳转到该函数去执行;

 

 五、中断处理函数

 这里的东西就千变万化了,在此不再详述。。。。

http://s7/middle/4ce2cdfag8e610949eeb6&690

 

 

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有

excVecInit()中,将excTlbVec()、excNormVec()等异常处理代码分别拷贝到0x800... (来自 @头条博客)"}); -->