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

目录

  • 内核:多任务(ucos_ii.h文件的函数)
    • Task创建
    • Task创建(扩展)
    • Task删除/请求删除Task
    • 改变Task优先级
    • Task挂起和恢复
    • Task信息获取
    • Task调度器上锁和开锁
  • 内核:调度(oc_core.c文件的函数)
    • OS_TCB(任务控制块)初始化
    • 任务控制块列表(ucos_ii.h文件的函数)
    • 系统调用,主动让渡CPU
    • 发生中断,强制当前任务让渡CPU
    • 就绪表(ucos_ii.h文件的函数)
      • 设置任务进入就绪态
      • 设置任务脱离就绪态
      • 在就绪表中找到优先级最高(数最小)的任务

在这里插入图片描述

内核:多任务(ucos_ii.h文件的函数)

Task创建

#if OS_TASK_CREATE_EN > 0u
INT8U    OSTaskCreate    (
								void           (*task) (void *p_arg),
								void            *p_arg,
								OS_STK          *ptos,
								INT8U            prio
							   );
#endif

Task创建(扩展)

#if OS_TASK_CREATE_EXT_EN > 0u
INT8U    OSTaskCreateExt  (
									   void           (*task) (void *p_arg),
									   void            *p_arg, 
									   OS_STK          *ptos, 
									   INT8U            prio, 
									   INT16U           id, 
									   OS_STK          *pbos, 
									   INT32U           stk_size, 
									   void            *pext,
									   INT16U           opt
						   );
#endif

Task删除/请求删除Task

#if OS_TASK_DEL_EN > 0u
INT8U         OSTaskDel               (INT8U            prio);
INT8U         OSTaskDelReq            (INT8U            prio);
#endif

改变Task优先级

#if OS_TASK_CHANGE_PRIO_EN > 0u
INT8U         OSTaskChangePrio        (INT8U     oldprio,	 INT8U      newprio);
#endif

Task挂起和恢复

#if OS_TASK_SUSPEND_EN > 0u
INT8U         OSTaskResume            (INT8U            prio);
INT8U         OSTaskSuspend           (INT8U            prio);
#endif

Task信息获取

#if OS_TASK_QUERY_EN > 0u
INT8U         OSTaskQuery             (
									INT8U            prio,
									 OS_TCB          *p_task_data);
#endif

Task调度器上锁和开锁

#if OS_SCHED_LOCK_EN > 0u
void          OSSchedLock             (void);
void          OSSchedUnlock           (void);
#endif

