0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-25 09:39 次阅读

Ⅰ、写在前面

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

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

上一篇文章讲述了关于函数“OSTaskCreateExt”创建任务函数体里面重要一些的内容,本文接着上一张讲述关于“OSTaskCreateExt”函数体里面调用的一个函数“OS_TCBInit”初始化任务控制块,“OS_TCBInit”也是与系统内核紧密相关的一个函数。

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

Ⅱ、OS_TCBInit参数详情

在学习OS_TCBInit之前要明确一下,“OS_TCBInit”和“OS_InitTCBList”(OSInit下面调用的函数),从命名上看上去有点相似,但仔细看一下区别还是可以看到出来的。

“OS_InitTCBList”在前面文章有讲述过(可以看我前面相关的文章),主要是初始化TCB链表。“OS_InitTCBList”函数体内容相关于将TCB链表复位。

本文将的“OS_TCBInit”是在创建任务时初始化一个任务的TCB,要将优先级、堆栈等信息初始化。“OS_TCBInit”函数体内容相当于对任务的TCB里面对应的内容落实到具体的参数上。

可以将“OS_TCBInit”和“OS_InitTCBList”区别比喻如下:

“OS_TCBInit”是将某一个整形变量初始话为0(复位值);

“OS_InitTCBList”是将某一个整形变量赋值为1(具体值);

从main函数跟踪代码可以找到“OS_TCBInit”函数,如下动画:

“OS_TCBInit”函数的每一个参数在函数体源代码上面都有注释(我也将源代码注释修改为中文了,可以下载参看)。


该函数位于“os_core.c”下面;

1.第一个参数prio

prio看过UCOS系统的朋友应该对整个参数不会陌生,它就是任务的优先级。

这个参数是从“OSTaskCreateExt”函数参数中传下来的(原封不动,一样的参数)。

注意:任务的优先级数值越小,它的优先级越高。比如:

Task1优先级是1,Task2优先级是2。则Task1优先级高于Task2的优先级。

2.第二个参数ptos

ptos这个参数和上一篇文章中OSTaskCreateExt创建任务中的ptos一样,是指向栈顶的指针。创建任务中利用“OSTaskStkInit”初始化堆栈得到栈顶的指针psp,将该指针传递给OS_TCBInit函数的参数。

同样说明一下:这个参数和“第三个参数pbos”对应,需要根据栈的增长方向“OS_STK_GROWTH”来决定。

3.第三个参数pbos

pbos这个参数和“第二个参数”一样,是从上一层的OSTaskCreateExt创建任务中的ptob参数意思一样,是指向栈底的指针。

4.第四个参数id

id这个参数不多说,和上文一样的意思。

5.第五个参数stk_size

stk_size这个参数和上一篇文章也是一样,这里再提示一下,它就是堆栈的大小,就是你分配堆栈空间(定义堆栈数组)的大小。

6.第六个参数pext

pext这个参数是指向用户提供的内存(指针)。

这个参数对初学者意义不大,可暂时不用去理解它,你把它理解为扩展使用就是了。

7.第六个参数opt

opt:用户操作选项参数。

上一篇文章已经说的很详细,具体说明见上一篇文章。

到此,细心的会发现,其实“OS_TCBInit”函数的参数基本是继承“OSTaskCreateExt”函数的参数。从这里可以看得出“OS_TCBInit”函数才是创建任务重要的函数。

Ⅲ、OS_TCBInit函数体内容描述

上一章节讲述了“OS_TCBInit”的参数,其实传递进来的参数是保存在TCB链表里面的,用于保存一个任务重要的信息,具体如何实现就要看接下来的函数体说明(建议下载源代码一起参考学习)。

1.第一部分


A.链表节点及参数:

OSTCBFreeList是当前空闲TCB链表,相当于每初始化一个任务就要将OSTCBFreeList指向下一个没有使用的FreeList,保证在每次创建任务的时候有OSTCBFreeList可用。

