- 2
- 0
- 约2.32万字
- 约 19页
- 2016-11-07 发布于江苏
- 举报
嵌入式实时操作系统
作业
学院:
班级:
姓名:
学号:
嵌入式实时操作系统作业
题目:几种公开源代码的中断处理机制分析;公开源代码包括linux内核(2.4.216)、uC/OS-II和eCOS,通过阅读相关代码,掌握嵌入式操作系统的中断处理机制,分析它们的优点,指出不同应用领域所适合的ERTOS。
一、对UC/OS-II中断系统的分析
?UC/OS-II的中断过程简介?
系统接收到中断请求后,如果CPU处于开中断状态,系统就会中止正在运行的当前任务,而按中断向量的指向去运行中断服务子程序
当中断服务子程序运行完成后,系统会根据具体情况返回到被中止的任务继续运行,或转向另一个中断优先级别更高的就绪任务。?
由于UCOS-II是可剥夺型的内核,所以中断服务程序结束后,系统会根据实际情况进行一次任务调度,如果有优先级更高的任务,就去执行优先级更高的任务,而不一定要返回被中断了的任务。?具体中断过程?
中断到来,如果被CPU识别,CPU将查中断向量表,根据中断向量表,获得中服务子程序的入口地址。?
将CPU寄存器的内容压入当前任务的任务堆栈中(依处理器的而定,也可能压入被压入被中断了的任务堆栈中。?
通知操作系统将进入中断服务子程序。即:调用OSIntEnter()或OSIntNesting直接?
加1。?
If(OSIntNesting==1) {OSTCBCur-OSTCBStrPtr=SP;}?
如果是第一层中断,则将堆栈指针保存到被中断任务的任务控制块中?
清中断源,否则在开中断后,这类中断将反复的打入,导致系统
执行用户ISR?
中断服务完成后,调用OSIntExit().如果没有高优先级的任务被中断服务子程序激活而进入就绪态,那么就执行被中断了的任务,且只占用很短的时间?
恢复所有CPU寄存器的值
执行中断返回指令
⑷关于中断?
中断嵌套:中断嵌套只能发生在中断服务子程序中,在中断服务子程序运行过程中,?当有更高优先级的中断发生且此时中断是打开的,则将发生中断嵌套?
中断服务程序通知任务做事是通过事件使任务处于就绪状态,而并非立即进行任务切换,因为它们都是调用OS_Sched(),而函数只能在所有中断服务程序结束运行后才进行切换任务(因为if((OSIntNesting == 0) (OSLockNesting ==0)){…OS_TASK_SW();…}),所以任何任务切换都不能发生在ISR中,而必须等到所有ISR?结束运行后(因为if ((OSIntNesting == 0) (OSLockNesting == 0)){?…}),在OSIntExit()中进行.所以任何时刻uCOSII只能有一个任务处于运行态?
⑸相关代码?
void? OSIntEnter (void)
OS_CORE.C中的OSIntEnter()函数原型:?
void? OSIntEnter (void)?
{?
?? ??????????????????if (OSRunning == TRUE) //如果内核正在运行则进入if?
{?
??????? ?????????????????if (OSIntNesting 255)?//如果嵌套层数小于255,则可以继续?
{?
?????????? ???????????????????OSIntNesting++; //嵌套层数加1?
?????? ??????????????}?
?? ???????????????????}?
}?
?? ???
在中断服务子程序中加if ( OSIntNesting == 1)????????
中断服务程序中添加的代码:?
if ( OSIntNesting == 1)?必须加“OSIntNesting == 1”的原因?避免调整堆栈指针
{
????????OSTCBCur-OSTCBStkPtr = SP; //如果是第一层中断,则将被中断任务的堆栈指针保存在被中断任务的任务控制块中??
void OSIntExit (void)分析
uCOS_II.H中定义:?
OS_EXT? INT8U?? OSLockNesting; //8位无符号全局整数,表示锁定嵌套计数器?
void? OSIntExit (void)?
{?
#if OS_CRITICAL_METHOD == 3??
?? ???????OS_CPU_SR? cpu_sr;?
#endif?? //采用开关中断方式三?
??? ????????if (OSRunning == TRUE) //如果内核正在运行,则进入if?
{?
? ?????????????????OS_
原创力文档

文档评论(0)