【UCOSIII操作系统】任务篇(1)创建任务_uc/os任务创建的基本操作-程序员宅基地

技术标签: 操作系统  UCOSIII操作系统  

UCOSIII其他内容导航不迷路
UCOSIII操作系统-简介
【UCOSIII操作系统】任务篇(2)相关API函数
【UCOSIII操作系统】系统初始化篇(1)系统初始化
【UCOSIII操作系统】系统初始化篇(2)CPU,SysTick,内存初始化
【UCOSIII操作系统】硬件初始化篇(1)硬件初始化以及开始运行系统
【UCOSIII操作系统】消息队列篇(1)消息队列
【UCOSIII操作系统】消息队列篇(2)任务消息队列
【UCOSIII操作系统】信号量与互斥量篇(1)信号量
【UCOSIII操作系统】信号量与互斥量篇(2)互斥量
【UCOSIII操作系统】信号量与互斥量篇(3)任务信号量
【UCOSIII操作系统】事件篇
【UCOSIII操作系统】中断管理篇
【UCOSIII操作系统】临界段篇
【UCOSIII操作系统】软件定时器篇
【UCOSIII操作系统】内存管理篇
已完结

写在前面

这个内容不适合0基础的人,因为这里只讲了应用层面的东西,并没有深入内核讲解,所以要从零开始学UCOSIII的朋友,可以先去学完入门内容,再来观看这个笔记加深印象。我的笔记里面对概念只是大概说明,并不会进行深入讲解,因为太麻烦,太复杂,有兴趣可以自行深入学习,最重要的就是会用就行

UCOSIII操作系统——任务篇(1)创建任务

一、UCOSIII——任务 简介

在裸机系统中,系统的主体就是main 函数里面顺序执行的无限循环,这个无限循环里面CPU 按照顺序完成各种事情。在多任务系统中,我们根据功能的不同,把整个系统分割成一个个独立的且无法返回的函数,这个函数我们称为任务,也有人称之为线程。
多任务操作系统最主要的就是对任务的管理,包括任务的创建、挂起、删除和调度等,因此对UCOSIII操作系统中任务管理的理解就显得尤为重要。

二、创建任务流程

1、定义任务栈

任务堆栈用来在切换任务和调用其他函数的时候保存现场,因此每一个任务都应该有自己的堆栈。

  1. 首先使用宏定义一个堆栈大小
  2. 再定义一个堆栈(实质上是一个数组)

定义堆栈用CPU_STK 数据类型创建一个堆栈(CPU_STK在cpu.h中有定义)
在这里插入图片描述
在这里插入图片描述

//任务堆栈大小	
#define TASK2_STK_SIZE 		128
//任务堆栈	
CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE];

2、定义任务控制块TCB

定义好任务函数和任务栈之后,我们还需要为任务定义一个任务控制块,通常我们称这个任务控制块为任务的身份证。在C代码上,任务控制块就是一个结构体,里面有非常多的成员,这些成员共同描述了任务的全部信息。
(关于TCB的具体内容我这里也不写出来了,有兴趣的可以己深入了解)
在这里插入图片描述

//任务控制块
OS_TCB Task1_TaskTCB;

3、定义任务主体函数

任务实际上就是一个无限循环且不带返回值的C函数。
在这里插入图片描述
严格按照格式,只能修改函数名,关于*p_arg这个参数,不用管,就这样写,反正基本也没用过。

//任务函数
void task1_task(void *p_arg);
void task2_task(void *p_arg);

定义完之后就可以写自己的业务代码了,比如写一个LED翻转的任务1S翻转一次

/**********************************************************************************************
                                          LED TASK
**********************************************************************************************/

static  void  AppTaskLed1 ( void * p_arg )
{
    
    OS_ERR  err;			// 定义一个“错误” 变量用来存放一些错误的类型
   (void)p_arg;				// 就这样写咯
    while (DEF_TRUE) {
     		/*无限循环*/
			macLED3_TOGGLE ();									//	LED翻转
			OSTimeDly ( 10000, OS_OPT_TIME_DLY, & err );		// 阻塞延时
    }
}

任务里面一定要有阻塞延时,如果这个任务的优先级最高且没有阻塞延时,那么操作系统就只会执行这一个任务,其他的任务就得不到执行。
专业解释:
任务里面的延时函数必须使用uCOS里面提供的阻塞延时函数,并不能使用我们裸机编程中的那种延时。这两种的延时的区别是uCOS里面的延时是阻塞延时,即调用OSTimeDly0函数的时候,当前任务会被挂起,调度器会切换到其它就绪的任务,从而实现多任务。如果还是使用裸机编程中的那种延时,那么整个任务就成为了一个死循环,如果恰好该任务的优先级是最高的,那么系统永远都是在这个任务中运行,比它优先级更低的任务无法运行,根本无法实现多任务,因此任务中必须有能阻塞任务的函数,才能切换到其他任务中。

4、创建任务

创建任务调用函数

OSTaskCreate();

参数解释:

	//创建开始任务
	OSTaskCreate((OS_TCB 	* )&StartTaskTCB,		//任务控制块(&传地址)
				 (CPU_CHAR	* )"start task", 		//任务名字(可以随便写,对应上就行)
                 (OS_TASK_PTR )start_task, 			//任务函数(任务主体函数的函数名)
                 (void		* )0,					//传递给任务函数的参数(一般写0)
                 (OS_PRIO	  )START_TASK_PRIO,     //任务优先级(可以写具体的数字,也可以写宏定义)
                 (CPU_STK   * )&START_TASK_STK[0],	//任务堆栈基地址(&传地址)
                 (CPU_STK_SIZE)START_STK_SIZE/10,	//任务堆栈深度限位(看下面解释)
                 (CPU_STK_SIZE)START_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 	* )&err);				//存放该函数错误时的返回值,用于保存返回的错误代码。

设置堆栈深度的限制位置->START_STK_SIZE/10: 这个值表示任务的堆栈满溢之前剩余的堆栈容量。例如,指定stk_size 值的10%表示将达到堆栈限制,当堆栈达到90%满就表示任务的堆栈已满。

任务选项->OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR:

//用户可选的任务特定选项
#define OS_OPT_TASK_NONE 		(OS_OPT)(0x0000u) (1)		// 未选择任何选项。
#define OS_OPT_TASK_STK_CHK 	(OS_OPT)(0x0001u) (2)		// 启用任务的堆栈检查。
#define OS_OPT_TASK_STK_CLR		(OS_OPT)(0x0002u) (3)		// 任务创建时清除堆栈。
#define OS_OPT_TASK_SAVE_FP 	(OS_OPT)(0x0004u) (4)		// 保存任何浮点寄存器的内容,这需要CPU硬件的支持,CPU需要有浮点运算硬件与专门保存浮点类型数据的寄存器。
#define OS_OPT_TASK_NO_TLS 		(OS_OPT)(0x0008u) (5)		// 指定任务不需要TLS支持。

一般就选OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR就行了。

  • 创建任务就到这了

三、任务的状态

从用户的角度看,UCOSIII的任务一共有5种状态:

  1. 休眠态: 任务已经在CPU的flash中了,但是还不受UCOSIII管理。
  2. 就绪态: 系统为任务分配了任务控制块,并且任务已经在就绪表中登记,这时这个任务就具有了运行的条件,此时任务的状态就是就绪态。
  3. 运行态: 任务获得CPU的使用权,正在运行。
  4. 等待态: 正在运行的任务需要等待一段时间,或者等待某个事件,这个任务就进入了等待态,此时系统就会把CPU使用权转交给别的任务。
  5. 中断服务态: 当发送中断,当前正在运行的任务会被挂起,CPU转而去执行中断服务函数,此时任务的任务状态叫做中断服务态。
    在这里插入图片描述
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iiinoname/article/details/105173803

智能推荐

JVM内存模型&&垃圾回收_java 堆和 native 堆之间来回复制数据-程序员宅基地

文章浏览阅读189次。概述:虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个new 操作去写对应的delete/free操作,不容易出现内存泄漏和内存溢出问题。正是因为Java程序员把内存控制权利交给Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务运行时数据区域:Java虚拟机在执行Java程序的过程中会把它管理的内存..._java 堆和 native 堆之间来回复制数据

linux 开启审计服务,Linux审计服务Auditd systemctl重启问题解决-程序员宅基地

文章浏览阅读1.5k次。在RHEL7&&CentOS7时代,默认的服务通过systemd控制,并通过systemctl命令完成启停。但是并不是所有的服务都可以完美的通过systemctl来控制,比如今天要提到的Auditd编辑audit.rules添加规则后,当然要通过restart服务来重启生效,但是通过systemctl restart auditd就会报如下错误:[root@abc]# syste..._failed to restart auditd.service: operation refused, unit auditd.service may

设计模式17 - 中介者模式-程序员宅基地

文章浏览阅读259次。作者:billy版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处中介者模式使用场景优缺点注意事项UML结构图代码实现..._中介者模式

