`
nathan09
  • 浏览: 144620 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

2008-11-4

ucOS-II的中断处理

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

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

用户中断服务子程序:

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

调用OSIntEnterOSIntNesting直接加1 (2)

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

调用OSIntExit() (4)

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

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

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

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

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

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

/*

此时已处于中断模式(在ARM处理器中,当中断发生时,CPU自动保存CPSRSPSR_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已设为“真”,指出多任务已经开始,OSPrioCurOSPrioHighRdy存放的是用户应用任务的优先级,OSTCBCurOSTCBHighRdy二者都指向用户任务的任务控制块。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics