uC/OS-II内核架构解析---uC/OS-II系统核心

本文深入剖析了uC/OS-II的任务调度机制,包括基于优先级的调度算法、任务就绪表、任务级与中断级调度、调度器锁定与解锁,以及中断管理。同时,介绍了系统启动过程中的OSInit()和OSStart()函数,以及事件管理和系统时钟的相关概念。通过对这些关键功能的解析,展示了uC/OS-II实时操作系统的核心运作原理。
摘要由CSDN通过智能技术生成

1. uC/OS-II任务调度

(1) uC/OS-II调度算法

      uC/OS-II采用基于优先级的调度算法,总是选择当前处于就绪状态的优先级最高的任务进行调度。uC/OS-II是可抢占性的强实时性OS,在完成中断后允许进行新的任务调度。

      uC/OS-II有两种调度方式:任务级任务调度、中断级任务调度。

(2) 任务就绪表

      INT8U const OSUnMapTbl[256] = {…};

      OS_EXT INT8U OSRdyGrp;

      OS_EXT INT8U OSRdyTbl[OS_RDY_TBL_SIZE];

  • 添加就绪任务至就绪表;
  • 从就绪表删除就绪任务;
  • 查找最高优先级就绪任务OS_SchedNew();

(3) 任务级任务调度

      指在非中断返回时进行任务调度,一般发生在当前任务因时间延迟或等待某事件而阻塞或被挂起,或有更高优先级的任务处于就绪状态。

      任务的基本信息:

  • CPU的PC寄存器:任务当前执行的位置;
  • CPU的通用寄存器:任务当前执行涉及的临时数据;
  • CPU的状态寄存器:存储当前CPU的状态。

      任务级任务切换:从一个任务直接切换至另一个任务,不涉及CPU状态的切换,OS_TASK_SW()既保存当前任务上下文,又恢复新任务上下文。

      过程:OS_Sched() -> OS_SchedNew() -> OS_TASK_SW()

 

 

(4) 中断级任务调度 

 

 

     

      中断级任务切换:在中断处理完成后,通过OSIntExit()判断是否有更高优先级就绪任务。如果有,调用OSIntCtxSW()恢复新任务上下文。注意:在中断处理中,已经保存了被中断任务的上下文,所以这里仅仅恢复。

      过程:OSIntExt() –> OSIntEnter() -> ISR –> OSIntExit() -> OSIntCtxSW()

(5) 调度器上锁与解锁

      uC/OS-II提供调度器锁定功能,在锁定期间不能进行任务调度。uC/OS-II使用全局变量OSLockNesting标识是否锁定了任务调度器。

  • OS_EXT INT8U OSLockNesting;
  • void OSSchedLock(void);
  • void OSSchedUnlock(void);

(6) 中断管理函数

      在中断处理中,不允许进行任务管理、事件管理及任务调度等操作。uC/OS-II通过全局变量OSIntNesting标识当前是否处于中断状态。在所有任务及事件管理的程序中,都有对OSIntNesting进行判断的语句。

  • void OSIntEnter(void);
  • void OSIntExit(void);

 

(7) 中断相关问题

  • OS_ENTER_CRITICAL()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值