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

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

    关注

    95

    文章

    2929

    浏览量

    66064
  • ucos2
    +关注

    关注

    0

    文章

    15

    浏览量

    3528
  • 操作系统内核

    关注

    0

    文章

    8

    浏览量

    2349
收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

    labview运行后如何初始化

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

    自动初始化机制原理详解

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

    secondary cpu初始化状态设置

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

    OP-TEE的内核初始化函数调用

    generic_boot_init_primary函数内容 generic_boot_init_primary函数是OP-TEE建立系统运行环境的入口函数,该函数会进行建立线程运行空间、初始化
    的头像 发表于 11-02 18:18 357次阅读
    OP-TEE的<b class='flag-5'>内核</b><b class='flag-5'>初始化</b>函数调用

    ST7789屏幕初始化的步骤

    st7789的屏幕构建系统和配置 驱屏就是初始化 DC转换和cs
    的头像 发表于 10-16 09:27 2570次阅读

    SD卡初始化及读取程序

    电子发烧友网站提供《SD卡初始化及读取程序.pdf》资料免费下载
    发表于 10-13 09:50 2次下载
    SD卡<b class='flag-5'>初始化</b>及读取程序

    STM32只初始化SPIMOSI不初始化SPICLK可以用吗?

    STM32只初始化SPIMOSI,不初始化SPICLK,可以用么
    发表于 09-21 06:36

    STM32H7双核CM4作为Master初始化系统

    电子发烧友网站提供《STM32H7双核CM4作为Master初始化系统.pdf》资料免费下载
    发表于 09-20 09:13 0次下载
    STM32H7双核CM4作为Master<b class='flag-5'>初始化</b><b class='flag-5'>系统</b>

    求分享M0518系统时钟的初始化程序

    那个有M0518系统时钟寄存器版本的初始化程序,库函数的太大了, 系统时钟实现的功能是使用外部晶振而不是内部
    发表于 08-22 07:00

    rt-thread线程栈初始化参数分析

    RT-Thread 在线程初始化的代码内有一段初始化线程堆栈的代码
    的头像 发表于 08-14 16:50 997次阅读
    rt-thread线程栈<b class='flag-5'>初始化</b>参数分析

    CPU CACHE策略的初始化

    build_mem_type_table()函数的功能是获取当前CPU的CACHE类型,据此初始化mem_type。
    的头像 发表于 06-05 15:03 894次阅读
    CPU CACHE策略的<b class='flag-5'>初始化</b>

    PyTorch教程6.4之惰性初始化

    电子发烧友网站提供《PyTorch教程6.4之惰性初始化.pdf》资料免费下载
    发表于 06-05 11:52 0次下载
    PyTorch教程6.4之惰性<b class='flag-5'>初始化</b>