if (ptcb != (OS_TCB *)0)

这个条件就是上面说的,判断还有没有空闲TCB链表,如果没有空闲TCB链表就会返回“错误”。

OSTCBFreeList = ptcb->OSTCBNext;指向下一个TCB链表。

下面来的就是其它参数赋值(堆栈、优先级、任务状态就绪等)。

B.任务参数:

这里说的任务参数和上一篇文章说的不一样,主要说的是传递下来的参数信息,归位到对应的空间,也就是参数赋值。

ptcb->OSTCBDelReq = OS_ERR_NONE;

这里有一个语句,就是任务可以删除(当我们使能了删除任务功能,在创建任务之后就可以删除创建的任务)。

2.第二部分


A.优先级:

UCOS优先级实现其功能具体的这部分是比较困难的,使用了“优先级表”,而且查找优先级的算法也相对来说比较困难,初学者暂时可以不用考虑,感兴趣的朋友可以网上“UCOS优先级调度算法”。

B.事件:

这个需要结合事件(信号量、消息邮箱等)来讲述,我会在后面讲述UCOS资源的事件中提及相关的信息。

C.性能分析参数:

这个参数可以从注释的意思来理解,“性能分析”意思就是对系统运行的性能,CPU使用率等来理解。前面在讲述OS_TaskIdle空闲任务时就看到,函数体里面有这么一条语句:OSIdleCtr++; 也就是统计空闲任务的计数次数。

3.第三部分


在上面上部分的“准备”工作之后,这剩下的就是“就绪”工作了。

OSTCBInitHook(ptcb);和OSTaskCreateHook(ptcb);这两个函数一般都是成对出现,是用户自己的HOOK函数,用户自己要实现某一些功能就写在这里。

OSTCBPrioTbl[prio] = ptcb; 这条语句将该任务在TCB表中有一个对应的位置。

ptcb->OSTCBNext = OSTCBList;和上面第一部分类似,指向TCB链表。

OSTaskCtr++;任务也有一个统计计数的变量。

Ⅳ、实例工程下载

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

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

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

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

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

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

https://yunpan.cn/ckKeBFx25VIEB访问密码 a9df

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

官网下载(需要账号):

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

360云盘下载:

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 源代码
    +关注

    关注

    96

    文章

    2943

    浏览量

    66592
  • ucos2
    +关注

    关注

    0

    文章

    15

    浏览量

    3550
  • 操作系统内核

    关注

    0

    文章

    8

    浏览量

    2361
