UCOS2系统内核讲述(四)_创建任务

Ⅰ、写在前面

学习本文之前可以参看我前面的文章:

UCOS2_STM32移植详细过程(汇总文章)

UCOS2系统内核讲述_总体描述

UCOS2系统内核讲述(二)_初始化调用函数

UCOS2系统内核讲述(三)_TCB任务控制块

上一篇文章讲述了关于TCBTask Control Block)任务控制块数据结构体的内容。本文学习与应用、也与系统内核紧密相关的一个函数“OSTaskCreateExt”创建任务

OSTaskCreateExt这个函数是我们的应用程序所调用的函数,在我们所移植的软件工程中,main函数就调用了OSTaskCreateExt函数,显而易见,理解它的功能及其参数是多么重要。

本文还是结合前面移植好、可以运行的源代码(可直接下载运行的程序)来进行讲述关于最新版本UCOS2系统内核部分代码(围绕源代码来讲述)。

关于本文的更多详情请往下看。

Ⅱ、OSTaskCreateExt参数详情

创建任务的函数有两个:

OSTaskCreate:以前老版本UCOS系统创建任务的函数,有4个参数

OSTaskCreateExt:新版本UCOS系统,在“OSTaskCreate”的基础上增加了一些功能参数,有9个参数。其中4个参数是和老版本一样(为了兼容老版本)。在新版本的UCOS系统上,我们一般都使用这个函数创建任务,因此,下面我们讲述“OSTaskCreateExt”函数中每一个参数的意思。

下面截图是截取os_task.c文件,在OSTaskCreateExt函数上面有关于每一个参数的注释(我在源代码中已经把主要意思修改为中文了,结合main函数传递的参数理解):

1.第一个参数task

task从命名上可以理解到,他的意思就是“任务”。

【代码的命名很重要,不管是函数名还是变量名。好程序的命名一般都是比较规范的,理解起来自然也就不费劲。】

这个参数是一个指向(参数为“void *p_arg”,返回值为“void”的函数)的指针。简单一点就是指向函数的指针。因此。传递的参数是一个函数。

在main.c调用OSTaskCreateExt中我们传递的参数是“AppTaskStart”,就是我们应用程序的名字。

2.第二个参数p_arg

p_arg传递参数的指针,是一个任意类型的参数。

当我们需要传递某些参数给函数时,就可以通过该参数进行传递。

在main.c调用OSTaskCreateExt中我们传递的参数是“(void*) 0”,也就是传递一个“空指针”给函数(因为我们没有参数,就传递一个空指针)。

3.第三个参数ptos

ptos:指向任务堆栈栈顶的指针。

这个参数和“第六个参数pbos”对应,需要根据栈的增长方向“OS_STK_GROWTH”来决定。具体见os_cpu.h文件中OS_STK_GROWTH的宏定义,如下图:

由于我们定义OS_STK_GROWTH为1,增长方向是从高地址低地址增长,因此,在main.c调用OSTaskCreateExt中我们传递的参数是“TaskStartStk[TASK_START_STK_SIZE - 1]”,也就是栈的高地址为栈顶。

4.第四个参数prio

prio:任务的优先级。

这个参数很好理解,前面也讲述过,优先级具有唯一性,优先级决定该任务指向的优先权利(优先级数值越低,优先级越高)。

我们创建的四个任务中传递的参数分别宏定义如下图:

主任务优先级最高(最先执行),其他三个次任务优先级依次降低。

5.第五个参数id

id:任务的ID。

这个参数比较简单,也就是给每一个创建的任务分配一个ID编号。相当于一篇文章每一章节都有编号的意思。

我们在创建的任务中以“优先级”作为编号,所以在参数中,我们看到连续两个参数都是“优先级”。

6.第六个参数pbos

pbos:指向任务堆栈栈底的指针。

这个参数结合“第三个参数ptos”理解,类似的原理,和栈的增长方向“OS_STK_GROWTH”有关。

根据栈的增长方向“OS_STK_GROWTH”为从高地址低地址增长,所以,在main.c调用OSTaskCreateExt中我们传递的参数是TaskStartStk[0].

7.第七个参数stk_size

stk_size:任务堆栈大小。

这个参数与app_cfg.c文件中定义的“堆栈变量”有关,我们需要传递的大小就是堆栈数组的大小值。

8.第八个参数pext

