uC/OS-II系统1_内核总体描述

目录: 一、uC/OS-II系统配置 二、主函数描述 1. OSInit系统初始化 2. OSTaskCreateExt创建任务 3. OSStart开启任务 三、AppTaskStart任务描述 1. BSP_Initializes 2. OSTick_Init 3. OSTaskCreateExt子任务 四、附录 1、术语 ---------------------------------------- uC/OS-II系统1_内核总体描述 uC/OS-II系统2_初始化调用函数 uC/OS-II系统3_任务就绪表操作 uC/OS-II系统4_TCB任务控制块 uC/OS-II系统5_初始化TCB详情 uC/OS-II系统6_创建任务 uC/OS-II系统7_任务调度概述 uC/OS-II系统7_任务调度源码 uC/OS-II系统8_总览搜索百度网盘“uCOS-II原理 任哲--PPT” --------------------------------------------------------------------------------------------------------------------------- 一、uC/OS-II系统配置

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

uC/OS-II系统1_内核总体描述

比如:

不使能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

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

---------------------------------------------------------------------------------------------------------------------------

二、主函数描述

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

OSInit系统初始化

OSTaskCreateExt创建任务

OSStart启动任务

uC/OS-II系统1_内核总体描述

----------------------------------------------

1. OSInit系统初始化

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

uC/OS-II系统1_内核总体描述

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

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

----------------------------------------------

2. OSTaskCreateExt创建任务

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

uC/OS-II系统1_内核总体描述

注意:在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)。

uC/OS-II系统1_内核总体描述

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

---------------------------------------------------------------------------------------------------------------------------

三、AppTaskStart任务描述

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

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

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

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

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

uC/OS-II系统1_内核总体描述

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

这种写法是参考uC/OS官方提供实例代码的写法(在main主函数只创建一个AppTaskStart任务,再在AppTaskStart函数创建子任务、系统资源等)。当然,这个格式写法不是死的,可根据自己习惯或要求来写。

----------------------------------------------

1. BSP_Initializes

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

----------------------------------------------

2. OSTick_Init

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

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

uC/OS-II系统1_内核总体描述


 

uC/OS-II系统1_内核总体描述

----------------------------------------------

3. OSTaskCreateExt子任务

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

uC/OS-II系统1_内核总体描述

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

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

strongerHuang - 博客园

---------------------------------------------------------------------------------------------------------------------------

四、附录

1、术语 TCB(Task Control Block)任务控制块,来自“uC/OS-II系统3_任务就绪表操作” ECB(Event Control Block)事件控制块 SoftWareInterrupt=SWI  //软中断,来自“uC/OS-II系统7_任务调度源码
---------------------------------------------------------------------------------------------------------------------------
上一篇:uC/Modbus 用户手册——第七节 RTOS接口


下一篇:2021-09-09