UCOSIII实时操作系统------任务管理

2023-05-16

文章目录

  • 前言
  • 一、任务的基本概念
  • 二、操作系统的初始化与启动
    • 1.操作系统初始化,初始化各种内核对象和全局变量......
    • 2.启动操作系统,创建任务后调用
  • 三、任务的管理
    • 1、任务状态
    • 2、创建任务
    • 3、任务挂起
    • 4、任务恢复执行
    • 5、任务的删除
  • 四、内核调度点
  • 总结


前言

UCOSIII实时操作系统------任务管理

提示:以下是本篇文章正文内容,下面案例可供参考

一、任务的基本概念

在UCOSIII中任务就是程序实体,UCOSIII能够管理和调度这些小任务(程序)。
UCOSIII中的任务由三部分组成:任务堆栈、任务控制块和任务函数。
任务堆栈:上下文切换的时候用来保存任务的工作环境,就是STM32的内部寄存器值(r0~r15、xpsr)。
任务控制块:任务控制块用来记录任务的各个属性。
任务函数:由用户编写的任务处理代码,是实实在在干活的。
UCOSIII中的任务函数模板:

void xxx_task(void *p_arg)
{
	while(1)
	{
		//任务处理过程
		........
	}
}

可以看出任务函数通常是一个无限循环,当然了,也可以是一个只执行一次的任务。任务的参数是一个void类型的,这么做的目的是可以传递不同类型的数据甚至是函数。
可以看出任务函数其实就是一个C语言的函数,但是在使用UCOIII的情况下这个函数不能由用户自行调用,任务函数何时执行,何时停止完全由操作系统来控制。

二、操作系统的初始化与启动

1.操作系统初始化,初始化各种内核对象和全局变量…

它是第一个执行的函数。

void  OSInit (OS_ERR  *p_err)

参数:
p_err,返回错误码

返回值:无

......
OS_SemInit(p_err);
OS_TaskInit(p_err);  
OS_IntQTaskInit(p_err);                                 
OS_IdleTaskInit(p_err);
OS_TickTaskInit(p_err);  
......  

2.启动操作系统,创建任务后调用

代码如下(示例):

void  OSStart (OS_ERR  *p_err)

参数:
p_err,返回错误码

三、任务的管理

1、任务状态

从用户的角度看,UCOSIII的任务一共有5种状态:
休眠态:任务已经在内部FLASH中了,但是还不受UCOSIII管理。
就绪态:系统为任务分配了任务控制块,并且任务已经在就绪表中登记,这时该任务就具有了运行的条件,此时任务的状态就是就绪态。
运行态:任务获得CPU的使用权,正在运行。
等待态:正在运行的任务需要等待一段时间,或者等待某个事件,这个任务就进入了等待态,此时系统就会把CPU使用权转交给别的任务。
中断服务态:当发送中断,当前正在运行的任务会被挂起,CPU转而去执行中断服务函数,此时任务的任务状态叫做中断服务态。

注:
若当前的任务使用了调度器上锁时,一旦中断发生并中断服务程序结束后,总是会返回被打断的任务中去

2、创建任务

代码如下:

void  OSTaskCreate (OS_TCB        *p_tcb,
                    CPU_CHAR      *p_name,
                    OS_TASK_PTR    p_task,
                    void          *p_arg,
                    OS_PRIO        prio,
                    CPU_STK       *p_stk_base,
                    CPU_STK_SIZE   stk_limit,
                    CPU_STK_SIZE   stk_size,
                    OS_MSG_QTY     q_size,
                    OS_TICK        time_quanta,
                    void          *p_ext,
                    OS_OPT         opt,
                    OS_ERR        *p_err)

参数
p_tcb,类似于线程id,控制任务
p_name,任务的名字,自定义
p_task,类似于线程函数,任务函数
p_arg,类似于线程参数传递,任务参数传递
prio,任务的优先级
p_stk_base,任务栈的基址,提供一个数组基址
stk_limit,腾出10%的栈空间给到堆栈检测函数使用,反过来说,当前任务只能使用90%栈空间
stk_size,任务栈的大小,以字(32bit)为单位
q_size,任务内消息队列的大小,若不使用,写0
time_quanta,与其它任务处在同一个优先级,内核允许一个任务运行一定的时间(又叫时间片),然后轮到下一
个任务,即所谓的互相“礼让”执行。默认为0,时间片由内核决定。
p_ext,提供额外存储空间用于存储浮点运算单元寄存器,若不提供,写NULL
opt,在创建任务的时候,提供额外操作,如果不使用,写OS_OPT_TASK_NONE
p_err,返回错误码,没有错误的就返回OS_ERR_NONE