内核:调度(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;
	#endif
		OS_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 > 0u
					OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task      */
	#endif
					OSCtxSwCtr++;                          /* 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;
	#endif
		
		if (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 > 0u
						OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task  */
	#endif
						OSCtxSwCtr++;                          /* 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    */

设置任务进入就绪态

设置任务脱离就绪态

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/121767.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

后端面试问题(学习版)

JAVA相关 JAVA语言概述 1. 一个".java"源文件中是否可以包含多个类?有什么限制? 可以。 一个源文件可以声明多个类,但是最多只能有一个类使用public进行声明 且要求声明public的类的类名与源文件相同。 2. Java的优势&#xff…

链表经典面试题之一讲

什么是链表? 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 今天给大家分享一道经典的单链表面试题 力扣题目——反转链表https://leetcode.cn/problems/reverse-linked-list/ 只给了头…

第三阶段第一章——PySpark实战

学习了这么多python的知识,是时候来搞点真玩意儿了~~ 春风得意马蹄疾,一日看尽长安花 o(* ̄︶ ̄*)o 1.前言介绍 (1)什么是spark Apache Spark是一个开源的分布式计算框架,用于处理大规模数据集的…

从哪些方面做好电商系统的网站建设?

电子商务的迅猛发展,建设一款成功的电商系统网站成为企业取得竞争优势的重要一环。下面将从用户体验、网站设计、安全性和性能优化等方面,介绍如何打造一款优秀的电商系统网站。 一、用户体验 一款成功的电商系统网站必须注重用户体验,确保用…

康耐视深度学习ViDi-ViDi四大工具之一蓝色定位工具/Locate

目录 工具介绍使用步骤说明调整工具ROI添加特征标签生成定位姿态训练并审核模型编辑器参数说明蓝色定位工具/Locate工具 工具介绍 蓝色定位工具用于识别和定位图像中的特定特征或特征组。该工具的输出可用于为其他ViDi 工具提供位置数据。使用该工具时,您提供图像训练集,然后…

MySQL中的datetime和timestamp有什么区别

相同点: 存储格式相同 datetime和timestamp两者的时间格式都是YYYY-MM-DD HH:MM:SS 不同点: 存储范围不同. datetime的范围是1000-01-01到9999-12-31. 而timestamp是从1970-01-01到2038-01-19, 即后者的时间范围很小. 与时区关系. datetime是存储服务器当前的时区. 而timesta…

电脑怎么做图片二维码?在线制作二维码的方法

图片制作二维码是现在经常被使用的一个功能,比如产品照片、自拍、海报等等不同格式或者类型的文件都可以生成二维码。那么想要快速完成二维码制作,使用图片二维码生成器就可以快速完成制作,本文将给大家分享一下在电脑上制作图片二维码的操作…

Presentation Prompter 5.4.2(mac屏幕提词器)

Presentation Prompter是一款演讲辅助屏幕提词器软件,旨在帮助演讲者在公共演讲、主持活动或录制视频时更加流畅地进行演讲。以下是Presentation Prompter的一些特色功能: 提供滚动或分页显示:可以将演讲稿以滚动或分页的形式显示在屏幕上&a…

管理视频推广工作:新媒体团队的成功策略

目前的新媒体团队,在视频管理时呈现出多、杂、散的特点,如何有效管理视频素材是当下许多新媒体团队的管理痛点,也是管理要点。高效的视频推广管理是新媒体团队提升产出效率的关键。 那么新媒体行业该如何管理视频推广工作? 数据…

【修车案例】一波形一案例(10)

故障车型: 2005 teana 2.0日产 维修厂: 建兴汽车保养厂示波器诊断: 通道A – ABS霍尔传感器信号测量故障分析: 诊断计算机报错左后轮胎轮速异常, 速度与其他车轮差较大。 通过示波器量测ABS信号, 2线式霍尔传感器, 信道A正极接信号线, 负极接地线, 干扰较严重就不建议从蓄电池…

windows环境下PHP7.4多线程设置

windows环境下的PHP设置多线程时有一定的难度,难点主要是PHP版本的选择,多线程扩展的选择,以及相关的设置等。 环境 windows 10php-7.4.33-Win32-vc15-x64php_parallel-1.1.4-7.4-ts-vc15-x64phpstudy 8.1.1.2 为了快速的部署PHP环境&…

Wireshark学习 与 TCP/IP协议分析

Wireshark简介和工具应用 如何开始抓包? 打开wireshark,显示如下网络连接。选择你正在使用的,(比如我正在使用无线网上网),双击 可以先看下自己的ip地址和网关ip地址(看抓包数据时候会用到&…

Mysql--高级(自定义函数、存储过程、视图、事务、索引)

自定义函数 语法 delimiter $$ create function 函数名称(参数列表) returns 返回类型 begin sql语句 end $$ delimiter ; 说明: delimiter用于设置分割符,默认为分号,主要用于命令行,在“sql语句”部分编写的语句需要以分号结尾,此时回车会…

Qt插件开发_入门教程

文章目录 前言插件的好处具体流程1. 第一,我们先创建一个主框架应用(**第一个工程**)2. GUI 设计 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f215270ccfac4e038e7261c4b4891ec1.png)3. 创建动态库项目(**第2个工程**)4. 给插件项目添加qt界面类5.在插件工程添加一个头…

Unix环境高级编程-学习-02-进程环境之进程终止、命令行参数、环境表、C程序的存储空间布局

目录 一、环境信息 二、声明 三、进程终止 1、情况分类 2、退出函数 3、退出实验 (1)main声明int和调用return值 (2)main声明int和不调用return (3)main声明不int和不调用return 4、atexit 5、at…

SpringBoot加载测试类属性和配置说明

一、项目准备 1.创建项目 2.配置yml文件 test:name: FOREVERlove: sing二、测试类属性 1.Value 说明:读取yml中的数据。 package com.forever;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value; import org.spr…

Linux中固定ip端口和修改ip地址

一,更改虚拟网络编辑器 1,首先启动VMware,选择自己要更改ip或固定ip的虚拟机,并找到虚拟网络配编辑器,点击进入 2,进入之后需要点击右下角获取管理员权限后才能修改,有管理员权限之后图片如下 …

TSINGSEE青犀车辆违停AI算法在园区道路管控场景中的应用方案

一、背景与需求 园区作为企业办公、生产制造的重要场所,主要道路车辆违停等违规行为会对园区的安全造成隐患,并且在上下班高峰期内,由于发现不及时,车辆违停行为会造成出入口拥堵现象,这也成为园区管理的棘手问题。 …

C++入门(二)

前言 我们上一期介绍了什么是C,命名空间、输入输出、以及缺省参数。本期我们来继续介绍C的入门知识! 本期内容介绍 函数重载 引用 内联函数 auto关键字 范围for 指针空值nullptr 目录 前言 本期内容介绍 一、函数重载 什么是函数重载? …

Apple :苹果将在明年年底推出自己的 AI,预计将随 iOS 18 一起推出

本心、输入输出、结果 文章目录 Apple :苹果将在明年年底推出自己的 AI,预计将随 iOS 18 一起推出前言三星声称库克相关图片弘扬爱国精神 Apple :苹果将在明年年底推出自己的 AI,预计将随 iOS 18 一起推出 编辑:简简单…