Ⅰ、写在前面

学习本文之前可以参考我前面基于STM32硬件平台移植UCOS2的几篇文章,我将其汇总在一起:

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

要想学习,或使用系统配套的资源(如:信号量、消息邮箱、消息队列等),就需要先了解一下系统内核大致的原理,也就是先了解大致,在研究细节的东西(从外到内),本文就是接着前面移植的文章来讲述关于系统内核的知识。

本文主要是结合前面移植好、可以运行的源代码来进行讲述关于最新版本UCOS2系统内部代码。

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

Ⅱ、UCOS操作系统配置

看过我前面移植UCOS的文章,或打开过我移植成功的软件工程,都应该大体知道一个简单的UCOS系统大概需要一些什么配置,包含哪些部分等。

本节将对UCOS软件工程总体的一些知识进行讲述(从大方向来描述一下),也算是对某些知识的再次回顾。

UCOS系统配置就是修改os_cfg.h文件,就是使能或失能某些功能,也就是所谓的系统裁剪

比如:

我们不使能APP应用HOOK函数,则#define OS_APP_HOOKS_EN   0u

如果使能APP应用HOOK函数,  则#define OS_APP_HOOKS_EN   1u

再比如:

我们定义最低优先级(值)为63,则#define OS_LOWEST_PRIO   63u

定义最大数10个任务,则#define OS_MAX_TASKS    10u

其实这里的配置在系统中很多通过预处理(配置了的才编译,未配置不编译)来实现的,也就是直接影响程序编译的大小,所以叫系统裁剪。

我提供(移植完成)的实例里面有很多资源(如:信号量、消息邮箱、消息队列等)都没有实现,所以那些都是失能的(即都配置为0)。

Ⅲ、主函数描述

主函数在裸机程序和操作系统程序中都是有的,也是程序的入口函数,这里大体讲述一下UCOS操作系统主函数中重要的三个函数:

OSInit操作系统初始化

OSTaskCreateExt创建任务

OSStart启动任务

1. OSInit系统初始化

跟踪代码可以知道,这个函数的函数体位于os_core.c文件中。操作系统初始化顾名思义就是对UCOS系统的初始化,其中包含内核与系统资源这些的初始化,如下面代码截图:

从上面截图就可以看得出来,红色框标记的是系统内核必须初始化部分,蓝色框标记是选配(由系统配置决定)。

我们上面说的“系统配置”,在这里就能体现的出来。比如:我蓝色框标记的部分中,没有使能“事件标志”也就是在配置中没有使能使能该选项,那么程序也不会初始化事件标志组。接着的其他选项一样的道理。

2. OSTaskCreateExt创建任务

跟踪代码可以知道,这个函数的函数体位于os_task.c文件中。该函数从命名及意思上可以知道,它就是创建任务的函数。我们使用“扩展版本”创建任务,主要是配置及初始化任务相关的堆栈、优先级、以及检测参数的正确性等,如下面代码截图:

注意:在os_cfg中需要使能“创建任务-扩展”,也就是需要配置:#define OS_TASK_CREATE_EXT_EN  1u

创建任务有两个函数(请看os_task.c文件):

OSTaskCreate基本版本

OSTaskCreateExt扩展版本

扩展版本是在后面升级系统新增加的一个函数,主要是新增加了5个参数(具体请见源代码),但为了使程序兼容以前系统,这后面的系统中也是保留了基本版本的创建任务函数接口。

我在主函数里面创建的任务是“AppTaskStart”,也是“开始任务”,后面的一些关于应用所需的初始化都是在“AppTaskStart”下面创建的,子任务也是基于该函数创建的。

3. OSStart开启任务

跟踪代码可以知道,这个函数的函数体位于os_core.c文件中。在操作系统初始化、任务创建完成之后,调用OSStart就可以开启并执行任务了。

该函数也是属于内核级的,由系统调用,主要包含几步操作:

1.查找最高优先级任务,使其进入就绪;

2.将当前优先级指向就绪任务的最高优先级;

3.执行目标代码,开始任务(OSRunning = OS_TRUE)。

当你初始接触UCOS系统时,先了解它主要的意思是启动任务就行了,至于怎样启动的,需后续研究系统内核这一块,我在后面也会讲述。

