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

uCOSIII实时操作系统 五 任务API(时间片轮转API调度)

时间片轮转调度

时间片轮转法:主要用于分时系统中的进程调度。为了实现轮转调度,系统把所有就绪进程按照先入先出的原则排成一个队列的队首进程,让CPU上运行一个时间片的时间。时间片是一个小小的时间单位,通常为5~10ms数量级。当进程用完分给他的时间片后,系统的计时器发出时钟中断,调度程序便停止该进程的运行,把它放在就绪列队的末尾,把CPU分给就绪队列的队首进程,同样也让它运行一个时间片,如此往复。

如果想要使用UCOSIII的时间片轮调度的话不仅要将宏OS_CFG_SCHED_ROUND_ROBIN_EN置1,还需要调用函数OSSchedRoundRobinCfg()

位置:

函数原型如下:

void  OSSchedRoundRobinCfg (CPU_BOOLEAN   en,OS_TICK       dflt_time_quanta,OS_ERR       *p_err)

当使用时间片轮转的时候,使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms

#if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候
//使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5ms
OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
#endif

当任务想要放弃本次时间片的时候,就可以调用OSSchedRoundRobinYield()函数,函数原型如下:

任务设置要点:

在任务设计之初就应该考虑下面三个方面的的因素:

  1. 中断服务函数
  2. 普通任务
  3. 空闲任务

中断服务函数:

中断服务函数中不能使用挂起当前任务的操作不允许调用任何会阻塞运行API函数接口(延时)中断服务函数最好是精简短小,快进快出。一般在中断服务函数中只做标记事件发生,然后通知任务,让对应的任务区处理,因为中断服务函数的优先级高于任何优先级任务,如果中断任务处理时间过长会导致系统整个任务无法正常运行。

普通任务:

在任务中不允许出现死循环(此处的死循环指的是没有阻塞机制的任务循环体),如一个任务中只有就绪态而没有阻塞态,势必会影响到其他低优先级的任务的执行,所以在进行任务设计的时候就应该保证任务在不活跃的时候,任务可以进入阻塞态以交出 CPU 使用权。(OSTimeDlyHMSM()延时函数)

空闲任务:

用户可以通过空闲任务钩子方式,在空闲任务上钩入自己的功能函数。通常这个空闲任务钩子能够完成一些额外的特殊功能,例如系统运行状态的指示,系统省电模式等。空闲任务是唯一一个不允许出现阻塞情况的任务,因为 μC/OS 需要保证系统永远都有一个可运行的任务。

时间片轮转实验:

实验要求:

  1. 主函数创建任务1负责创建两个相同的优先级的任务2和任务3执行完任务函数后删除自身。
  2. 任务2负责每隔1s打印一次abcde,任务3每隔1s打印一次fghij
  3. 通过串口打印值来观察时间片轮转。

本实验继承前一篇博客http://t.csdnimg.cn/RRZqJ的工程在之前的工程上修改:

任务1:

在错误码变量声明完之后,加入下边的代码当宏OS_CFG_SCHED_ROUND_ROBIN_EN置1的时候执行调用函数OSSchedRoundRobinCfg(),实现时间片轮转调度。

#if OS_CFG_SCHED_ROUND_ROBIN_ENOSSchedRoundRobinCfg(DEF_ENABLED,1,&err2_3);
#endif

将创建任务的时间片长度修改为适当时间,这是我修改为3,时间片:3*5=15ms

实验现象:

