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

μC/OS-Ⅱ内核结构_4_系统任务及中断处理

袁绪蝶 于 2017-12-19 21:17 发表在 [技术分享] [复制链接]
本帖最后由 袁绪蝶 于 2017-12-20 09:47 编辑

一、空闲任务
作用:μC/OSII总是建立一个空闲任务OSTaskIdle(),在没有其它任务进入就绪态时投入运行。
描述:它的优先级最低,即OS_LOWEST_PRIO;其什么功能也不做,只是不停的给一个32位的OSIdleCtr的计数器加1,当然用户也可以自己单独定制空闲任务做什么功能,使用这个计数器统计任务可以确定现           行应用软件实际消耗的CPU时间。
特点:系统默认开启且不可删除。
二、统计任务
作用:μC/OS-Ⅱ提供一个运行时间统计的任务OSTaskStat()。
描述:如果将系统定义常数OS_TASK_STAT_EN(见文件OS_CFG.H)设为1,这个任务就会建立。
         一旦得到了允许,OSTaskStat()每秒钟运行一次(见文件OS_CORE.C),计算当前的CPU利用率。换句话说,OSTaskStat()告诉用户应用程序使用了多少CPU时间,用百分比表示,这个值放在一个有符          号8位整数OSCPUsage中,精确度是1个百分点。
特点:优先级仅高于空闲任务。


μC/OS-Ⅱ的中断处理
1 Cortex-M3异常处理过程

当异常发生时,CortexM3通过硬件自动将编程计数器(PC)、编程状态寄存器(xPSR)、链接寄存器(LR)和R0~R3、R12等寄存器压进堆栈。
在Dbus(数据总线)保存处理器状态的同时,处理器通过Ibus(指令总线)从一个可以重新定位的向量表中识别出异常向量,并获取ISR函数的地址,也就是保护现场与取异常向量是并行处理的。
一旦压栈和取指令完成,中断服务程序或故障处理程序就开始执行。
执行完ISR,硬件进行出栈操作,中断前的程序恢复正常执行。

2 μC/OS-Ⅱ的任务级切换与异常处理
了解:
在操作系统中当任务需要从一个任务切换到另外一个任务时,要将当前任务的现场保存到当前任务的堆栈中(当前任务现场主要指CPU相关寄存器),然后回复新任务的现场并执行新任务。这个叫做上下文切换(context switch),也可以叫任务切换。
上下文切换会给系统带来一定的负担。CPU寄存器越多,负担越重。切换时间取决于有多少寄存器需要切换。

μC/OS-II是一个多任务的操作系统,在没有用户自己定义的中断情况下,任务间的切换步骤是这样的:任务间的切换一般会调用OSSched()函数。函数的结构如下:
void OSSched(void)
{
  关中断
if(不是中断嵌套并且系统可以被调度)
  {
      确定优先级最高的任务
      if(最高级的任务不是当前的任务)
      {
        OSCtxSw0();真正实现任务调度的函数
      }
  }
  开中断
}
由于期间要对堆栈进行操作,所以OSCtxSw()一般用汇编语言写成。它将正在运行的任务的CPU的SR寄存器推入堆栈,然后把R4~R15压栈。接着把当前的SP保存在TCB->OSTCBStkPtr中,然后把最高优先级的TCB->OSTCBStkPtr的值赋值给SP。这时候,SP就已经指到最高优先级任务的任务堆栈了。然后进行出栈工作,把R15~R4出栈。接着使用RETI返回,这样就把SR和PC出栈了。简单地说,μC/OS-II切换到最高优先级的任务,只是恢复最高优先级任务所有的寄存器并运行中断返回指令(RETI),实际上,所作的只是人为地模仿了一次中断。
3 μC/OS-Ⅱ的中断级切换与异常处理

4 μC/OS-Ⅱ中的中断服务


本帖子中包含更多资源

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

x
Connecting & Messaging from Any.

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

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

本版积分规则

推荐板块

精彩推荐

热门排行

明星用户

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

GMT+8, 2019-4-25 21:42