uCOS中断处理过程详解_第1页
uCOS中断处理过程详解_第2页
uCOS中断处理过程详解_第3页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、再看3处代码:在uCOS_II.H中有如下定义:OS_EXT OS_TCB *OSTCBPrioTblOS_LOWEST_PRIO + 1;/定义指向任务控制块的指针数组,且每个优先级在同一时刻只对应一个任务OS_EXTINT8UOSPrioCur;/用于保存目前任务的优先级器OS_EXTINT32UOSCtxSwCtr;/32位无符号全局整型变量,作为任务切换计数针OS_EXTOS_TCB*OSTCBHighRdy;/指向最高优先级任务任务控制块的指if (OSPrioHighRdy != OSPrioCur)/就绪态任务中的最高优先级已不是目前任务的优先级,则进行中断级的任务/切换OSTC

2、BHighRdy = OSTCBPrioTblOSPrioHighRdy;/将最高优先级任务控制块指针指向当前优先级最高的任务的任务控制块OSCtxSwCtr+;任务切换计数器加 1OSIntCtxSw();调用中断级任务切换函数此段代码体现出了可剥夺型实时操作系统内核的特点OSIntetxSw ()在80x86上的移植代码,此代码在OS_CPU_A.ASM 中,代码如下:_OSI ntetxSw PROC FARJCALL FAR PTR _OSTaskSwHook ; 调用 OSTaskSwHook() 函数,此函数在;OS_CPU_C.C 中只是个空函数,留给用户;在代码移植时自定义JM

3、OV AX, SEG _OSTCBCur;由于发生了段转移,恢复刚才 (当前任务)数MOV DS, AX;据段JMOV AX, WORD PTR DS:_OSTCBHighRdy+2 ;AH=_OSTCBHighRdy+3;AL=_OSTCBHighRdy+2MOV DX, WORD PTR DS:_OSTCBHighRdy ;DH=_OSTCBHighRdy+1;DL=_OSTCBHighRdyMOV WORD PTR DS:_OSTCBCur+2, AX;_OSTCBCur+3=AH;_OSTCBCur+2=ALMOV WORD PTR DS:_OSTCBCur, DX;_OSTCBCur

4、+1=DH;_OSTCBCur=DL;OSTCBCur=OSTCBHighRdyMOV AL, BYTE PTR DS:_OSPrioHighRdyMOVBYTE PTR DS:_OSPrioCur, AL;OSPrioCur= OSPrioHighRdyLESBX, DWORD PTR DS:_OSTCBHighRdy ;取址指令MOVSS, ES:BX+2;MOVSP, ES:BX;SS:SP=OSTCBHighRdy->OSTCBStkPtrPOP DS ;DS 出栈POPES ;ES出栈POPA;CPU其余寄存器出栈IRET ;中断返回_OSI ntCtxSw ENDP以上汇编代

5、码在移植时根据处理器不同要作修改四在ISR中通知任务做事的理解(以 OSSemPost()为例)在理解OSSemPost(),先要理解事件,如下是事件的数据结构:typedef struct INT8UOSEve ntType;/事件类型,这里是OS_EVENT_TYPE_SEM即信号量INT8UOSEve ntGrp; /等待任务所在的组INT16UOSEve ntC nt; /当事件是信号量时,使用此计数器void *OSEventPtr; /信号量时不使用INT8UOSEve ntTblOS_EVENT_TBL_SIZE;等待任务列表 OS_EVENT;其中OSEventGrp与OSEv

6、entTbl 构成等待事件的任务列表,前面所讲的OSRdyGrp与OSRdyTbl具有同样的功能,划分也一模一样.在ISR中调用函数 OSSemPost(),给任务发信息,此函数在OS_SEM.C中:INT8U OSSemPost (OS_EVENT *peve nt)#if OS_CRITICAL_METHOD = 3OS_CPU_SR cpu_sr;#en dif定义开关中断类型#if OS_ARG_CHK_EN > 0 如果启用了函数参数检查功能则进行参数检查if (peve nt = (OS_EVENT *)0) return (OS_ERR_PEVENT_NULL);检查是否有