Ⅳ、AppTaskStart任务描述

应用程序(任务)的执行可以说就是从AppTaskStart这个函数(在上面main中创建的任务)开始一步一步执行的。

在AppTaskStart函数体里面主要做了三类事情:

1. BSP_Initializes:初始化应用底层一些代码,基本实例就是LED的IO驱动;

2. OSTick_Init:滴答时钟初始化,这个是属于系统,在前面移植的过程中说过由我们自己定义,所以这里需要初始化。

3. OSTaskCreateExt:创建子任务(Demo程序创建了3个子任务)。

为什么在这里还要创建任务呢?

这种写法是参考UCOS官方提供实例代码的写法(在main主函数只创建一个AppTaskStart任务,再在AppTaskStart函数创建子任务、系统资源等)。

当然,这个格式写法不是死的,可根据自己习惯或要求来写。

1. BSP_Initializes

跟踪代码可以知道,这个函数的函数体位于bsp.c文件中。这个函数是我们自己建的文件,我将它归类为“应用程序底层代码初始化”,自己可更加实际情况修改。由于是Demo程序(LED闪烁灯),这里主要是对LED灯IO口的初始化。

2. OSTick_Init

跟踪代码可以知道,这个函数的函数体位于app_cfg.c文件中。这个函数也是我们自己设计的源代码,在前面移植的过程中要求自己初始化系统滴答,这里就需要初始化。当然也可以在UCOS提供的文件“os_cpu_c.c”里面初始化该函数。

系统滴答是系统的心脏,没有它就等于没有心脏。这里需要搭配滴答中断函数(如下图)。

3. OSTaskCreateExt子任务

提供的Demo程序创建了一个开始任务3个子任务,任务都是实现LED闪烁的内容。更加闪烁的频率(亮灭间隔时间)不同,可以区分出不同的任务。

开始任务、子任务1、子任务2、子任务3依次LED亮灭间隔时间加长。是由OSTimeDly函数决定的,OSTimeDly函数是系统延时的意思,它这个延时和我们平常使用的延时相似,但又不同。它在各自的任务了看似属于自身“阻塞延时”了那么长时间,但自系统看来其实是将该任务挂起了那么长时间。

OSTimeDly延时函数属于系统级延时,需要了解系统内核之后对它的理解就容易了。

、实例工程下载

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

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

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

UCOS基于STM32F0系列实例:

https://yunpan.cn/cRCZrQ3dzeVQq  访问密码

 

UCOS基于STM32F1系列实例:

https://yunpan.cn/cRCZxGFsqHa6Q 访问密码

 

UCOS基于STM32F3系列实例:

https://yunpan.cn/cRCZqPRCWs8UW  访问密码

 

UCOS基于STM32F4系列实例:

https://yunpan.cn/cRCZPqbFqXSPR  访问密码

Ⅵ、说明

相关的文章也可以到我博客上查看,我也会定期更新,新内容第一时间在微信分享。

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

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

Ⅶ、最后

更多精彩文章我将第一时间在微信公众号里面分享,对本文有什么疑问可微信留言。

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

