嵌入式实时操作系统uC/OS-II概述
嵌入式实时操作系统uC/OS-II概述
一、 uC/OS-II是一种小型的嵌入式操作系统,它只提供了任务管理,任务通信同步和简单的存储管理三项基本功能。
二、 uC/OS-II作为一个微内核,它只对计算机的处理器和硬件时钟进行了抽象和封装,而没有提供其他的硬件抽象层(HAL)。在移植uC/OS-II时,其主要工作就是根据具体硬件换一个或添加一个硬件抽象层。
三、 uC/OS-II是基于优先级的可剥夺型内核,系统中的所有任务都有一个唯一的优先级别,它适合应用在实时性要求较强的场合。
四、 uC/OS-II的文件结构
a)与应用程序相关的文件
1)INCLUDES.H
INCLUDES.H是uC/OS-II的主头文件,在每个.C文件中都要包含这个文件。也就是说在.C文件的头文件应有如下语句。
#include "includes.h"
INCLUDES.H文件的内容为:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <setjmp.h>
#include "/software/ucos-ii/ix86l/os_cpu.h" //与应用程序相关
#include "os_cfg.h"//与应用程序相关
#include "/software/blocks/pc/source/pc.h"//与应用程序相关
#include "/software/ucos-ii/source/ucos_ii.h"//与应用程序相关
从文件的内容可看到,这个文件把工程项目中应包含的头文件都集中到了一起,使得开发者无须再去考虑项目中的每一个文件究竟应该需要或者不需要哪些头文件了。
2)OS_CFG.H
OS_CFG.H是配置文件。uC/OS-II是依靠编译时的条件编译来实现软件系统的裁剪性的,即把用户可裁剪的代码段写在#if和#endif预编译指令之间,在编译时根据#if预编译指令后面常数的值来确定是否该代码段进行编译。
此外,配置文件OS_CFG.H还包括与项目相关的其他一些常数的设置。
配置文件OS_CFG.H就是为用户设置上述的这些常数值的文件。当然在这个文件中对所有配置常数事先都预制一些默认值,用户可根据需要对这些预设值进行修改。
内容如下:
#define OS_MAX_EVENTS 2 /* Max. number of event control blocks in your application ... */
/* ... MUST be >= 2 */
#define OS_MAX_MEM_PART 2 /* Max. number of memory partitions ... */
/* ... MUST be >= 2 */
#define OS_MAX_QS 2 /* Max. number of queue control blocks in your application ... */
/* ... MUST be >= 2 */
#define OS_MAX_TASKS 11 /* Max. number of tasks in your application ... */
/* ... MUST be >= 2 */
#define OS_LOWEST_PRIO 12 /* Defines the lowest priority that can be assigned ... */
/* ... MUST NEVER be higher than 63! */
#define OS_TASK_IDLE_STK_SIZE 512 /* Idle task stack size (# of 16-bit wide entries) */
#define OS_TASK_STAT_EN 1 /* Enable (1) or Disable(0) the statistics task */
#define OS_TASK_STAT_STK_SIZE 512 /* Statistics task stack size (# of 16-bit wide entries) */
#define OS_CPU_HOOKS_EN 1 /* uC/OS-II hooks are found in the processor port files */
#define OS_MBOX_EN 0 /* Include code for MAILBOXES */
#define OS_MEM_EN 0 /* Include code for MEMORY MANAGER (fixed sized memory blocks) */
#define OS_Q_EN 0 /* Include code for QUEUES */
#define OS_SEM_EN 1 /* Include code for SEMAPHORES */
#define OS_TASK_CHANGE_PRIO_EN 0 /* Include code for OSTaskChangePrio() */
#define OS_TASK_CREATE_EN 1 /* Include code for OSTaskCreate() */
#define OS_TASK_CREATE_EXT_EN 0 /* Include code for OSTaskCreateExt() */
#define OS_TASK_DEL_EN 0 /* Include code for OSTaskDel() */
#define OS_TASK_SUSPEND_EN 0 /* Include code for OSTaskSuspend() and OSTaskResume() */
#define OS_TICKS_PER_SEC 200 /* Set the number of ticks in one second */
b)与计算机硬件相关的文件
1) OS_CPU.H文件
OS_CPU.H是一个与计算机硬件相关的文件,其中有些内容在系统移植时要根据工程项目实际使用的处理器进行修改,有些则无须修改。
无须修改的部分为数据类型的定义部分,其内容如下:
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U; /* Unsigned 8 bit quantity */
typedef signed char INT8S; /* Signed 8 bit quantity */
typedef unsigned int INT16U; /* Unsigned 16 bit quantity */
typedef signed int INT16S; /* Signed 16 bit quantity */
typedef unsigned long INT32U; /* Unsigned 32 bit quantity */
typedef signed long INT32S; /* Signed 32 bit quantity */
typedef float FP32; /* Single precision floating point */
typedef double FP64; /* Double precision floating point */
typedef unsigned int OS_STK; /* Each stack entry is 16-bit wide */
#define BYTE INT8S /* Define data types for backward compatibility ... */
#define UBYTE INT8U /* ... to uC/OS V1.xx. Not actually needed for ... */
#define WORD INT16S /* ... uC/OS-II. */
#define UWORD INT16U
#define LONG INT32S
#define ULONG INT32U
除此之外,文件还定义了一些与处理器相关的常数和宏。uC/OS-II应用在80X86处理器上时,这部分的部分内容列举如下:
#define OS_CRITICAL_METHOD 2
#if OS_CRITICAL_METHOD == 1
#define OS_ENTER_CRITICAL() asm CLI /* Disable interrupts */
#define OS_EXIT_CRITICAL() asm STI /* Enable interrupts */
#endif
#if OS_CRITICAL_METHOD == 2
#define OS_ENTER_CRITICAL() asm {PUSHF; CLI} /* Disable interrupts */
#define OS_EXIT_CRITICAL() asm POPF /* Enable interrupts */
#endif
#define OS_STK_GROWTH 1 /* Stack grows from HIGH to LOW memory on 80x86 */
#define uCOS 0x80 /* Interrupt vector # used for context switch */
#define OS_TASK_SW() asm INT uCOS
OS_CPU_EXT INT8U OSTickDOSCtr; /* Counter used to invoke DOS\'s tick handler every \'n\' ticks */
2) OS_CPU_A.ASM
在文件OS_CPU_A.ASM中,集中了所有与处理器相关的汇编语言代码模块。该文件也是项目开发者要根据实际使用的处理器必须进行移植的文件。
3) OS_CPU_C.C
在文件OS_CPU_C.C中,集中了所有与处理器相关的C语言代码模块。该文件也是项目开发者要根据实际使用的处理器必须进行移植的文件。
c)系统内核的各种服务文件
uC/OS-II内核是以C函数的形式提供各种服务的,这些功能模块都是与处理器硬件相关的,即在不同的处理器之间移植时是无须修改的。uC/OS-II把这些服务模块分门别类地组成如下这些文件:
OS_CORE.C //核心服务模块文件
OS_FLAG.C //信号量级服务模块文件
OS_MBOX.C //消息邮箱服务模块文件
OS_MEM.C //存储管理服务模块文件
OS_MUTEX.C //互斥型信号量服务模块文件
OS_Q.C //消息队列服务模块文件
OS_SEM.C //信号量服务模块文件
OS_TASK.C //任务管理服务模块文件
OS_TIME.C //时间管理服务模块文件
uCOS_II.C
uCOS_II.H //与应用相关的配置文件