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

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

3天内不再提示

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

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-25 09:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Ⅰ、写在前面

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

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

UCOS2系统内核讲述(一)_总体描述

还是按照上一篇文章的思维(从外到内),本文(结合源代码)进一步深入UCOS系统内核,我会将讲述过的源代码注释修改为中文,提供给大家参考。

上一篇文章总体描述了一下整个工程“外围”的代码,本文将进一步“入围”,进一步讲述OSInit所调用的函数。

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

本文讲述的内容不必深入理解,可以先做个了解。

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

Ⅱ、OSInit所调用的函数

上一篇文章大概讲述了关于该函数的内容,本文将进一步讲述OSInit系统初始化。

我将OSInit所调用的函数分为两类:必须类和非必须类。


必须类:与系统、任务紧密相关的初始化。其实这些初始化就是对变量、结构体等赋予初始值。(如:系统运行标志位初始化暂停运行、最高优先级指向空等)它们的初始化位于系统内核os_core.c里面。

非必须类:这一类就是可以不调用来初始化的一类。从代码可以看他们前面有一个预处理标志位【如:#if (OS_FLAG_EN > 0u) && (OS_MAX_FLAGS > 0u)】,这些标志位位于os_cfg.h(前面说过系统的裁剪),当我们不使用这些功能时,也就是系统裁剪掉了这些功能,它们就不会被初始化。

事件标志组、内存管理、消息队列等这些就属于非必须类,它们的初始化位于自身的.c文件里面(不位于os_core.c)。【如:OS_FlagInit位于os_flag.c文件里面】

下面讲述一下必须类(非必须类在后面结合相关资源讲述):

1.OS_InitMisc(必须类)

这个函数会被OSInit()调用来初始化各项变量。对红色框内参数初始化数值,这些参数是系统必须的变量,类似于我们定义一个全局变量,初始的时候对它进行赋值。


2.OS_InitRdyList(必须类)

这个函数被OSInit()调用来初始化就绪表。这里说的就绪表其实指的是把一个一个任务排列成一个表,要将这个表初始化的意思。要执行响应任务就需要知道任务的优先级、任务控制块、目前指向的任务等一系列信息。


3.OS_InitTCBList(必须类)

这个函数会被OSInit()调用来初始化空闲TCB(任务控制块)。这个初始化函数包含的信息是比较难的,也是系统比较重要的(后面会对TCB进行讲述)。

所谓任务控制块,就是控制任务相关变量数据信息各类的结构体的归类,其结构体里面包含的信息是很多的。

理解TCB就需要对数据结构有一定的熟悉才行。


4.OS_InitEventList(必须类)

这个函数会被OSInit()调用来初始化空闲ECB(事件控制块)。这个函数虽然我把它归类到系统必须类这一块,其实不完全正确。这里所说的事件,其实就是系统相关资源(消息队列、邮箱、信号量、互斥信号量等)的一个或集。在ucos_ii.h中可以看到下面宏定义:

#define OS_EVENT_EN (((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)) || (OS_MBOX_EN > 0u) || (OS_SEM_EN > 0u) || (OS_MUTEX_EN > 0u))

消息队列、邮箱、信号量、互斥信号量等这些资源要被系统所调用,就需要进行初始化。系统把他们定义为事件,而使用是需要调用相关数据,系统就把他们定义为ECB(事件控制块),有点类似于TCB(任务控制块)。


5.OS_InitTaskIdle(必须类)

这个函数会被OSInit()调用来创建空闲任务。这个函数在本节开头截图中没有截取出来(屏幕高度有限),其实这个函数也是属于系统必须初始化的函数。空闲函数其实就是系统把所创建的任务都处理完了,那些都挂起了,或删除了,系统空闲没事做了,它就会来执行这个空闲任务。

空闲任务在统计中起到一定作用,所谓统计,就是我们都知道的CPU占用率,空闲统计的越多,CPU空闲越多,那么CPU占用率就越低。【从CPU使用率应该很容易理解为什么要创建空闲任务】


Ⅲ、实例工程下载

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

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

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

UCOS基于STM32F0系列实例:

https://yunpan.cn/cByHFxCfpaIbh访问密码 4437

UCOS基于STM32F1系列实例:

https://yunpan.cn/cByHum5BStkEK访问密码 00a6

UCOS基于STM32F3系列实例:

https://yunpan.cn/cByHrMmkekIar访问密码 da90

UCOS基于STM32F4系列实例:

https://yunpan.cn/cByHx47jehTgX访问密码 5a04

本文所讲述部分注释修改为中文:

https://yunpan.cn/cMGZKfnVVb2Li访问密码 49c2

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

    关注

    0

    文章

    15

    浏览量

    3696
  • 操作系统内核

    关注

    0

    文章

    8

    浏览量

    2468
  • 调用函数
    +关注

    关注

    0

    文章

    11

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux内核模块的加载机制

    可能会有限制。 接下来是模块的初始化内核会执行模块的初始化函数,通常是用module_init宏定义的函数。这个
    发表于 11-25 06:59

    深入了解系统调用API:探索操作系统底层的关键接口

    ,也无法使用内核函数。当用户进程必须访问内核或使用某个内核函数时,就得使用系统
    的头像 发表于 11-03 09:20 428次阅读

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

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

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

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

    microros rtthread移植初始化rclc_support_init无法通过怎么解决?

    源码分下如下图,代码编译啥的都是正确的 这个初始化函数调用时串口会发出一串数据,数据如下图
    发表于 09-10 07:28

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

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

    GraniStudio:初始化例程

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

    定义IO初始化结构体

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

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

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

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

    系统立即启动保护策略。而界面初始化过程依赖于设备稳定的供电环境和充足的系统资源,当过载保护机制触发时,者的关联被打破,导致界面初始化中断
    的头像 发表于 06-27 09:58 360次阅读

    cyusb3014插入usb2.0接口后,软件调用cyapi.lib中的哪些函数完成初始化、读写操作?

    cyusb3014,插入usb2.0接口后,软件调用cyapi.lib中的哪些函数完成初始化、读写操作?
    发表于 05-29 07:14

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

    电子发烧友网站提供《EE-359:ADSP-CM40x启动时间优化和器件初始化.pdf》资料免费下载
    发表于 01-13 16:33 0次下载
    EE-359:ADSP-CM40x启动时间优化和器件<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 1478次阅读
    STM32F407 MCU使用SD NAND 不断电<b class='flag-5'>初始化</b>失效解决方案

    segger编译器初始化问题

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