现在的位置: 首页 > 综合 > 正文

【读书笔记】usOS-II学习笔记(2008-11-4)

2013年09月04日 ⁄ 综合 ⁄ 共 2093字 ⁄ 字号 评论关闭
文章目录

http://blog.csdn.net/yhmhappy2006/article/details/3220784

ucOS-II的中断处理

初始化中断向量,编写中断引导程序

程序清单 L3.15 μC/OS-II中的中断服务子程序.

用户中断服务子程序:                                                           

    保存全部CPU寄存器;                                     (1)                     

调用OSIntEnter或OSIntNesting直接加1;               (2)

    执行用户代码做中断服务;                                (3)                  

    调用OSIntExit();                                     (4)                    

    恢复所有CPU寄存器;                                    (5)                      

    执行中断返回指令;                                      (6)        

用户代码应该将全部CPU寄存器推入当前任务栈[L3.15(1)]。注意,有些微处理器,例如Motorola68020(及68020以上的微处理器),做中断服务时使用另外的堆栈(ARM也是)。

μC/OS-Ⅱ可以用在这类微处理器中,当任务切换时,寄存器是保存在被中断了的那个任务的栈中的。

程序清单: 基于ARM920T的中断处理过程

UCOS_IRQHandler//中断入口地址,在中断向量表初始化时被设置

 /*

此时已处于中断模式(在ARM处理器中,当中断发生时,CPU自动保存CPSR到SPSR_irq,并切换到中断模式),因此sp为中断模式下的栈指针(如上所说,ARM具有中断模式栈)

*/

;保存现场,先将任务的现场保存到中断栈中

        stmfd sp!,{r0-r3,r12,lr}

;调用相关函数

        bl OSIntEnter

        bl C_IRQHandler

;调用OSIntExit函数,该函数判断是否有更高优先级的任务进入就绪

        bl OSIntExit

;if(OSIntCtxSwFlag == 1) _IntCtxSw()

        ldr r0,=OSIntCtxSwFlag

        ldr r1,[r0]

        cmp r1,#1

;有更高优先级的任务进入了就绪状态,则进行中断级的任务切换,返回执行新的任务

        beq _IntCtxSw

/*不进行任务切换,返回被中断的任务*/

;恢复现场

        ldmfd sp!,{r0-r3,r12,lr}

;下面的指令令pc = lr-4实现中断返回,同时将spsr_irq的值复制到CPSR,实现模式切换(即返回到用户模式

        subs pc,lr,#4                                                    

μC/OS-Ⅱ初始化

    在调用μC/OS-Ⅱ的任何其它服务之前,μC/OS-Ⅱ要求用户首先调用系统初始化函数OSIint()。OSIint()初始化μC/OS-Ⅱ所有的变量和数据结构(见OS_CORE.C)。

    OSInit()建立空闲任务idle task,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优先级总是设成最低,即OS_LOWEST_PRIO。如果统计任务允许OS_TASK_STAT_EN和任务建立扩展允许都设为1,则OSInit()还得建立统计任务OSTaskStat()并且让其进入就绪态。OSTaskStat的优先级总是设为OS_LOWEST_PRIO-1。

 

图3.7 调用OSInit()之后的数据结构

    μC/OS-Ⅱ还初始化了5个空数据结构缓冲区,如图F3.8所示。每个缓冲区都是单向链表,允许μC/OS-Ⅱ从缓冲区中迅速得到或释放一个缓冲区中的元素。

 

图3.8 空缓冲区(图中还有OSFlagFreeList链表未画出)

μC/OS-Ⅱ的启动

       多任务的启动是用户通过调用OSStart()实现的。然而,启动μC/OS-Ⅱ之前,用户至少要建立一个应用任务。多任务启动以后变量与数据结构中的内容如图F3.9所示。

 

图3.9调用OSStart()以后的变量与数据结构

       这里笔者假设用户建立的任务优先级为6,注意,OSTaskCtr指出已经建立了3个任务。OSRunning已设为“真”,指出多任务已经开始,OSPrioCur和OSPrioHighRdy存放的是用户应用任务的优先级,OSTCBCur和OSTCBHighRdy二者都指向用户任务的任务控制块。

抱歉!评论已关闭.