Chinaunix首页 | 论坛 | 博客
  • 博客访问: 233350
  • 博文数量: 84
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 451
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-05 13:45
个人简介

IT!

文章分类
文章存档

2013年(84)

我的朋友

分类: 其他UNIX

2013-08-31 11:30:38

在讲解uC/OS-II中断处理机制之前,大家要了解uC/OS-II中对于中断函数的处理机制。我们在查阅《嵌入式实时操作系统μCOS-II(第二版)》书中P103页时,可以查看到在uC/OS-II中的中断处理机制如下描述:


Void ISP_Function( void )
{
         保存全部的CPU寄存器;
         调用OSIntEnter()或OSIntNesting++;

If(OSIntNesting == 1 )

{

OSTCBCur->OSTCBStkPtr= SP ;

}
         清中断源;
         重新打开中断;
         执行用户代码做中断服务;
         调用OSIntExit();
         恢复所有CPU寄存器;
         执行中断返回指令;
}

 


在uC/OS-II中,对于中断中的任务切换,是用两个函数实现的

1、OSIntEnter()
2、OSIntExit()

 
在OSIntEnter()中将用于记录中断嵌套的计数器OSIntNesting自增1;
其函数源代码如下:
void OSIntEnter (void)
{
if (OSRunning == OS_TRUE)
{

if (OSIntNesting < 255u)

{

OSIntNesting++;

}

}
}


这里我想提醒大家的是:uC/OS-II的程序设计思想是非常严谨的,OSIntEnter首先判断中断发生是否在uC/OS-II整个系统启动后,如果不是这样的话,那么所有的uC/OS-II的系统功能均不能提供给用户使用。 


void OSIntExit(void)函数时用于在用户编写的中断服务代码执行完毕以后,调用该函数,从而实现uC/OS-II始终保证“处于就绪状态下优先级最高的任务始终能得到系统的所有资源。

 

 
void OSIntExit(void)函数源代码如下:


void
OSIntExit (void)
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
if (OSRunning == OS_TRUE)

{

OS_ENTER_CRITICAL();

if (OSIntNesting > 0)

{

OSIntNesting--;

}

if (OSIntNesting == 0)

{

if (OSLockNesting == 0)

{

OS_SchedNew();

if (OSPrioHighRdy != OSPrioCur)

{

OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];

#if OS_TASK_PROFILE_EN > 0

OSTCBHighRdy->OSTCBCtxSwCtr++;

#endif

OSCtxSwCtr++;

OSIntCtxSw();

}

}

}

 

OS_EXIT_CRITICAL();

 

}


}


这部分代码的意思,大家自己想一下了,这里我主要讲解一下在OS_CPU_A.a文件中的OSIntCtxSw()函数了。



大家记住一点:在OSIntExit()函数调用时,我们已经将当前任务的所用到的PC ,LR,R0-R12,CPSR压入到被中断了的任务堆栈中了,所以在这里就不再需要重复压栈的操作了。


详细代码如下:


OSIntCtxSw

 

LDR R0, =OSTaskSwHook

 

MOV LR, PC

 

BX R0

 

 

LDR R0, =OSPrioCur

LDR R1, =OSPrioHighRdy

 

LDRB R2, [R1]

 

STRB R2, [R0]

 

 

LDR R0, =OSTCBCur

 

LDR R1, =OSTCBHighRdy

 

LDR R2, [R1]

 

STR R2, [R0]

 

 

LDR SP, [R2]

 

 

LDMFD SP!, {R0}

 

MSR SPSR_cxsf, R0

 

 

LDMFD SP!, {R0-R12, LR, PC}^


这部分代码和任务级的任务函数时一样的,这里就不在做讲解了。

OSIntEnter()和OSIntExit()必须在中断处理函数中成对使用,如果不是这样的话,可能会导致你的系统崩溃。

转自Tony嵌入式论坛,地址:
阅读(1280) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~