四、μC/OS-Ⅱ的中断和时钟

四、μC/OS-Ⅱ的中断和时钟 

1.μC/OS-II系统响应中断的过程

μC/OS-II系统响应中断的过程为:系统接收到中断请求后,这时如果CPU处于中断允许状态(即中断是开放的),系统就会中止正在运行的当前任务,而按照中断向量的指向转而去运行中断服务子程序;当中断服务子程序的运行结束后,系统将会根据情况返回到被中止的任务继续运行或者转向运行另一个具有更高优先级别的就绪任务。

注意!中断服务子程序运行结束之后,系统将会根据情况进行一次任务调度去运行优先级别最高的就绪任务,而并不是一定要接续运行被中断的任务的 

 2.中断级任务切换函数

 在中断服务程序中调用的负责任务切换工作的函数OSIntCtxSw( )叫做中断级任务切换函数

OSIntCtxSw( )
{
    OSTCBCur = OSTCBHighRdy;	  //任务控制块的切换	
    OSPrioCur=OSPrioHighRdy;
    SP = OSTCBHighRdy->OSTCBStkPtr;	//SP指向待运行任务堆栈
    用出栈指令把R1,R2,……弹入CPU的通用寄存器;
    RETI;			//中断返回,使PC指向待运行任务
}

3.μC/OS-II系统时钟

μC/OS-II与大多数计算机系统一样,用硬件定时器产生一个周期为ms级的周期性中断来实现系统时钟,最小时钟单位就是两次中断之间相间隔的时间,这个最小时钟单位叫做时钟节拍Time Tick)。

硬件定时器以时钟节拍为周期定时地产生中断,该中断的中断服务程序叫做OSTickISR( )。中断服务程序通过调用函数OSTimeTick( )来完成系统在每个时钟节拍时需要做的工作

函数 OSTickISR()函数的示意性代码:    

void OSTickISR(void)
{
	保存CPU寄存器;
	调用OSIntEnter( );			//记录中断嵌套层数
	if (OSIntNesting = = 1;				
	{
		OSTCBCur->OSTCBStkPtr = SP; //保存堆栈指针
	}
	调用OSTimeTick( );			//节拍处理
	清除中断;
	开中断;
	调用OSIntExit( );			//中断嵌套层数减一 
	恢复CPU寄存器;
	中断返回;
}

猜你喜欢

转载自blog.csdn.net/weixin_51659166/article/details/131113679