当前位置: 首页 > news >正文

μC/OS-II---内核:任务调度

目录

  • 内核:调度(oc_core.c文件的函数)
    • OS_TCB(任务控制块)初始化
    • 任务控制块列表(ucos_ii.h文件的函数)
    • 系统调用,主动让渡CPU
    • 发生中断,强制当前任务让渡CPU
    • 就绪表(ucos_ii.h文件的函数)
      • 设置任务进入就绪态
      • 设置任务脱离就绪态
      • 在就绪表中找到优先级最高(数最小)的任务

在这里插入图片描述

内核:调度(oc_core.c文件的函数)

OS_TCB(任务控制块)初始化

INT8U   OS_TCBInit    (INT8U            prio,OS_STK          *ptos,OS_STK          *pbos,INT16U           id,INT32U           stk_size,void            *pext,INT16U           opt);

任务控制块列表(ucos_ii.h文件的函数)

OS_EXT  OS_TCB            OSTCBTbl[OS_MAX_TASKS + OS_N_SYS_TASKS];

系统调用,主动让渡CPU

void  OS_Sched (void)
{#if OS_CRITICAL_METHOD == 3u                           /* Allocate storage for CPU status register     */OS_CPU_SR  cpu_sr = 0u;#endifOS_ENTER_CRITICAL();if (OSIntNesting == 0u)                            /* Schedule only if all ISRs done and ...       */{if (OSLockNesting == 0u)                       /* ... scheduler is not locked                  */{OS_SchedNew();OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];if (OSPrioHighRdy != OSPrioCur)            /* No Ctx Sw if current task is highest rdy     */{#if OS_TASK_PROFILE_EN > 0uOSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task      */#endifOSCtxSwCtr++;                          /* Increment context switch counter             */OS_TASK_SW();                          /* Perform a context switch                     */}}}OS_EXIT_CRITICAL();
}

发生中断,强制当前任务让渡CPU

void  OSIntExit (void)
{#if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */OS_CPU_SR  cpu_sr = 0u;#endifif (OSRunning == OS_TRUE){OS_ENTER_CRITICAL();if (OSIntNesting > 0u)                             /* Prevent OSIntNesting from wrapping       */{OSIntNesting--;}if (OSIntNesting == 0u)                            /* Reschedule only if all ISRs complete ... */{if (OSLockNesting == 0u)                       /* ... and not locked.                      */{OS_SchedNew();OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];if (OSPrioHighRdy != OSPrioCur)            /* No Ctx Sw if current task is highest rdy */{#if OS_TASK_PROFILE_EN > 0uOSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task  */#endifOSCtxSwCtr++;                          /* Keep track of the number of ctx switches */OSIntCtxSw();                          /* Perform interrupt level ctx switch       */}}}OS_EXIT_CRITICAL();}
}

就绪表(ucos_ii.h文件的函数)

OS_EXT  OS_PRIO           OSRdyTbl[OS_RDY_TBL_SIZE];       /* Table of tasks which are ready to run    */

设置任务进入就绪态

设置任务脱离就绪态

在就绪表中找到优先级最高(数最小)的任务

http://www.lryc.cn/news/224080.html

相关文章:

  • 小程序发成绩
  • tensorflow内存泄漏或模型只加载不运行
  • npm和yarn的一些命令
  • Linux开发工具之自动化构建工具-make/Makefile
  • UE5蓝图接口使用方法
  • vue动态修改css样式
  • 小解List的使用【C++】
  • 自动驾驶高效预训练--降低落地成本的新思路(AD-PT)
  • Spring笔记(四)(黑马)(web层解决方案-SpringMVC)
  • 企业如何实现高效运转?工单管理系统有什么特点和优势?
  • 工业摄像机参数计算
  • Android系统中设置TextView的行间距
  • 嵌入式养成计划-47----QT--基于QT的OpenCV库实现人脸识别功能
  • MySQL(12):MySQL数据类型
  • 哪款手机便签软件支持存储录音文件并支持转文字?
  • Health Kit申请验证有问题?解决方案全解析
  • 2007-2022年上市公司工业机器人渗透度数据
  • k8s基础环境部署
  • 家用工作站方案:ThinkBook 14 2023 版
  • 电脑篇——本地串口转TCP,TCP转虚拟串口,网络调试助手,串口调试助手
  • igbt好坏判断方法有哪些?万用表怎么测试igbt的好坏?
  • Android UI 开发·界面布局开发·案例分析
  • 2023-11-06 monetdb-事务-insert-delta缓存-分析
  • ubuntu 22.04 flameshot 截图异常的问题
  • 正点原子嵌入式linux驱动开发——Linux WIFI驱动
  • React中的“状态”(state)和“属性”(props)的区别
  • 棋牌室电脑计时灯控,棋牌室计时灯控安装,佳易王计时计费管理系统软件
  • P02项目诊断报警组件(学习操作日志记录、单元测试开发)
  • 【ARM Trace32(劳特巴赫) 使用介绍 2 - Veloce 环境中使用trace32 连接 Cortex-M33】
  • 服务器硬件有哪些组成