7、事件发生,如果没有则报错if (peve nt->OSEve ntType != OS_EVENT_TYPE_SEM) return (OS_ERR_EVENT_TYPE);检查当前事件是不是信号量,不是则出错#en difOS_ENTER_CRITICAL(); 关中断if (peve nt->OSEve ntGrp != 0x00) /如果等待事件发生的任务列表不为空,/即有任务处于等待状态,则进入ifOS_Eve ntTaskRdy(peve nt, (void *)0, OS_STAT_SEM);使对应事件的任务从等待变为就绪OS_EXIT_CRITICAL(); 开中断O

8、S_Sched(); II进行任务调度return (O S_NO_ERR);if (peve nt->OSEve ntC nt < 65535) /如果等待事件发生的任务列表为空,且信号量数,否则器的值小于65535,则信号量计数器加1不执行if,而报信号量益出peve nt->OSEve ntCn t+;OS_EXIT_CRITICAL(); return (O S_NO_ERR);OS_EXIT_CRITICAL();return (OS_SEM_OVF);附:uCOS_II大致的启动过程:main ()OSI ni t();OSTaskCreate();此函数在OS_

9、TASK.C 中,用于创建任务,调用了三个重要的系统函数它们是 OSTasklnit();OS_TCBInit();OS_Sched();OSStart();OSTaskCreate()此函数只能在ma in ()及任务中调用,中断服务子程序不能调用OSTaskStkInit();此函数在OS_CPU_C.C 中,用于创建任务堆栈,在移植过程中可根据/具体情况做修改OS_TCBInit();此函数在OS_CORE.C 中,用于初始化任务控制块,及就绪表OS_Sched()();此函数在OS_CORE.C 中,是任务级调度函数,作用是获得最高优先级任务/并进行调度,此函数包含一个重要函数OS_T

10、ASK_SW()OSStart()If(没有任务启动)获取最高优先级任务OSStartHighRdy();此函数在OS_CPU_A.ASM 中,用于启动任务,在移植过程中随处理器/不同要作修改OS_TASK_SW()在OS_CPU.H中它是一个宏定义,用于产生任务切换的中断,移植中要作修改#defi ne uCOS0x80#defi ne OS_TASK_SW()asm INT uCOS为什么在 OSTaskCreate()中调用OS_Sched()后还要调用 OSStart()来启用任务呢?事实上在从 main()中创建的任务是不执行 OS_Sched()函数的,因为此时的任务并未启动,OS

11、Running的值为0。任务启动要通过 OSStart()才行。相反,当在一个已启动的任务中调用 OSTaskCreate()就通过 OS_Sched()函数(OSRunning=1),而不用OSStart(),OSStart()只在操作系统启动时调用,任务中不调用一.任务调度中的几个函数的区别:uCOSII启动时的任务调度OSStartHighRdy():该函数在 OS_CPU_A.ASM 中原形如下:_OSStartHighRdy PROC FARMOVAX, SEG _OSTCBHighRdy;MOVDS, AX ;获得要运行任务的任务控制块所在段的段址CALLFAR PTR _OSTa

12、skSwHook ;调用用户自定义的任务切换接口函数MOVAL, 1 ;0MOVBYTE PTR DS:_OSRu nning, AL ;置任务运行标志LESBX, DWORD PTR DS:_OSTCBHighRdy ;MOVSS, ES:BX+2;MOVSP, ES:BX+0;从任务控制块首指的四个8位内存单元获得该任务的任务堆栈的地址POPDS ;DS出栈至任务堆栈POPES ;ES出栈至任务堆栈POPA;将其余CPU寄存器出栈IRET ;恢复代码段及指令寄存器内容,运行任务_OSStartHighRdy ENDP该函数由OSStart()调用void OSStart (void)/ 在

13、 OS_CORE.C 中INT8U y;INT8U x;if (OSR unning = FALSE) y= OSUnM apTblOSRdyGrp;x= OSUnM apTblOSRdyTbly;OSPrioHighRdy = (INT8U)(y << 3) + x);OSPrioCur = OSPrioHighRdy;OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy;OSTCBCur = OSTCBHighRdy;OSStartHighRdy();/如果多任务环境还没有启动,则先获得就绪表中任务的最高优先级,再获得该优先级下任务的任务控制块的地址

