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

    文章

    2945

    浏览量

    66745
  • ucos2
    +关注

    关注

    0

    文章

    15

    浏览量

    3557
  • 操作系统内核

    关注

    0

    文章

    8

    浏览量

    2369
收藏 人收藏

    评论

    相关推荐

    OMAP5912多媒体处理器初始化参考指南

    电子发烧友网站提供《OMAP5912多媒体处理器初始化参考指南.pdf》资料免费下载
    发表于 12-17 16:20 0次下载
    OMAP5912多媒体处理器<b class='flag-5'>初始化</b>参考指南

    STM32F407 MCU使用SD NAND 不断电初始化失效解决方案

    STM32F407微控制器单元(MCU)与SD NAND的结合提供了强大的存储解决方案。然而,不断电初始化失效问题可能会导致系统稳定性和数据完整性受损。我们将STM32F407与SD NAND集成时可能遇到的初始化问题,并提供专
    的头像 发表于 12-11 10:51 329次阅读
    STM32F407 MCU使用SD NAND 不断电<b class='flag-5'>初始化</b>失效解决方案

    segger编译器初始化问题

    的图; 2.第二张图是该变量在文件中的所有操作,第一行是初始化,该行代码在初始化部分最后一个,执行完就是主循环了; 3.第2,3行也是对变量的赋值,在主循环中; 4.第4行已注释; 5
    发表于 12-09 18:06

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

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

    TMS320C6000 McBSP初始化

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

    视频引擎初始化失败怎么回事

    视频引擎初始化失败是一个常见的技术问题,它可能由多种原因引起,包括软件冲突、硬件问题、驱动程序问题、系统设置错误等。要解决这个问题,需要对可能的原因进行详细的分析和诊断。 1. 软件冲突 1.1
    的头像 发表于 09-18 18:18 1254次阅读

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

    初始化和识别过程: 总线激活后,主机启动卡初始化和识别过程。 初始化过程从SD SEND OP COND (ACMD41)开始,通过设置其操作条件和OCR中的HCS位。HCS (Host
    的头像 发表于 07-22 10:54 365次阅读
    瀚海微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

    使用STM32CubeIDE初始化STM32407的SPI1(PB3)初始化失败的原因?怎么解决?

    使用STM32CubeIDE初始化STM32407的SPI1(PB3)初始化失败,有人知道原因吗?
    发表于 03-25 07:50

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

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

    【鸿蒙】小型系统LiteOS-A内核

    对该芯片架构的支持,这个工作较为复杂,不在这篇文章范围内。 基础适配 LiteOS-A 提供系统运行所需的系统初始化流程和定制配置选项。移植过程中,需要关注
    的头像 发表于 02-29 16:16 1187次阅读
    【鸿蒙】小型<b class='flag-5'>系统</b>LiteOS-A<b class='flag-5'>内核</b>

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

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

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

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

    labview运行后如何初始化

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