实验源码:

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "includes.h"//UCOSIII中以下优先级用户程序不能使用,ALIENTEK
//将这些优先级分配给了UCOSIII的5个系统内部任务
//优先级0:中断服务服务管理任务 OS_IntQTask()
//优先级1:时钟节拍任务 OS_TickTask()
//优先级2:定时任务 OS_TmrTask()
//优先级OS_CFG_PRIO_MAX-2:统计任务 OS_StatTask()
//优先级OS_CFG_PRIO_MAX-1:空闲任务 OS_IdleTask()//创建任务1
//定义任务优先级
#define TASK_1_PRIO 3
//定义任务控制块
OS_TCB TASK_1_TCB;
//定义任务堆栈大小
#define TASK_1_STK_SIZE 128
//定义任务堆栈
CPU_STK TASK_1_STK[TASK_1_STK_SIZE];
//定义任务函数
void TASK_1(void *arg);//创建任务2
//定义任务优先级
#define TASK_2_PRIO 4
//定义任务控制块
OS_TCB TASK_2_TCB;
//定义任务堆栈大小
#define TASK_2_STK_SIZE 128
//定义任务堆栈
CPU_STK TASK_2_STK[TASK_2_STK_SIZE];
//定义任务函数
void TASK_2(void *arg);//创建任务3
//定义任务优先级
#define TASK_3_PRIO 4
//定义任务控制块
OS_TCB TASK_3_TCB;
//定义任务堆栈大小
#define TASK_3_STK_SIZE 128
//定义任务堆栈
CPU_STK TASK_3_STK[TASK_3_STK_SIZE];
//定义任务函数
void TASK_3(void *arg);int main(void)
{OS_ERR err1;//错误码变量CPU_SR_ALLOC();//定义临界区需要的变量//硬件初始化delay_init();       //延时初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置uart_init(115200);    //串口波特率设置OSInit(&err1);//初始化UCOSIIIOS_CRITICAL_ENTER();//进入临界区代码//创建开始任务1OSTaskCreate((OS_TCB 	* )&TASK_1_TCB,		//任务控制块(CPU_CHAR	* )"main TASK1", 		//任务名字(OS_TASK_PTR )TASK_1, 			//任务函数(void		* )0,					//传递给任务函数的参数(OS_PRIO	  )TASK_1_PRIO,     //任务优先级(CPU_STK   * )&TASK_1_STK[0],	//任务堆栈基地址(CPU_STK_SIZE)TASK_1_STK_SIZE/10,	//任务堆栈深度限位(CPU_STK_SIZE)TASK_1_STK_SIZE,		//任务堆栈大小(OS_MSG_QTY  )0,					//任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息(OS_TICK	  )0,					//当使能时间片轮转时的时间片长度,为0时为默认长度,(void   	* )0,					//用户补充的存储区(OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项(OS_ERR 	* )&err1);				//存放该函数错误时的返回值OS_CRITICAL_EXIT();//退出临界区代码OSStart(&err1);//开启UCOSIIIwhile(1);
}void TASK_1(void *arg)
{OS_ERR err2_3;//错误码变量CPU_SR_ALLOC();//定义临界区需要的变量
#if OS_CFG_SCHED_ROUND_ROBIN_ENOSSchedRoundRobinCfg(DEF_ENABLED,1,&err2_3);
#endifOS_CRITICAL_ENTER();//进入临界区代码//创建开始任务2OSTaskCreate((OS_TCB 	* )&TASK_2_TCB,		//任务控制块(CPU_CHAR	* )"main TASK2", 		//任务名字(OS_TASK_PTR )TASK_2, 			//任务函数(void		* )0,					//传递给任务函数的参数(OS_PRIO	  )TASK_2_PRIO,     //任务优先级(CPU_STK   * )&TASK_2_STK[0],	//任务堆栈基地址(CPU_STK_SIZE)TASK_2_STK_SIZE/10,	//任务堆栈深度限位(CPU_STK_SIZE)TASK_2_STK_SIZE,		//任务堆栈大小(OS_MSG_QTY  )0,					//任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息(OS_TICK	  )3,					//当使能时间片轮转时的时间片长度,为0时为默认长度,(void   	* )0,					//用户补充的存储区(OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项(OS_ERR 	* )&err2_3);				//存放该函数错误时的返回值//创建开始任务3OSTaskCreate((OS_TCB 	* )&TASK_3_TCB,		//任务控制块(CPU_CHAR	* )"main TASK3", 		//任务名字(OS_TASK_PTR )TASK_3, 			//任务函数(void		* )0,					//传递给任务函数的参数(OS_PRIO	  )TASK_3_PRIO,     //任务优先级(CPU_STK   * )&TASK_3_STK[0],	//任务堆栈基地址(CPU_STK_SIZE)TASK_3_STK_SIZE/10,	//任务堆栈深度限位(CPU_STK_SIZE)TASK_3_STK_SIZE,		//任务堆栈大小(OS_MSG_QTY  )0,					//任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息(OS_TICK	  )3,					//当使能时间片轮转时的时间片长度,为0时为默认长度,(void   	* )0,					//用户补充的存储区(OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项(OS_ERR 	* )&err2_3);				//存放该函数错误时的返回值							 OS_CRITICAL_EXIT();//退出临界区代码//任务一执行完函数之后删掉自身OSTaskDel((OS_TCB *)0,&err2_3);			 
}//任务2主体
void TASK_2(void *arg)
{int num = 0;//任务2运行次数OS_ERR err2;while(1){num++;printf("任务2运行次数:%d\r\n",num);printf("abcde\r\n");OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err2);//延时1S}
}//任务3主体
void TASK_3(void *arg)
{int num = 0;//任务2运行次数OS_ERR err3;while(1){num++;printf("任务3运行次数:%d\r\n",num);printf("fghij\r\n");OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err3);//延时500ms}
}