收藏 人收藏

    评论

    相关推荐

    基于旋转平移解耦框架的视觉惯性初始化方法

    精确和鲁棒的初始化对于视觉惯性里程计(VIO)至关重要,因为不良的初始化会严重降低姿态精度。
    的头像 发表于 11-01 10:16 58次阅读
    基于旋转平移解耦框架的视觉惯性<b class='flag-5'>初始化</b>方法

    TMS320C6000 McBSP初始化

    电子发烧友网站提供《TMS320C6000 McBSP初始化.pdf》资料免费下载
    发表于 10-26 10:10 0次下载
    TMS320C6000 McBSP<b class='flag-5'>初始化</b>

    瀚海微SD NAND应用之SD协议存储功能描述2 初始化命令

    初始化和识别过程: 总线激活后,主机启动卡初始化和识别过程。 初始化过程从SD SEND OP COND (ACMD41)开始,通过设置其操作条件和OCR中的HCS位。HCS (Host
    的头像 发表于 07-22 10:54 294次阅读
    瀚海微SD NAND应用之SD协议存储功能描述<b class='flag-5'>2</b> <b class='flag-5'>初始化</b>命令

    stm32f4跑ucos+emwin5.16 gui_init()初始化失败的原因?

    我用stm32f4discovery 连了一块ra8875的4.3寸屏幕, ucosii已经移植成功了,但是移植emwin5。16的时候在gui初始化的时候就会进入 HardFault_Handler(); 不知道是什么情况; 单独跑emwin 也能跑,为什么和ucos
    发表于 05-17 12:33

    初始化IO口为外部中断线的时候,最先初始化的会被后初始化的覆盖掉为什么?

    初始化IO口为外部中断线的时候,比如GPIOA6与GPIOB6先后初始化为外部中断,最先初始化的会被后初始化的覆盖掉,不知道是为什么?
    发表于 05-14 08:26

    字符型、指针型等变量等该如何初始化

     对于数值类型的变量往往初始化为0,但对于其他类型的变量,如字符型、指针型等变量等该如何初始化呢?
    的头像 发表于 03-18 11:02 1155次阅读

    MCU单片机GPIO初始化该按什么顺序配置?为什么初始化时有电平跳变?

    GPIO初始化时有时钟配置、模式配置、输出配置、复用配置,那么在编写初始化代码时,到底该按什么顺序执行呢?如果顺序不当那初始化过程可能会出现短暂的电平跳变。
    的头像 发表于 02-22 11:07 1369次阅读
    MCU单片机GPIO<b class='flag-5'>初始化</b>该按什么顺序配置?为什么<b class='flag-5'>初始化</b>时有电平跳变?

    串口初始化一般是初始化哪些内容

    串口初始化是指在使用串口进行数据通信之前,对串口进行一系列的设置和配置,以确保串口能够正常工作。串口初始化的内容主要包括以下几个方面: 串口硬件设置:首先,需要确定要使用的串口是哪一个,通常计算机
    的头像 发表于 01-04 09:39 2954次阅读

    labview运行后如何初始化

    LabVIEW是一款强大的图形编程软件,在运行之前通常需要进行一些初始化操作。本文将详细介绍LabVIEW运行前的初始化过程,并提供了一些常用的初始化方法。 创建新项目: 在LabV
    的头像 发表于 12-28 17:24 2368次阅读

    自动初始化机制原理详解

    自动初始化机制是指初始化函数不需要被显式调用,只需要在函数定义处通过宏定义的方式进行申明,就会在系统启动过程中被执行。这篇文章就来探索一下其中的奥秘, 简单理解其原理!
    的头像 发表于 12-16 09:33 936次阅读
    自动<b class='flag-5'>初始化</b>机制原理详解

    C语言编程时,各种类型的变量该如何初始化

    C语言编程时,各种类型的变量该如何初始化? 在C语言中,每个变量都需要在使用之前进行初始化初始化是为变量分配内存空间并赋予初始值的过程。C语言提供了不同的
    的头像 发表于 12-07 13:53 1079次阅读

    secondary cpu初始化状态设置

    ,用于填写secondary cpu的入口地址。 uboot负责将这块内存的地址写入devicetree中,当内核初始化完成,需要启动secondary cpu时,就将其内核入口地址写到那块内存中
    的头像 发表于 12-05 15:27 938次阅读
    secondary cpu<b class='flag-5'>初始化</b>状态设置

    在ubuntu20.04中如何初始化rosdep

    初始化rosdep 输入以下的命令,先对其初始化一下 sudo rosdep init 如果出现以下界面,那么恭喜你,你可以省下一些麻烦了,直接跳到第7步就行了: 如果出现了以下几种错误,也不要担心
    的头像 发表于 12-01 16:22 824次阅读
    在ubuntu20.04中如何<b class='flag-5'>初始化</b>rosdep

    实战经验 | Keil、IAR、CubeIDE 中变量不被初始化方法

    关键词:不被初始化,编译环境 目录预览 1、前言 2、IAR 实现变量不初始化方法 3、Keil 实现变量不被初始化方法 4、CubeIDE 实现变量不
    的头像 发表于 11-24 18:05 3676次阅读

    MSP430F5529硬件IIC驱动OLED(初始化使用的寄存器)

    MSP430F5529硬件IIC驱动OLED(初始化使用的寄存器)
    发表于 11-24 16:36 1次下载