14、(通过OSTCBHighRdy =OSTCBPrioTblOSPrioHighRdy ,OSTCBPrioTbl是一个指针数组,用于存放各优先级任务的任务控制块的地址,它在OS_TCBI nit ()中被赋值),然后调用OSStartHighRdy()启动任务。 任务级的任务切换OSCtxSwO:函数在 OS_CPU_A.ASM 中的原形如下:_OSCtxSw PROC FARPUSHA ;将所有CPU寄存器压栈PUSHES ;经附加段寄存器压栈PUSHDS ;将数据段寄存器压栈MOVAX, SEG _OSTCBCur ;获取当前任务所在段的段址,放入DSMOVDS, AX ;LESBX, D

15、WORD PTR DS:_OSTCBCur;获取当前任务任务控制块的段地址及偏移地址MOVES:BX+2, SS ;将当前任务堆栈的断址保存在当前任务的任务控制块中MOVES:BX+0, SP ;将当前任务堆栈的偏移地址保存在当前的任务控制块中CALLFAR PTR _OSTaskSwHook ;MOVAX, WORD PTR DS:_OSTCBHighRdy+2 ; OSTCBCur =OSTCBHighRdyMOVDX, WORD PTR DS:_OSTCBHighRdyMOVWORD PTR DS:_OSTCBCur+2, AXMOVWORD PTR DS:_OSTCBCur, DXMO

16、V AL, BYTE PTR DS:_OSPrioHighRdy ; OSPrioCur =OSPrioHighRdyMOV BYTE PTR DS:_OSPrioCur, ALJLES BX, DWORD PTR DS:_OSTCBHighRdy;将最高优先级任务的堆栈MOV SS, ES:BX+2;指针放回CPU的堆栈段寄存MOV SP, ES:BX;器及堆栈指针寄存器中;SS:SP= OSTCBHighRdy->OSTCBStkPtr此时的任务堆栈已改变,变为最高优先级任务(已是当前任务)的任务堆栈POPDS ;POPES ;POPA ;IRET ;_OSCtxSw ENDP该函数

17、并非由 OS_Sched()直接调用而是通过软中断指令INT 0x80(CPU为80x86),产生中断,到中断向量表中找的 OSCtxSw()的入口地址,然后跳转到该函数并执行的。OS_Sched()函数原形如下:void OS_Sched (void)#if OS_CRITICAL_METHOD = 3OS_CPU_SR cpu_sr;#en difINT8U y;OS_ENTER_CRITICAL();if (OSI ntNesti ng = 0) && (OSLockNesti ng = 0)/已是中断前套最外层且无任务锁定则执行以下代码y = OSUnM apTblOS

18、RdyGrp;OSPrioHighRdy = (INT8U)(y << 3) + OSUnM apTblOSRdyTbly);/从就绪表中获得任务的最高优先级if (OSPrioHighRdy != OSPrioCur)/如果当前任务的优先级已不是最高,则将行任务切换OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy;将OSTCBHighRdy 指向具有最高优先级任务的任务控制块OSCtxSwCtr+; / 任务切换计数器加一OS_TASK_SW(); II此函数是一个宏,见OS_CPU.H 中的定义:#defi ne uCOS 0x80#defi n

19、e OS_TASK_SW() asm INT uCOS/执行中断,调用OSCtxSw()OS_EXIT_CRITICAL(); 中断级的任务切换 OSIntCtwSw()已经在中断处理过程中解释过,它是通过 OSIntExit()来调用的二.关于操作系统源文件系统结构的认识uCOSII源文件已将各文件作了很好的归类,以方便用户在其他处理器上以移植它的代码,其中OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C是与用户具体使用的处理器相关的,在移植时要根据处理器对其中的代码作相应修改,这就是所谓的HAL (硬件抽象层)。另外OS_CFG.H,INCLUDES.H与用户具体的应用程序相关,包括决定任务的最低优先级,用户应用程序所能拥有的最大任务数等。对于其余文件,用户在移植时一般不用考虑修改。三关于中断1中断嵌套:中断嵌套只能

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论