返回值:无

#栈大小
创建任务特别检查传递的数组的大小是否空间充足,因为它是作为任务的栈空间使用,若空间不足,会导致程序不能执行,直接跑到HardFault_Handler这个函数。
原因如下:
1)任务里申请大空间的局部变量,例如数组、结构体…,将会占用大量的栈空间
2)任务里包含很多复杂的函数,将会占用大量的栈空间

解决方法:
1)该局部变量变为全局变量
2)该局部变量变为静态的局部变量
3)创建当前任务的时候,决定更大的栈空间

#UCOSIII优先级
优先级 0:中断服务管理任务 OS_IntQTask()
优先级 1:时钟节拍任务 OS_TickTask() 滴答定时器任务
优先级 2:定时任务 OS_TmrTask()
优先级 3:开始任务 OS_start_task()
优先级OS_CFG_PRIO_MAX-2 : 统计任务 OS_StatTask()
优先级OS_CFG_PRIO_MAX-1 : 空闲任务 OS_IdleTask()

其他自己设定的任务可以根据重要性从4开始设定。

#轮转调度算法
时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个任务被分配一时间段,称作它的时间片,即该任务允许运行的时间。时间片轮转调度算法是面向于多个同级的任务。轮转调度算法在实际使用中,时间片长度该设为多少需要好好调试,因为有时候时间片太短,任务还没来得及做事情,就被调度了;时间片太长,又会造成让其它任务等太久,所以实际编程中需要好好调试。

1)使用时间片轮转调度,需要将系统中的宏定义:“OS_CFG_SCHED_ROUND_ROBIN_EN”设为真,这样才能启用时间片轮转调度,具体位置在os_cfg.h。

2)在执行OSInit函数后添加如下代码:

#if OS_CFG_SCHED_ROUND_ROBIN_EN     
    //使能时间片轮转调度功能,时间片长度为:1*5=5ms
    OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
#endif

OSSchedRoundRobinCfg 函数分析

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

参数说明:
en,使能,填写为"DEF_ENABLED"才能使能时间片轮转调度;
dflt_time_quanta,时间片长度,就是每个任务每次获得CPU使用权后执行的时间。若参数为0,时间片长度=OS_CFG_TICK_RATE_HZ/10。
p_err,错误码。
3)当一个任务想要放弃本次时间片的时候,就可以调用该函数,函数原型如下:

void  OSSchedRoundRobinYield (OS_ERR  *p_err)

4)任务创建示例

//创建任务1
OSTaskCreate((OS_TCB *)&Task1_TCB,		        //任务控制块
			(CPU_CHAR *)"Task1",		//任务的名字
			(OS_TASK_PTR)task1,		//任务函数
			(void *)0,			//传递参数
			(OS_PRIO)6,			//任务的优先级		
			(CPU_STK *)task1_stk,		//任务堆栈基地址
			(CPU_STK_SIZE)128/10,		//任务堆栈深度限位
			(CPU_STK_SIZE)128,		//任务堆栈大小			
			(OS_MSG_QTY)0,			//禁止任务消息队列
			(OS_TICK)10,			//默认时间片长度为10*1ms=100ms																
			(void  *)0,			//不需要补充用户存储区
			(OS_OPT)OS_OPT_TASK_NONE,	//没有任何选项
			&err				//返回的错误码
			);

3、任务挂起

暂停任务的执行

void   OSTaskSuspend (OS_TCB  *p_tcb,
                      OS_ERR  *p_err)

参数:
p_tcb,类似于线程id,控制任务
p_err,返回错误码,没有错误的就返回OS_ERR_NONE

返回值:无

项目用途:
1)如果当前任务不是经常要执行的,可以挂起。类似于手机APP的管理机制,如果app进入后台就冻结其执行,也就是挂起app,有利于提高系统响应,降低资源占用。
2)保护共享资源,可以挂起。

4、任务恢复执行

void  OSTaskResume (OS_TCB  *p_tcb,
                    OS_ERR  *p_err)

参数:
p_tcb,类似于线程id,控制任务
p_err,返回错误码,没有错误的就返回OS_ERR_NONE

