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

article/2025/11/8 1:36:48

UCOSIII操作系统

  • UCOSIII操作系统——任务篇(1)创建任务
    • 一、UCOSIII——任务 简介
    • 二、创建任务流程
      • 1、定义任务栈
      • 2、定义任务控制块TCB
      • 3、定义任务主体函数
      • 4、创建任务
    • 三、任务的状态

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转而去执行中断服务函数,此时任务的任务状态叫做中断服务态。
    在这里插入图片描述

http://chatgpt.dhexx.cn/article/UOIANntp.shtml

相关文章

FreeRTOS中taskENTER_CRITICAL()和taskEXIT_CRITICAL()函数运用

以下转载自安富莱电子: http://forum.armfly.com/forum.php 临界段 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断。为确保临界段代码 的执行不被中断,在进入临界段之前须关中断,而临界段代…

OSTaskCreateExt()建立任务

ucosII创建任务的硬性要求: 1.任务必须被创建在多任务启动前或运行的任务中 2.任务不能在ISR(中断)中创建 3.任务必须在死循环中,且不能有返回 OSTaskCreateExt()建立任务 NT8U OSTaskCreateExt (void (*task)(void *pd), …

赢在微点答案专区英语_英语u校园读写2答案unit3,u校园新标准大学英语视听说3单元测试答案搜题公众号...

英语u校园读写2答案unit3,u校园新标准大学英语视听说3单元测试答案搜题公众号,u校园大学英语读写4第一单元答案查题APP更多相关问题A.婴儿期 B.幼儿期 C.学龄前期 D.学龄期 E.青春期关于自我,正确的说法是(…

新视野大学英语视听说第三版答案

Unit 1 Unit 2 Unit 3 Unit 4 Unit 5 Unit 6 Unit 7 Unit 8

视听说教程(第三版)4 quiz 1

视听说教程(第三版)4 quiz 1 Reading Comprehension Section A Passage One Questions 1 to 5 are based on the following passage. We all want to raise kids who are happy and successful, but we often mistakenly think that money is the key …

welearn 视听说1-4

词汇题(55道) 1. You should carefully think over_____ the manager said at the meeting. A. that B. which C. what D. whose 1.选C,考察宾语从句连接词,主句谓语动词think over后面缺宾语,后面的宾语从句谓语动…

使用RemObjects Pascal Script

摘自RemObjects Wiki 本文提供RemObjects Pascal Script的整体概要并演示如何创建一些简单的脚本. Pascal Script包括两个不同部分: 编译器 (uPSCompiler.pas)运行时 (uPSRuntime.pas) 两部分彼此独立.可以分开使用,或通过TPSScript 控件使用他们,这个控件定义在uPSComponent.p…

搭建一个简单的Pascal脚本开发环境

使用innosetup进行打包,涉及到需要编写一些Pascal脚本,所以了解了下Pascal的相关语法。 这里主要介绍如何搭建一个简单的Pascal开发环境。 一、Free Pascal Free Pascal(全称 FPK Pascal)是一个32位和64位专业Pascal编译器。它…

pascal编程语言介绍

Pascal是一种过程式编程语言,由Niklaus Wirth于1968年设计并于1970年发布,并以法国数学家和哲学家Blaise Pascal的名字命名。Pascal可以运行在多种平台上,例如Windows、Mac OS和各种版本的UNIX/Linux。[3] 软件名称 Pascal 软件平台 Windows、…

Free Pascal IDE安装

1. Free Pascal IDE 安装 首先,去 https://www.freepascal.org/download.var 下载Free Pascal IDE。我选择的sourceforge镜像 fpc-3.0.2.i386-win32.exe,下载比较慢,请耐心等待。下载完成后,双击exe文件进行安装&#xf…

[pascal入门]数组

一、本节目标 本节我们将要讲述数组。本节目标: 一维数组二维数组字符数组 二、一维数组 我们通过一个案例来简单的理解数组。班主任要计算班级里面50个同学数学成绩的平均成绩,道理上讲这是一个比较简单的问题,只需要把每个人的成绩加起来除…

linux的pascal语言,pascal语言视频教程 Linux GCC常用命令详解

GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言&#xff0…

vscode 配置 pascal环境

vscode 配置 pascal环境 网上关于配置pascal的教程不太多,我试验了好几个,都没搞对,其中有很多原因吧,最后从较多、较熟悉的c环境开始配置理解,才算是慢慢懂得了这个配置过程,前前后后大概花一个星期&…

信息学竞赛 c语言 pascal,pascal信息学竞赛教程

第一讲: 信息学竞赛讲座:预备知识 计算机语言是计算机软件中非常独特的一部份,它属于系统软件,但又和应用软件息息相关。它的作用是:使人类能够用某些命令、指令去让计算机为人类进行数值、逻辑运算。计算机语言中,只有一种语言是…

Pascal基础教程

第一课 初识Pascal语言 信息学奥林匹克竞赛是一项益智性的竞赛活动,核心是考查选手的智力和使用计算机解题的能力。选手首先应针对竞赛中题目的要求构建数学模型,进而构造出计算机可以接受的算法,之后要写出高级语言程序,上机调试…

【通用学术英语视听说答案】

通用学术英语视听说答案–主编郎曼、侯霞

英语视听说第六版答案

Unit 1 Unit 2 Unit 3 Unit 4 Unit 5 Unit 6 Unit 7 Unit 8

welearn平台答案 大学英语 视听说 综合教程

打开页面 f12 ctrlshiftc 鼠标移动到选项位置 带data-solution的就是答案

u校园新视野英语 视听说 读写

一、软件介绍 主要由浏览器插件的形式实现辅助看课 完全模拟人工操作,自动答题,刷时长 二、软件下载 https://www.lanzous.com/b01hihtxg 打包好的脚本浏览器,打开即用,无需配置 三、主要功能 进入课程后自动寻找未完成的任…

视听说教程(第三版)4 quiz 2

视听说教程(第三版)4 quiz 2 //中文注解都是亲自查阅并打上去的,既是为了完善自己的词库,同时也有助于小伙伴们的阅读与理解 //您的支持是我更新的不竭动力! //希望点个赞或者投个币,支持一下吧&#xff0…