UCOS2系统内核讲述_总体描述的更多相关文章

  1. UCOS2系统内核讲述(四)_创建任务

    Ⅰ.写在前面 学习本文之前可以参看我前面的文章: UCOS2_STM32移植详细过程(汇总文章) UCOS2系统内核讲述(一)_总体描述 UCOS2系统内核讲述(二)_初始化调用函数 UCOS2系统内 ...

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

    Ⅰ.写在前面 学习本文之前可以参看我前面的文章: UCOS2_STM32F1移植详细过程(汇总文章) UCOS2系统内核讲述(一)_总体描述 还是按照上一篇文章的思维(从外到内),本文(结合源代码)进 ...

  3. UCOS2系统内核讲述(五)_初始化TCB详情

    Ⅰ.写在前面 学习本文之前可以参看我前面的文章: UCOS2系统内核讲述(四)_创建任务 上一篇文章讲述了关于函数“OSTaskCreateExt”创建任务函数体里面重要一些的内容,本文接着上一张讲述 ...

  4. UCOS2系统内核讲述(三)_TCB任务控制块

    Ⅰ.写在前面 学习本文之前可以参看我前面的文章: UCOS2_STM32F1移植详细过程(汇总文章) UCOS2系统内核讲述(一)_总体描述 UCOS2系统内核讲述(二)_初始化调用函数 上一篇文章讲 ...

  5. Android系统--输入系统(十二)Dispatch线程_总体框架

    Android系统--输入系统(十二)Dispatch线程_总体框架 1. Dispatch线程框架 我们知道Dispatch线程是分发之意,那么便可以引入两个问题:1. 发什么;2. 发给谁.这两个 ...

  6. sloop公共程序之总体描述

    1:功能需求 开发一个公共库文件sloop.c,实现三个常用功能以供其它模块调用.三个功能如下: 功能一:实现一般的信号监听,调用模块只需传入要监听的信号和相应的回调函数就可以在信号到时调用回调函数处 ...

  7. (74)Wangdao.com第十三天_Object 对象_属性描述对象

    Object 对象 JavaScript 原生提供 Object 对象 JavaScript 的所有其他对象都继承自  Object 对象,即那些对象都是Object的实例 Object 对象的原生方 ...

  8. 10.6 android输入系统_Dispatcher线程_总体框架

    图解Android - Android GUI 系统 (5) - Android的Event Input System - 漫天尘沙 - 博客园.htm // 关注里面的Dispatcher处理流程h ...

  9. 8.1 Android灯光系统_总体框架

    1.框架 APP(java语言实现) ------------------------------- JNI(c++语言实现)     向上提供Java执行c函数的接口  向下访问HAL ------ ...

随机推荐

  1. PHP实现双向链表、栈

    前期写过一个PHP实现单向链表.实现排序单向链表的一篇文章,传送门:http://www.cnblogs.com/yydcdut/p/3777760.html.双向链表写过了,再拿出来提一提:http ...

  2. 【前端】javascript判断undefined、null、NaN;字符串包含等

    JS中判断null.undefined与NaN的方法 这篇文章主要介绍了JS中判断null.undefined与NaN的方法,需要的朋友可以参考下 . . 写了个 str ="s" ...

  3. Hive配置与操作实践

    Hive配置与操作实践 @(Hadoop) 安装hive hive的安装十分简单,只需要在一台服务器上部署即可. 上传hive安装包,解压缩,将其配入环境变量. mysql的设置 在要作为元数据库的m ...

  4. CarbonData编译与安装

    原文连接 http://xiguada.org/carbondata_compile/ CarbonData是啥? CarbonData is a fully indexed columnar and ...

  5. C# DataGridView在单元格提示里(ToolTip)显示完整的单元格内容

    当单元格内容太多时,则会忽略后面的内容 解决方案: 添加Dgv鼠标移到单元格事件时,设置当前单元格的ToolTipText属性内容为当前单元格内容 void From_Load(object send ...

  6. scala lambda 小括号与大括号

    看akka源码的时候看到这样的一个用法: 作为接触scala两天半的我有些看不明白了.好一番搜索看到这样的答案: <scala雾中风景(2): 小括号与花括号> 下面的问题,表面上看是小括 ...

  7. mac中使用vi修改二进制文件

    mac中使用vi修改二进制文件 1.首先以二进制方式编辑这个文件vi -b datafile 2.使用xxd转换为16进制:%!xxd 文本看起来像这样: 0000000: 1f8b 0808 39d ...

  8. oracle 存储过程 返回结果集

      oracle 存储过程 返回结果集 CreationTime--2018年8月14日09点50分 Author:Marydon 1.情景展示 oracle存储过程如何返回结果集 2.解决方案 最简 ...

  9. session 防止表单重复提交

    防止表单重复提交应该现在前台做一遍,再在后台做一遍.这样双重安全而且减轻服务器负担. 代码: package flying.form; import java.io.IOException; impo ...

  10. javascript设计模式:构造器模式学习一

    javascript 设计模式1.简介javascript是一种弱类型语言,不过类可以通过函数模拟出来最常见的实现方法如下:function Car(model){ this.model = mode ...