相关文章:

uCOSIII实时操作系统 五 任务API(时间片轮转API调度)

时间片轮转调度 时间片轮转法:主要用于分时系统中的进程调度。为了实现轮转调度,系统把所有就绪进程按照先入先出的原则排成一个队列的队首进程,让CPU上运行一个时间片的时间。时间片是一个小小的时间单位,通常为5~10ms数量级。当进程用完分…...

微信小程序项目如何用Hbuild启动,先让对方在微信开发平台将你的微信号添加成开发成员。

微信小程序项目如何用Hbuild启动,先让对方在微信开发平台将你的微信号添加成开发成员。然后在Hbuild官网下载,下载好后运行,点击文件导入项目,然后点击运行,模拟微信小程序,选择微信开发工具的地址&#xf…...

应对广告虚假流量,app广告变现该如何风控?

移动广告市场中的虚假流量一直是困扰各移动应用厂商的难题,广告作为app商业化变现最为直接快捷的途径,也引申出了流量作弊与反作弊的纷争。 根据《2021中国异常流量报告》,2021年中国品牌广告市场因异常流量造成的损失约为326亿人民币&#…...

【算法-动态规划】贝尔曼福特算法

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...

【23-24 秋学期】NNDL 作业3

过程推导 - 了解BP原理数值计算 - 手动计算,掌握细节代码实现 - numpy手推 pytorch自动 对比【numpy】和【pytorch】程序,总结并陈述。激活函数Sigmoid用PyTorch自带函数torch.sigmoid(),观察、总结并陈述。激活函数Sigmoid改变为Relu&#…...

v-on/@ 事件处理指令修饰符-stop、prevent、once

v-on/事件修饰符&#xff1a; 一、.stop 阻止单机事件继续传播 event.stopProgagetion() eg: <h3>事件修饰符</h3> <div click"todo"> <div click.stop"doThis"> 单机事件会继续传递 </div> </div> 点击 单机事…...

macOS Sonoma 14.1beta3(23B5067a)发布

黑果魏叔10 月 11 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14.1 开发者预览版 Beta 3 更新&#xff08;内部版本号&#xff1a;23B5067a&#xff09;&#xff0c;本次更新距离上次发布隔了 7 天。 根据官方发布的macOS Sonoma 14.1beta3更新日志&#xff0c;此…...

这些负载均衡都解决哪些问题?服务、网关、NGINX?

在微服务项目中&#xff0c;有服务的负载均衡、网关的负载均衡、Nginx的负载均衡&#xff0c;这几个负载均衡分别用来解决什么问题呢&#xff1f; 一、服务的负载均衡 先抛出一个问题&#xff1a; 当一个微服务被多个实例部署时&#xff0c;如何分配和平衡请求的负载&#x…...

#力扣:344. 反转字符串@FDDLC

344. 反转字符串 一、Java class Solution {public void reverseString(char[] s) {for (int l 0, r s.length - 1; l < r; l, r--) {s[l] ^ s[r];s[r] ^ s[l];s[l] ^ s[r];}} } 二、C #include <vector> using namespace std; class Solution { public:void re…...

浅谈SSL通配符证书优势

