请选择 进入手机版 | 继续访问电脑版
快捷导航
0 54

uCos系统——任务调度、中断处理和时钟节拍

陈燕 于 2017-12-18 19:22 发表在 [技术分享] [复制链接]
本帖最后由 陈燕 于 2017-12-19 21:48 编辑

如果你看到我的帖子没写完,不要惊讶<_<只是因为不想保存在草稿箱中,因为之前的帖子保存为草稿,后来被覆盖没了,我很是忧伤,所以就先发了,这样一定不会丢!

一、任务调度
在实时系统中,只有当就绪进程集合发生变动时才有调度的需要
任务级的调度是由函数OS_Sched()完成的;中断级的调度是由OSIntExit()完成的。

任务级的任务切换OS_TASK_SW()
当优先级高的任务发生时会抢占CPU资源,当前任务会进行上下文切换(入栈)

给调度器上锁函数OSSchedlock(),用于禁止任务调度,直到任务完成后调用给调度器开锁函数OSSchedUnlock()为止。(成对出现)
变量OSLockNesting跟踪OSSchedLock()函数被调用的 次数;当OSLockNesting减到零的时候,OSSchedUnlock()调用OSSched()。

当所有的任务都在等待时间发生或者等待延迟时间的结束时, uC/OS-Ⅱ执行被称为空闲任务(idle task)的内部任务,即OSTaskIdle()。
μC/OS-Ⅱ提供一个运行时间统计的任务OSTaskStat()。

二、中断处理
进入异常
当处理器调用异常时,它自动将下面的 8 个寄存器按以下顺序压栈(PSP进程堆栈)
PC
xPSR
r0~r3
r12
LR
退出异常
它自动将下面的 8 个寄存器按以下顺序出栈(PSP进程堆栈)
LR
r12
r0~r3
xPSR
PC


三、时钟节拍
OS_CPU_SysTickInit() //设置节拍率
OS_CPU_SysTickHandler() //它调用OSTimeTick()实现时钟节拍服务
注:必须在多任务系统OSSTART启动以后再开启时钟节拍器。

  1. void  OS_CPU_SysTickHandler (void)
  2. {
  3.     OS_CPU_SR  cpu_sr;


  4.     OS_ENTER_CRITICAL();                         /* Tell uC/OS-II that we are starting an ISR          */
  5.     OSIntNesting++;
  6.     OS_EXIT_CRITICAL();

  7.     OSTimeTick();                                /* Call uC/OS-II's OSTimeTick()                       */

  8.     OSIntExit();                                 /* Tell uC/OS-II that we are leaving the ISR          */
  9. }
复制代码

四、uC/OS-Ⅱ的初始化
OSInit() //系统初始化函数
注:它会建立空闲任务idle task,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优先级即OS_LOWEST_PRIO(最低)
OSInit()还得建立统计任务OSTaskStat()并且让其进入就绪态。OSTaskStat的优先级总是设为OS_LOWEST_PRIO-1 。
空闲和统计任务的OS_TCBs是用双向链表链接在一起的。OSTCBList指向这个链表的起始处。
空任务控制块在空缓冲区中的数目取决于最多任务数OS_MAX_TASKS

OSStart() //多任务的启动
调用高优先级就绪任务启动函数

OSStartHighRdy() //将任务栈中保存的值弹回到CPU 寄存器中,然后执行一条中断返回指令,中断返回指令强制执行该任务代码。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Connecting & Messaging from Any.

共 0 个关于本帖的回复 最后回复于 2017-12-18 19:22

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐板块

精彩推荐

热门排行

明星用户

手机版|小黑屋|AnyMSG ( ©AnyMSG 2009 - 2017 · ICP备16009991号 )

GMT+8, 2019-2-16 19:59