返回值:无

5、任务的删除

void  OSTaskDel (OS_TCB  *p_tcb,
                 OS_ERR  *p_err)

参数:
p_tcb,类似于线程id,控制任务;若是删除自己的话,就填写NULL。

p_err,返回错误码,没有错误的就返回OS_ERR_NONE

返回值:无

项目用途:
专门用于初始化硬件,一般来说,硬件只做一次初始化,完毕后可将该任务删除,该任务的删除是不会释放资源,只是通过任务列表去掉而已。

四、内核调度点

释放信号量或者发送消息,也可通过配置相应的参数不发生任务调度。
使用延时函数OSTimeDly()或者OSTimeDlyHMSM()。
任务等待的事情还没发生(等待信号量,消息队列等)。
任务取消等待。
创建任务。
删除任务。
删除一个内核对象。
任务改变自身的优先级或者其他任务的优先级。
任务通过调用OSTaskSuspend()将自身挂起。
任务解挂某个挂起的任务。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了UCOSIII实时操作系统------任务管理,而UCOSIII实时操作系统还有更多的功能等着我们去挖掘,其他内容请移步博主其他文章或关注博主等待后续发布。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UCOSIII实时操作系统------任务管理 的相关文章

  • UKF无迹卡尔曼滤波

    UKF无迹卡尔曼滤波是在卡尔曼滤波和变换的基础上发展而来的 xff0c 它是利用无损变换使线性假设下的卡尔曼滤波应用于非线性系统 之前提到的EKF算法简单易操作 xff0c 在工业中有广泛的应用 但是它也存在很多缺点 xff1a 需要计算非
  • 在失望中重找希望——我的2013年工作总结

    时间过的真的是快 来广州已整整工作了一年啦 从2012年长沙工作离职后 为了我的女朋友 我毅然踏上了南下广州的征途 来到羊城后 很快 xff0c 一个礼拜就找到了现在工作的这家公司 现在回想一下 真觉得当初没有好好斟酌一下 2013年里 x
  • 使用eclipse 4.3 经常出现卡死、无响应情况的解决方法

    最近在使用 eclipse 4 3 开发的时候 xff0c 经常出现卡死 无响应 情况 在网上搜索了一下之后发现 xff0c 发现网上还是有解决方法的 于是以记之 xff01 一 首先 xff0c 我们修改下eclipse的内存配置文件 l
  • Android学习之 移动应用<App>微信支付集成小结

    微信支付现在主要集成在 xff1a 1 移动应用开发 2 网站应用开发 3 公众账号开发 本篇主要针对移动应用App集成微信支付 xff0c 实际项目坑点分享 xff01 一 既予之 与共之 xff1a 平台资源 1 微信开放平台 xff1
  • Android学习之 主项目合并Library子项目中的Manifest

    一 项目背景 xff1a 项目XX是一个按模块化规则来进行开发的 xff0c 包含主模块A 子模块B 子模块C 子模块D xff0c 其中子模块B C D都是Library项目 xff0c 并且都包含有自己的Actity等资源文件 Andr
  • 我的2011——周年纪

    今天距我开博的日期 xff0c 有将近一年半的时间 xff0c 博客的确是一个会让我们有所期待的东西 xff0c 学习 积累 沉淀 再学习 2011年 xff0c 经历了血雨腥风的SAP市场开始主推云存储和内存运算 xff0c HANA在不
  • Android学习之 Manifest中meta-data扩展元素数据的配置与获取

    在AndroidManifest xml清单文件中 我们有时会看到如下类似的 lt meta data gt 元素开始的配置内容 xff1a lt meta data android name 61 34 com google androi
  • 工具使用之 adbWireless无线调试Android应用

    今天巧遇这个工具 xff1a adbwireless apk xff0c 于是乎 试爽了一把 xff0c 果然觉得是个不错的工具 可谓是相见恨晚 可以帮助Android开发的同事们实现手机无线调试应用程序 对 xff01 你没有听错 如果你
  • Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒

    在Android手机上 xff0c 如QQ 微信当有未读消息的时候 我们可以看到在应用的启动图标的右上角会有一个红色圈圈 且圈圈里会动态显示未读消息的数目 xff0c 如下图显示 xff1a 那么该功能是怎么实现的呢 xff1f 在万能的互
  • 工具使用之Android Studio快捷键-mac版

    最近给自己添置了一台mac 也算是完成了多年前的一个小愿望 做为Android开发者的我于是搭载了Android Studio 1 1正式版做为了我的安卓开发工具 在window上eclipse我可以畅快的玩耍 xff0c idea和as也
  • Android学习之 Scroller的介绍与使用

    类概述 Android里Scroller类是为了实现View平滑滚动的一个Helper类 通常在自定义的View时使用 xff0c 在View中定义一个私有成员mScroller 61 new Scroller context 设置mScr
  • Android 从外部网页拉起跳转到App

    业务场景 当需要从外部第三方网页中通过点击某个链接或按钮启动App应用程序 实现 新建demo工程 xff0c 并实现一个Activity xff0c 用来接收从外部跳转传入的信息 代码如下 xff1a span class hljs ke
  • Android 使用ColorMatrix改变图片颜色

    ColorMatrix的颜色矩阵介绍 颜色矩阵M是一个5 4的矩阵 xff0c 在Android中 xff0c 颜色矩阵M是以一维数组m 61 a b c d e f g h i j k l m n o p q r s t 的方式进行存储的
  • 中断处理handler不能sleep

    1 进入中断处理程序 gt 2 保存关键上下文 gt 3 开中断 xff08 sti指令 xff09 gt 4 进入中断处理程序的handler gt 5 关中 里面很多说法不是很同意 个人认为中断处理handler不能sleep原因应该不
  • opencv移动物体追踪

    本次试验用的WINFORM 要先绘制窗体 xff0c 自己测试的时候注意对象名就可以了 public Form1 InitializeComponent static Mat mat1 61 new Mat 64 34 timg jpg 3
  • 2021-10-5 每天几个LCEDA小知识——放置探测点

    立创EDA专业版之放置探测点 放置探测点 放置探测点 在PCBA验证环节中 探测点是很重要的存在 试想一下 一个产品在生产测试的时候 没有预留探测点 用于产品的调试 那么作业人员只能用探头去勾元器件 何其难受 因此在设计PCB的过程中 预留
  • KairosDB 1.13安装手记

    PS xff1a 为了处理监控数据 xff0c 我们需要一个时间序列数据库 xff0c OpenTSDB是前驱 xff0c 但是是基于Hbase实现的 xff0c 后来有了一个基于Cassandra的实现 xff0c 就是KairosDB
  • FreeRTOS(V8.0.1)系统之vTaskDelete()

    lt pre name 61 34 code 34 class 61 34 objc 34 gt void vTaskDelete TaskHandle t xTaskToDelete TCB t pxTCB taskENTER CRITI
  • PX4 pixhawk 和APM2.X 的USB驱动都是不能够在 windows 7 、windows 8的ghost系统下自动安装(已解决)

    PX4 pixhawk 和APM2 X 的USB驱动都是不能够在 windows 7 windows 8的ghost系统下自动安装的 xff0c 因为这ghost系统精简了一些不该精简的东西 解决方法有两个 xff1a 一 重新装完整版的操
  • Mybatis-Plus

    一 Mybatis Plus简介 1 简介 MyBatis Plus opens new window xff08 简称 MP xff09 是一个 MyBatis opens new window 的增强工具 xff0c 在 MyBatis

