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

news/2024/7/20 13:46:54 标签: 嵌入式, 数据结构与算法, 内存管理

Ⅰ、写在前面

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

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

 

Ⅳ、说明

UCOS相关的文章我会第一时间在微信公众号里面和大家分享,也可以到我博客上查看。

当你掌握UCOS在一种平台上的移植,其他平台移植原理类似,请不要局限某一平台。

以上总结仅供参考,若有不对之处,敬请谅解。

 

Ⅴ、最后

更多精彩文章我将第一时间在微信公众号里面分享,如果不想错过,可以关注我的微信公众号。

本着免费分享的原则,方便大家手机学习知识,定期在微信平台分享技术知识。如果你觉得分享的内容对你有用,又想了解更多相关的文章,请用微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,将有更多精彩内容等着你。

 

转载于:https://www.cnblogs.com/strongerHuang/p/5836432.html


http://www.niftyadmin.cn/n/1652600.html

相关文章

java强制编译通过,如何在编译时强制执行接口 Contract (在C中)?

Background:我们正在为新的嵌入式系统建模固件 . 目前,固件正在使用UML建模,但不会使用UML建模工具的代码生成功能 .目标语言为C(C99,具体) .低功耗(即性能,快速执行)和正确性很重要,但是__70765_,高于其他…

java棋盘覆盖分治法,棋盘覆盖问题 —— 分治法

/*分治法实现棋盘覆盖问题*/#include//tr:棋盘左上角方格的行号 tc:棋盘左上角方格的列号//dr:特殊方格的行号 dc:特殊方法的列号//size:size2的k次方,棋盘规格为2的k次方//tile:L型骨牌的编号,初始值为1int Board[100][100];int tile1;void ChessBoard(…

上海亚商投顾:沪指高开高走涨1.31% 汽车整车板块领涨

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 三大指数今日集体反弹,沪指全天高开高走,深成指、创业板指午后有所回落。中字头及以保险为…

Ueditor设置默认字体

其实很简单,只需要将ueditor.all.js 以及 ueditor.all.min.js 两个文件中的字体改掉即可 修改方法: 在ueditor.all.js中搜索:设置默认字体和字号; 在ueditor.all.min.js中直接搜索:body{margin:8px;font-family:sans-serif;font-s…

(精)数据库分库分表

数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案 数据库分库分表(sharding)系列(四) 多数据源的事务处理 数据库分库分表(sharding)系列(三) 关于使用框架还是自主开发以及sharding实现层面的考量 数据库分库分表(sharding)系…

转:HashMap的工作原理,及笔记

HashMap的工作原理是近年来常见的Java面试题。几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此特殊呢?是因为这道题考察的深度很深。这题经常出现在高级或中高级…

ListView 完全优化 + 多种listitem布局处理

# 百度了下,感觉下面的博客文章还都挺全面的,写的很好,直接分享得了 Android性能优化--Listview优化 - tonycheng93 - 博客园http://www.cnblogs.com/tonycheng93/p/4625513.html#top ListView优化完全解读 - 五年纵情向前 - 博客频道 - CSD…

wamp 两个不同的php.ini

最近在本地开发的windows wamp环境安装一个vld 扩展,碰见一个奇怪的问题,phpinfo() 有 而cli 命令模式里面却没有 最后发现wamp phpinfo()和cli命令模式指向的php.ini 不是同一个文件 C:\wamp\bin\apache\apache2.4.17\bin\php.ini 用于web访问时的配置文…