pext: 指向用户提供的内存(指针)。

这个参数是用作 TCB 扩展的参数,初学者使用不到这个参数,暂时可以不用去理解。

9.第九个参数opt

opt: 用户操作选项参数。

这个参数用户创建任务时需要处理一些额外信息(操作)的参数。【这个参数比较重要,会处理一些信息,在下一章节重点讲述一下关于该参数调用的“OS_TaskStkClr”】

Opt参数在创建任务是主要的三个,在OSTaskCreateExt函数体上面的注释中已经提出来了,如下图:

OS_TASK_OPT_STK_CHK:检测参数是否可用

OS_TASK_OPT_STK_CLR:清除堆栈(清除创建任务时使用的堆栈)

OS_TASK_OPT_SAVE_FP:保存浮点指针(在进行上下文切换时)

参数是宏定义在ucos_ii.h中,如下图:

也就是调用了某一个宏定义,那个宏定义的功能就使能了。

在main.c调用OSTaskCreateExt中我们传递的参数是“OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR”,进行参数检查堆栈清除

Ⅲ、创建任务时的堆栈

创建任务的函数体中有几个函数是比较重要的,本姐讲述下图中红色标记函数(蓝色部分是重点,在下一篇文章重点讲述):

1.OS_TaskStkClr

OS_TaskStkClr:创建任务时清除堆栈。

这个函数需要在os_cfg.h使能OS_TASK_STAT_STK_CHK_EN这个参数。

在上面截图中可以看到opt参数选项需要使能:OS_TASK_OPT_STK_CHKOS_TASK_OPT_STK_CLR,也就是参数检查堆栈清除

清除栈的顺序与栈的增长方向有关。看到源代码就知道清除堆栈,其实就是在初始时清空一下堆栈空间。

2.OSTaskStkInit

OSTaskStkInit:初始化创建任务的堆栈。

这个函数位于os_cpu_c.c文件中,前面移植UCOS时提到了一下该函数。

从源代码中可以看得出来,其实这个函数主要的一个参数就是“ptos”栈顶,我们需要分配并保存堆栈。

Ⅳ、实例工程下载

笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。

笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。

我将最新UCOS2.92操作系统移植到F0、F1、F3、F4各个硬件平台上,可以根据你芯片系列选择下载。

UCOS基于STM32F0F1、F3、F4系列实例工程源代码(汇总)

https://yunpan.cn/cM9Fjv88cXbjI  访问密码 048d

 

本文讲述的部分注释修改为中文(软件工程源代码):

https://yunpan.cn/cMIv8haYBL73y  访问密码 e07e

基于STM32平台的UCOS源代码工程(官方原始软件工程)

官网下载(需要账号):

https://www.micrium.com/downloadcenter/download-results/?searchterm=hm-stmicroelectronics&supported=true

360云盘下载:

https://yunpan.cn/cM9Gzv4drXqxv  访问密码 c82c

、说明

UCOS相关的文章我会第一时间在微信公众号里面和大家分享,也可以到我博客(blog.csdn.net/ybhuangfugui)上查看。

当你掌握UCOS在一种平台上的移植,其他平台移植原理类似,请不要局限某一平台。

以上总结仅供参考,若有不对之处,敬请谅解。

Ⅵ、最后

更多精彩文章我将第一时间在微信公众号里面分享,如果不想错过,可以关注我的微信公众号。

本着免费分享的原则,方便大家手机学习知识,定期在微信平台分享技术知识。如果你觉得分享的内容对你有用,又想了解更多相关的文章,请用微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,将有更多精彩内容等着你。

时间: 2024-10-15 09:29:12

UCOS2系统内核讲述(四)_创建任务的相关文章

UCOS2系统内核讲述(五)_初始化TCB详情

Ⅰ.写在前面 学习本文之前可以参看我前面的文章: UCOS2系统内核讲述(四)_创建任务 上一篇文章讲述了关于函数“OSTaskCreateExt”创建任务函数体里面重要一些的内容,本文接着上一张讲述关于“OSTaskCreateExt”函数体里面调用的一个函数“OS_TCBInit”初始化任务控制块,“OS_TCBInit”也是与系统内核紧密相关的一个函数. 关于本文的更多详情请往下看. Ⅱ.OS_TCBInit参数详情 在学习OS_TCBInit之前要明确一下,“OS_TCBInit”和“O