在当今数字化时代&#xff0c;网络安全是一个日益重要的问题。随着越来越多的网站和应用程序被创建和部署&#xff0c;用户输入的敏感信息面临着潜在的风险。为了确保数据传输的机密性和完整性&#xff0c;SSL&#xff08;Secure Sockets Layer&#xff09;证书成为保护用户隐私…...

[开源]基于流程编排的自动化测试工具,插件驱动,测试无限可能

一、开源项目简介 流程编排&#xff0c;插件驱动&#xff0c;测试无限可能 一款基于流程编排的自动化测试工具 二、开源协议 使用Apache-2.0开源协议 三、界面展示 四、功能概述 在软件开发旅程中&#xff0c;测试流程的管理和执行常常是复杂且耗时的挑战。传统测试工具主…...

gdb的一些常见命令收录

gdb的一些常见命令收录 基本命令设置和查看调试其他 基本命令 run 运行程序。 next (n) 单步调试&#xff08;不进入函数&#xff09;。 step (s) 单步调试&#xff08;进入函数&#xff09;。 continue © 继续执行程序。 quit (q) 退出GDB。 help 获取GDB命令的帮…...

聚观早报 | 首个“5G-A智慧家庭”发布;李鹏称5G-A是5G发展选择

【聚观365】10月12日消息 首个“5G-A智慧家庭”发布 李鹏称5G-A是5G发展的自然选择 新版努比亚Z50S Pro开售 英特尔锐炫A580显卡全球同步上市 vivo X100系列年底登场 首个“5G-A智慧家庭”发布 在全球移动宽带论坛&#xff08;MBBF2023&#xff09;期间&#xff0c;du联合…...

golang JWT原理介绍

JWT认证机制 官方文档 JWT文档 原理简介 客户端通过服务端认证之后&#xff0c;由服务端返回一个JSON对象&#xff0c;发回到客户端。客户端保存该对象用于以后服务器访问凭据&#xff0c;服务端完全依赖该JSON对象来验证客户端的身份。由于JSON数据容易被篡改&#xff0c;…...

xcode打包macos报错:FlutterInputs.xcfilelist 和 FlutterOutputs.xcfilelist

xcode 打包macos的时候&#xff0c;报错如下&#xff1a; Unable to load contents of the file list: ‘macos/ephemeral/FlutterInputs.xcfilelist’ ‘macos/ephemeral/FlutterOutputs.xcfilelist’ 解决方案&#xff1a; 我的项目macos下没有找到FlutterInputs.xcfilelis…...

智能机场系统:打造出行体验的未来

随着航空业的迅猛发展&#xff0c;机场作为出行的重要枢纽&#xff0c;必须不断提升自身的服务质量和效率。智能机场系统应运而生&#xff0c;为旅客提供更加便捷、智能化的出行体验。本文将从技术应用、服务优化和安全保障三个方面&#xff0c;全面介绍智能机场系统的特点和优…...

ROS为机器人装配激光雷达

移动机器人在环境中获取障碍物的具体位置、房间的内部轮廓等信息都是非常必要的&#xff0c;这些信息是机器人创建地图、进行导航的基础数据&#xff0c;除上面所讲的Kinect&#xff0c;还可以使用激光雷达作为这种场景应用下的传感器。 激光雷达可用于测量机器人和其他物体之间…...

ppt录屏没有声音?超实用教程来了!

随着信息技术的发展&#xff0c;ppt已经成为工作中必不可少的工具。无论是工作报告、项目展示还是学术交流&#xff0c;都离不开ppt的辅助。屏幕录制功能是ppt的一个重要特性&#xff0c;可以帮助用户方便地录制幻灯片演示&#xff0c;但在使用过程中&#xff0c;有时会遇到ppt…...

不外传秘诀| docker 快速搭建常用的服务环境

本文主要给大家介绍如何使用 docker 搭建常用的服务环境&#xff0c; 包括mysql,reedis,nginx,jenkins 等常用的环境&#xff0c;下面直接进入主题。 1、MySQL 部署 ①搜索 MySQL 镜像 docker search mysql ②拉取 MySQL 镜像 docker pull mysql:5.7 ③创建容器&#xf…...

OrcaTerm AI

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...