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

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

3天内不再提示

UCOS2系统内核讲述_ 总体描述

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

扫码添加小助手

加入工程师交流群

Ⅰ、写在前面

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

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

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

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

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

Ⅱ、UCOS操作系统配置

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

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

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


比如:

我们不使能APP应用HOOK函数

则#defineOS_APP_HOOKS_EN0u

如果使能APP应用HOOK函数

则#define OS_APP_HOOKS_EN1u

再比如:

我们定义最低优先级(值)为63

则#defineOS_LOWEST_PRIO63u

定义最大数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访问密码 e73f

UCOS基于STM32F1系列实例:

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

UCOS基于STM32F3系列实例:

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

UCOS基于STM32F4系列实例:

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

本文是基于上面修改部分注释为中文:

https://yunpan.cn/cM6tNgShDuj5Y 访问密码 889e

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

    关注

    30

    文章

    4983

    浏览量

    74534
  • HOOK
    +关注

    关注

    0

    文章

    15

    浏览量

    8862
  • ucos2
    +关注

    关注

    0

    文章

    15

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    openKylin受邀参加Linux内核领域顶级技术峰会

    近日,Linux内核领域顶级技术峰会——LSF/MM/BPF 2026在克罗地亚萨格勒布举行。大会聚焦Linux内核存储、文件系统、内存管理以及BPF等关键技术方向,吸引了来自全球开源社区、Linux
    的头像 发表于 05-14 11:08 533次阅读

    西格电力微电网总体架构设计:分层分布式控制体系构建

    随着分布式新能源规模化渗透、负荷需求多元化升级,微电网作为整合“源、储、荷、网”多单元的新型能源系统,其安全稳定、高效经济运行的核心诉求,对总体架构设计与控制体系提出了更高要求。微电网总体架构是
    的头像 发表于 03-31 11:44 615次阅读
    西格电力微电网<b class='flag-5'>总体</b>架构设计:分层分布式控制体系构建

    如何为 Vision Five 2 编译自定义 Linux 内核

    Vision Five 2 的 Debian 用户指南只提供了半页关于如何编译自己的内核的相当稀疏的内容。仅从该文档中,我无法制作我的自定义内核。那里的信息似乎相当不完整。如果有人能提供一些
    发表于 02-24 07:44

    Linux内核伙伴系统内存申请函数详解:从原理到实战

    在 Linux 内核中,内存管理是整个系统稳定运行的基石,而伙伴系统(Buddy System) 作为内核物理内存分配的核心机制,更是驱动开发、内核
    的头像 发表于 02-10 16:58 3771次阅读
    Linux<b class='flag-5'>内核</b>伙伴<b class='flag-5'>系统</b>内存申请函数详解:从原理到实战

    深入理解设备树chosen节点:固件与内核的“配置桥梁”

    在嵌入式 Linux 开发中,设备树(Device Tree)是连接硬件与内核的关键纽带。但有一个节点很特殊 —— 它不描述任何硬件模块,却直接决定内核能否正常启动,这就是chosen节点。
    的头像 发表于 02-09 16:36 368次阅读
    深入理解设备树chosen节点:固件与<b class='flag-5'>内核</b>的“配置桥梁”

    Linux内核bug狩猎指南:从栈跟踪到修复,官方文档教你搞定系统核心故障

    内核是 Linux 系统的 “心脏”—— 一旦它出 bug,小则功能异常,大则系统崩溃、死机。但内核 bug 往往藏在百万行代码中,想快速定位、修复绝非易事。
    的头像 发表于 02-06 16:59 3403次阅读
    Linux<b class='flag-5'>内核</b>bug狩猎指南:从栈跟踪到修复,官方文档教你搞定<b class='flag-5'>系统</b>核心故障

    Linux系统内核参数调优实战指南

    Linux 内核参数调优是系统性能优化的核心环节。随着云原生架构的普及和硬件性能的飞速提升,默认的内核参数配置往往无法充分发挥系统潜力。在高并发 Web 服务、大数据处理、容器化部署等
    的头像 发表于 01-28 14:27 849次阅读

    【「Linux 设备驱动开发(第 2 版)」阅读体验】+读深入理解Linux内核内存分配

    ,目前4KB是广泛使用的页大小。在Linux操作系统中,每个进程甚至内核本身都被分配了地址空间,这是处理器的虚拟地址空间的一部分,内核和进程都不处理物理地址,物理地址由MMU处理。 虚拟地址空间被拆分
    发表于 01-16 20:05

    【「Linux 设备驱动开发(第 2 版)」阅读体验】Linux内核开发基础

    感谢电子发烧友论坛提供的《Linux设备驱动开发(第2版)》阅读机会,测评将从Linux内核开发基础、Linux内核平台抽象和设备驱动程序、发挥硬件潜力以及嵌入式领域内的多种内核子系统
    发表于 01-12 22:45

    【「Linux 设备驱动开发(第 2 版)」阅读体验】+读内核处理的核心辅助函数

    上周收到《Linux 设备驱动开发(第 2 版)》书籍,这是一本介绍Linux内核开发的指导性书籍。全面了解Linux内核所提供的一些接口函数,是一位Linux设备驱动开发从业者所必备的知识点。书籍
    发表于 01-10 22:08

    ElfBoard嵌入式教育科普|Linux系统I/O接口:Open函数详解

    1.函数概述open()是Linux/Unix内核提供的底层系统调用,核心功能是打开或创建文件。成功调用后,内核会返回一个整型的文件描述符作为该文件的句柄,后续的所有读写操作都基于此
    的头像 发表于 12-29 11:41 1398次阅读
    ElfBoard嵌入式教育科普|Linux<b class='flag-5'>系统</b>I/O接口:Open函数详解

    ucos与freertos哪个好?

    选择uCOS或FreeRTOS取决于项目的具体需求和资源限制。 FreeRTOS的优点包括: 更小的内核ROM和RAM占用,特别是在RAM方面,适合资源受限的嵌入式系统。 支持协程
    发表于 12-05 07:13

    Linux内核模块的加载机制

    使用insmod或modprobe命令来加载模块。insmod是直接加载,而modprobe会处理依赖关系。 2、如何工作 那内核模块具体是怎么工作的呢?当执行insmod时,会调用系统调用
    发表于 11-25 06:59

    飞凌嵌入式ElfBoard-系统IO接口之刷新内核缓冲

    、权限等等信息,这里统称为文件的元数据,这些信息也是存储在磁盘设备中的。1)头文件#include 2)函数原型int fsync(int fd);3)参数fd:表示要操作文件的文件描述符。4)返回值若
    发表于 11-04 08:59

    强实时运动控制内核MotionRT750(一):驱动安装、内核配置与使用

    强实时运动控制内核MotionRT750的驱动安装与内核配置
    的头像 发表于 07-03 15:48 3969次阅读
    强实时运动控制<b class='flag-5'>内核</b>MotionRT750(一):驱动安装、<b class='flag-5'>内核</b>配置与使用