【剑指offer】面试题18:树的子结构_{ *t=(bitree )malloc(sizeof(bitnode)); if(!*t) exi-程序员宅基地

文章浏览阅读552次。题目描述:输入两颗二叉树A,B,判断B是不是A的子结构。题目解析:_{ *t=(bitree )malloc(sizeof(bitnode)); if(!*t) exit(-1); (*t)->data

IIS占用CPU%问题排查方案 _排查iis消耗资源语句-程序员宅基地

文章浏览阅读2.6k次。有时候辛辛苦苦写个网站,挂到服务器上一看,CPU给百分百了,这种问题百分之八九十都是因为代码写有问题,而不是因为系统设置的问题,这种问题也比较难排查。但是结合一些工具也可以找到原因的,关于windbg的使用,好像有本关于.net调试的书,大家有兴趣可以看看,网上也有一些帖子,但关于ANTS Profiler的帖子就比较少了,大家也可以下载试用版来帮助解决问题1 准备日志1.1 _排查iis消耗资源语句

Springboot 项目导出word文档(文档内容包括数据以及服务器图片)_项目实体类批量导出到word-程序员宅基地

文章浏览阅读1.4w次。Springboot 项目freemarker导出word文档(文档内容包括数据以及服务器图片)前些天有需求要完成导出word文档功能,基础数据导出word文档,网上也能搜到很多源代码,但是我这边要求是服务器上的图片(只给出服务器图片路径,从服务器得到图片),前前后后加起来就不好内容了,网上并没有找到处理这种的代码和解决方式,只好自己写了,弄完了来记录下,防止以后再用.首先动手之前整理下思..._项目实体类批量导出到word

随便推点

SparkSql中的repartition 与 coalesce_spark sql repartition-程序员宅基地

文章浏览阅读3.9k次。SparkSql的repartition和coalesceSparkSql 写hive小文件后记repartition(numPartitions:Int)和coalesce(numPartitions:Int,shuffle:Boolean=false)作用:对RDD的分区进行重新划分,repartition内部调用了coalesce,参数shuffle为true例:RDD有N个分区,需要..._spark sql repartition

【Android】帧动画(Drawable Animation)_帧动画 一个drawable-程序员宅基地

文章浏览阅读650次。今天总结下帧动画 原理: 对几张图片按照顺序一张一张进行播放,视觉上感觉是连续播放的动画效果。 一.步骤: 1.在res/drawable放入几张图片 2.在res/drawable下新建一个drawable resource file,比如命名为gril_animation.xml,根节点选择animation-list,点击ok 3.编辑gril_animation.xml文件_帧动画 一个drawable

树莓派python交互界面实例_树莓派综合项目2:智能小车(二)tkinter图形界面控制...-程序员宅基地

文章浏览阅读858次。一、介绍树莓派综合项目2:智能小车(一)四轮驱动中,实现了代码输入对四个电机的简单控制,本章将使用Python 的图形开发界面的库——Tkinter 模块(Tk 接口),编写本地运行的图形界面,控制小车的前进后退、转向和原地转圈。Tkinter是Python的标准GUI库,Python使用Tkinter可以快速的创建 GUI 应用程序。由于 Tkinter 是内置到 python 的安装包中、只要..._树莓派 例子 交互

Yarn install报错 【错误: 找不到或无法加载主类 install】_yarn install error: could not find or load main cl-程序员宅基地

文章浏览阅读6.5k次,点赞4次,收藏12次。今天要运行一个项目,首先在初始配置阶段要执行 yarn install 结果出现了下面的报错: 执行 yarn --version报错如下: 执行 yarn version结果如下: 网上查资料的时候看到一篇相关的文章,可以参考解决问题: 这也是我尝试解决问题的思路,这里给出来的说法是,原始的java安装环境里面已经有yarn了,新安装的yarn的环境变量需要放在它前面。 接下来下载yarn,我是在..._yarn install error: could not find or load main class install

CSS实现div竖向排版_div竖着排列-程序员宅基地

文章浏览阅读2.3k次。1.最多显示四行,自动换列 2.均分成3列_div竖着排列

数学系教材推荐-程序员宅基地

文章浏览阅读323次。 解析几何解析几何有被代数吃掉的趋势,不过就数学系的学生而言,还是应该好好学一下,我大一没有好好学,后来学别的课时总感觉哪里有些不太对劲,后来才发现是自己的数学功底尤其是几何得功底没有打好。1吴光磊《解析几何简明教程》高等教育出版社写的简单明了,我基础没有打好,快速翻了一下这本书收获还是不少的。不过打基础的时候还是从下面三本选一本看,把这本当参考书。2《解析几何》丘维声,北京大...

推荐文章

热门文章

相关标签