UCOS2系统内核讲述(二)_初始化调用函数

Ⅰ.写在前面 学习本文之前可以参看我前面的文章: UCOS2_STM32F1移植详细过程(汇总文章) UCOS2系统内核讲述(一)_总体描述 还是按照上一篇文章的思维(从外到内),本文(结合源代码)进一步深入UCOS系统内核,我会将讲述过的源代码注释修改为中文,提供给大家参考. 上一篇文章总体描述了一下整个工程“外围”的代码,本文将进一步“入围”,进一步讲述OSInit所调用的函数. 本文还是结合前面移植好.可以运行的源代码来进行讲述关于最新版本UCOS2系统内核部分代码(围绕源代码来讲述).

UCOS2系统内核讲述(三)_TCB任务控制块

Ⅰ.写在前面 学习本文之前可以参看我前面的文章: UCOS2_STM32F1移植详细过程(汇总文章) UCOS2系统内核讲述(一)_总体描述 UCOS2系统内核讲述(二)_初始化调用函数 上一篇文章讲述了关于OSInit函数体中几个关于系统内核重要的函数,本文将针对上一篇文章中OS_InitTCBList(初始化任务控制块)函数重点讲述一下TCB(Task Control Block)任务控制块. TCB任务控制块是用来记录任务的堆栈指针.任务的当前状态.任务的优先级别等一些与任务有关属性的一个

UCOS2系统内核讲述_总体描述

Ⅰ.写在前面 学习本文之前可以参考我前面基于STM32硬件平台移植UCOS2的几篇文章,我将其汇总在一起: UCOS2_STM32F1移植详细过程(汇总文章) 要想学习,或使用系统配套的资源(如:信号量.消息邮箱.消息队列等),就需要先了解一下系统内核大致的原理,也就是先了解大致,在研究细节的东西(从外到内),本文就是接着前面移植的文章来讲述关于系统内核的知识. 本文主要是结合前面移植好.可以运行的源代码来进行讲述关于最新版本UCOS2系统内部代码. 关于本文的更多详情请往下看. Ⅱ.UCOS操

多线程_创建线程_继承Thread类

public class ThreadDemo {   public static void main(String[] args){         Demo d = new Demo();   d.start();      for(int i = 0;i < 100;i++){      System.out.println("MainThread" + i);   }   } } class Demo extends Thread {   public void run(

数据结构课程设计题目四_二叉树

本文出自:http://blog.csdn.net/svitter 题目4:二叉树 给出一颗无线的二叉树.树的每一个结点用一整数对标识.二叉树构造如下 树根被标识为(1, 1): 如果一个结点被标识为(a, b), 则其左孩子被标识为(a+b,b),右孩子被标识为(a, a+b).现在给出某一结点(a, b),求树根到该结点的最短路径,并且同时求出从树根出发向左走和向右走的次数.建议完成人数1人. 注:此处使用了STL_stack库函数,是不允许的,我图方便. //===============

java提高篇(四)_理解java的三大特性之多态 转自 http://cmsblogs.com

多态就是指程序中定义 的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该 引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定.因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让 引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个 运行状态,这就是多态性 一. 向上转型

AngularJS进阶(四十)创建模块、服务

AngularJS进阶(四十)创建模块.服务 学习要点 使用模块构架应用 创建和使用服务 为什么要使用和创建服务与模块? 服务允许你打包可重用的功能,使之能在此应用中使用. 模块允许你打包可重用的功能,使之能跨应用使用. 一.应用程序模块化 先看看一个没有模块化的程序 <!DOCTYPE> <!-- use module --> <html ng-app="exampleApp"> <head> <title>Angluar

TCP并发服务器(四)&mdash;&mdash;预创建子进程,accept互斥锁

1.说明 Posix文件上锁可移植到所有Posix兼容系统,但是涉及到文件系统操作,可能比较费时. 本次使用线程上锁保护accept,这不仅适用于同一进程中各线程之间上锁,也适用于不同进程之间上锁. 2.进程间使用互斥锁要求 (1) 互斥锁变量必须存放在由所有进程共享的内存去. (2) 必须告知线程函数库这是在不同进程之间共享的互斥锁.要求线程支持PTHREAD_PROCESS_SHARED属性.默认属性PTHREAD_PROCESS_PRIVATE, 只允许在单个进程内使用.   3.代码 支