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

    文章

    2953

    浏览量

    69657
  • ucos2
    +关注

    关注

    0

    文章

    15

    浏览量

    3696
  • 操作系统内核

    关注

    0

    文章

    8

    浏览量

    2468
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    串口通信基石:Air8000下Modbus RTU串口初始化详解!

    串口初始化是Modbus RTU通信稳定可靠的关键起点。本篇深入剖析Air8000开发板串口参数配置、初始化代码实现及调试要点,结合master_rtu示例,分享实际操作中的经验与避坑指南,让您
    的头像 发表于 10-28 16:33 1440次阅读
    串口通信基石:Air8000下Modbus RTU串口<b class='flag-5'>初始化</b>详解!

    NVMe高速传输之摆脱XDMA设计34:初始化功能验证与分析2

    系统模型中, 待测设计应能够正确地配置桥设备模型和 NVMe 设备模型的配置空间。 图2 PCIe 初始化测试仿真波形一 PCIe 初始化开始执行后, 首先配置位于总线号 0, 设
    发表于 10-09 11:31

    NVMe高速传输之摆脱XDMA设计33:初始化功能验证与分析

    BAR 空间。(1) 系统初始化功能测试结果系统初始化正常功能仿真波形如图1所示, 系统初始化
    发表于 10-08 08:02

    GraniStudio:IO初始化以及IO资源配置例程

    IO资源配置.gsp文件,点击打开,完成导入。 2.功能说明 实现连接格拉尼控制器IO块以及配置输入输出IO点。 2.1通过初始化IO算子连接格拉尼控制器IO块,导入工程自动进行连接。 2.2 通过IO配置算子输出配置的IO表。 第一次使用GS软件时操作步骤如下: (1)
    的头像 发表于 08-22 17:34 746次阅读
    GraniStudio:IO<b class='flag-5'>初始化</b>以及IO资源配置例程

    GraniStudio:初始化例程

    1.文件运行 导入工程 双击运行桌面GraniStudio.exe。 通过引导界面导入初始化例程,点击导入按钮。 打开初始化例程所在路径,选中初始化.gsp文件,点击打开,完成导入。 2
    的头像 发表于 08-22 16:45 705次阅读
    GraniStudio:<b class='flag-5'>初始化</b>例程

    MCU外设初始化:为什么参数配置必须优先于使能

    在微控制器领域,初始化参数配置阶段至关重要。此时,虽无电源驱动,但微控制器在使能信号到来前,借初始化参数配置这一精细步骤,开启关键准备进程。初始化参数配置如同物理坐标锚定、逻辑指令部署、内在秩序预设
    的头像 发表于 08-13 10:38 569次阅读

    定义IO初始化结构体

    由上述IOPORT相关功能的枚举类型我们可以知道,在对IOPORT模块进行初始化时需要根据情况配置它们。因此我们定义一个IOPORT初始化的结构体类型IOPORT_Init_t,它的成员包括了由上述所有枚举类型所声明的变量,因此该结构体类型的变量可以包含IOPORT的相关
    的头像 发表于 07-16 16:26 1107次阅读

    NVMe高速传输之摆脱XDMA设计之七:系统初始化

    直接采用PCIe实现NVMe功能,它的系统初始化流程主要分为链路训练、PCIe 初始化和 NVMe 初始化, 分别实现 PCIe链路连接、 PCIe 设备枚举配置和 NVMe 设备配置
    发表于 07-04 09:14

    IM 系列设备过载保护机制下界面初始化中断的底层逻辑与解决方案

    一、过载保护机制与界面初始化的关联基础 IM 系列设备的过载保护机制是保障设备安全运行的核心功能,其通过传感器实时采集设备运行参数,如电流、电压、温度、系统资源占用率等。一旦这些参数超出预设阈值
    的头像 发表于 06-27 09:58 367次阅读

    STM32CubeMX用于STM32配置和初始化C代码生成

    电子发烧友网站提供《STM32CubeMX用于STM32配置和初始化C代码生成.pdf》资料免费下载
    发表于 02-26 17:32 678次下载

    EE-359:ADSP-CM40x启动时间优化和器件初始化

    电子发烧友网站提供《EE-359:ADSP-CM40x启动时间优化和器件初始化.pdf》资料免费下载
    发表于 01-13 16:33 0次下载
    EE-359:ADSP-CM40x启动时间优化和器件<b class='flag-5'>初始化</b>

    EE-88:使用21xx编译器在C中初始化变量

    电子发烧友网站提供《EE-88:使用21xx编译器在C中初始化变量.pdf》资料免费下载
    发表于 01-13 15:54 0次下载
    EE-88:使用21xx编译器在C中<b class='flag-5'>初始化</b>变量

    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 1481次阅读
    STM32F407 MCU使用SD NAND 不断电<b class='flag-5'>初始化</b>失效解决方案

    segger编译器初始化问题

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