随机推荐

  • Offboard Control

    1 将RC开关映射到场外模式激活 在QGroundControl中加载参数并查找RC MAP OFFB SW参数 xff0c 您可以为其分配要用于激活板外模式的RC通道2 2 启用配套计算机界面 设置默认的随播计算机消息流TELEM 2 x
  • 用java实现歌曲大串烧

    原理 xff1a 我们使用SequenceInputStream将FileInputStream对 象进行集体整合 xff0c 实现一个大的新文件 代码如下 xff1a span style font size 16px package c
  • slam小单元——位姿矩阵

    目录 位姿矩阵测试代码 这个系列是对slam中的一些小概念做理解和简单的测试 位姿矩阵 这个反应的是坐标系和坐标系之间的关系 xff0c 作用 xff1a 移动向量将一个坐标系下的向量 xff08 坐标 xff09 表达在另一个坐标系下 如
  • 裸模张筱雨出位真艺术(1)

    网页内容已不存在
  • 张筱雨本是害羞女孩有为何如此大胆?

    网页内容已不存在
  • 张筱雨:清纯妩媚の身体对话钢筋水泥建筑

    网页内容已不存在
  • 传统行业的IT如何转向DEVOPS,运维如何转向SRE

    题记 xff1a 在菊厂这几年 xff0c 亲历了传统行业的IT部门如何在数字化转型的滚滚洪流中 xff0c 被裹挟着四处寻找光明 从15年至今 xff0c 参加了各式各样的培训 xff0c 最早是CI CD xff0c 后来推DEVOPS
  • 张筱雨是摄影界最高境界神形兼备

    网页内容已不存在
  • 张筱雨的个人简历

    生平介绍 xff1a 2000年张筱雨9月 2003年7月吉林市实验中学2003年9月 人体艺术2007年7月华北大学 ent大胆er 张筱雨 凡本网注明 来源 xff1a 华龙网 的作品 xff0c 系由本网自行采人体艺术编 xff0c
  • 西瓜书笔记5:神经网络

    目录 5 1 神经元模型 5 2感知机与多层网络 感知机 感知机模型 感知机学习策略 感知机学习算法 多层网络 5 3 误差逆传播算法 标准BP 误差逆传播 算法 变量符号 公式推导 工作流程 累积BP算法 5 4全局最小与局部极小 跳出局
  • 数据处理笔记1:类别不平衡-上采样

    类别不平衡 imblance problem 查找一些资料 样本不均讨论 https blog csdn net sp programmer article details 48047101 上采样 下采样 代价敏感 代价敏感 设计obje
  • FreeRTOS消息队列、信号量、事件组、任务通知之间的区别

    转载自 xff1a https blog csdn net p1279030826 article details 103471564 功能及区别列表 消息队列 xff08 需要传递消息时使用 xff09 在任务与任务间 中断和任务间传递信
  • AUTOSAR 基础知识简介

    目录 一 AUTOSAR 简介 二 AUTOSAR 部分术语简介 三 AUTOSAR 软件架构介绍 1 AUTOSAR的标准 xff08 1 xff09 分层架构 xff08 2 xff09 方法论 xff08 3 xff09 软件接口 x
  • CAN资料整理(二):CAN协议帧格式

    目录 一 CAN协议帧格式 1 数据帧 2 遥控帧 3 错误帧 4 过载帧 5 帧间隔 一 CAN协议帧格式 CAN协议帧的格式十分重要 xff0c 部分MCU中的CAN外设寄存器就是根据对应帧结构来进行设计的 数据帧 xff1a 用于发送
  • centOS7 系统服务配置(systemd)

    查看系统中的单元 后缀代表单元类型 xff09 及其启用状态 enable启用 xff0c 相当于systemctl enable xxxx disabled禁用 xff0c 相当于systemctl disable xxxx static
  • 正点原子minifly学习

    对正点原子的开发板学习已经好几个月了 xff0c 暂且了解了一点freertos和stm32的一些知识 本着从项目入手的原则 xff0c 从今天开始 xff0c 对正点原子小四轴无人机minifly进行学习 目录 minifly v1 3学
  • 嵌入式工程师必须知道的一些好网站

    废话不多说 xff0c 介绍一些嵌入式相关的好网站 链接已经做成超链接了 xff0c 直接点击标题即可 1 cubemx 微雪电子 关于cubemx的系列教程网上已经有很多了 xff0c 但很多只是涉及操作 xff0c 建立工程 xff0c
  • 初识Flink(1)-- 关于Flink的架构

    PS xff1a 我是半吊子Storm从业者 xff0c Storm是我司流计算平台很早就在使用的技术 xff0c 一直没有深入了解 xff0c 当时Flink已经出具规模 xff0c 但是鉴于一个Storm还没搞好 xff0c 再弄个Fl
  • 求助文(已解决):rviz中LaserScan显示接受到了信息,但图中啥也没有。发布端是vrep中一个激光传感器。

    rviz的界面 fixed frame 没错 xff0c LaserScan 中的Topic也没错 这两个我是确定的 显示收到的messages received 一直在增加 xff0c 这也说明接收到了信息了吧 xff0c 但显示界面中啥
  • UCOSIII实时操作系统------任务管理

    文章目录 前言一 任务的基本概念二 操作系统的初始化与启动1 操作系统初始化 xff0c 初始化各种内核对象和全局变量 2 启动操作系统 xff0c 创建任务后调用 三 任务的管理1 任务状态2 创建任务3 任务挂起4 任务恢复执行5 任务