第二章 ucos-ii工作原理

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//任务的优先级别
OSTaskCreate( ) 函数使用举例:
在系统 “创建” 任务 task_A 定义任务 task_A void task_A(void* pdata) { void main(void) { OSInit(); //系统初始化部分 …… OSTaskCreate( task_A, void * 0, &MystackTop,
递减堆栈 ---- 进栈操作 向小地址方向发展。
…… &MyTaskStk[StkSize - 1], …… )
递增堆栈 ---- 进栈操作 向大地址方向发展。
OSTaskCreate( …… &MyTaskStk[ 0 ], …… )
OSTaskCreate(
备注:利用条件编译技术和 OS_CPU.H 中的宏定义常数OS_STK_GROWTH 编写易移植用户系统;“1” --- 递减堆栈 for ARM CPU。
硬件抽象层接口定义和代码设计特点



硬件抽象层具有与硬件密切相关性 硬件抽象层具有与操作系统无关性 接口定义的功能应包含硬件或系统所需硬件支 持的所有功能 接口定义简单明了,太多接口函数会增加软件 模拟的复杂性 具有可测性的接口设计有利于系统的软硬件测 试和集成
常见的嵌入式操作系统
实时嵌入式操作系统的种类繁多,大体 上可分为两种,商用型和免费型。 商用型的实操作系统功能稳定、可靠,有 完善的技术支持和售后服务,但往往价格 昂贵,如Vxworks、QNX、WinCE、Palm OS 等。 免费型的实时操作系统在价格方面具有优 势,目前主要有Linux,μC/OS是一种源码 开放的商业RTOS
系统为任务配备 了任务控制块且 在任务就绪表中 进行了就绪登记, 这时任务的状态 叫做就绪状态。 处于就绪状态的 任务如果经调度 器判断获得了 CPU的使用权, 则任务就进入运 行状态
一个正在运行的 。 任务一旦响应中 断申请就会中止 运行而去执行中 断服务程序,这 时任务的状态叫 做中断服务状态

2.2.3 任务控制块及任务控制块链表

任务控制块(TCB)---- 任务在系统中的身份 证

TCB ---- uC/OS-II 中用于记录任务信息(任务堆栈指针、 任务当前状态、任务优先级别等)的数据结构。 uC/OS-II 将系统中的所有 TCB 构成两个链表 (OSTCBList、OSTCBFreeList)进行任务管理。 空任务控制块链表 ---- 未被分配的 TCB 链 OSTCBFreeList。
}
void MyTask1(void *pdata) { …… } • 用户应用程序的一般结构 void MyTask2(void *pdata) { …… }

void main( ) “用户任务” 代码形式上很像 C函数,但他不是 { 函数! ……

“任务” OSInit( ); 不能被主函数 main( ) 或其他函数调用, 只能被主函数或已激活任务创建。 ……

ISR_Sta ---- Running状态的任务被中断后进 入的状态。
任务在没有被配备 任务控制块或被剥 夺了任务控制块时 的状态叫做任务的 睡眠状态
正在运行的任务,需要 等待一段时间或需要等 待一个事件发生再运行 时,该任务就会把CPU 的使用权让给别的任务 而使任务进入等待状态
任务的状态及其转换

μC/OS-II中的数据类型
备注:这些类型定义在 ARM\OS_CPU.H 文件中。
2.2 uC/OS-II中的任务
2.2.1 任务的基本概念




复杂问题 “分而治之” 的问题解题思路。 针对目标系统拆分后的 “小且易” 的问题的 具体处理方法编码和数据结构 ---- 任务。 uC/OS-II的两种任务:系统任务、用户任务。 任务的组成:
----- 在创建任务的同时,任务堆栈即被创建。
MyTaskStkSize 64 MyTaskStk[ MyTaskStkSize ] //在 OS_CPU.H中定义 OS_STK
举例:
#define OS_STK
……
INT8U OSTaskCreate(
// typedef INT32U OS_STK
任务的运行由操作系统调度管理。
OSTaskCreate( MyTask2,… … ); …… OSStart( ); …… } OSTaskCreate( MyTask1,… … );

2.2.1 任务的基本概念

OSInit( ) 函数原型: void OSInit( void )

OSStar( ) 函数原型: void 环境。 OSStart( void ) OSInit( ) ---- 初始化 uC/OS-II
C H A P T E R
2
嵌入式实时操作系统 C/OS-Ⅱ分析
主要内容

嵌入式操作系统


C/OS-Ⅱ简介
C/OS-Ⅱ中的任务 C/OS-Ⅱ任务的中断和时钟 C/OS-Ⅱ任务通信与同步 C/OS-Ⅱ内存的动态分配

C/OS-Ⅱ移植相关
功能层
应用程序
文件系统 软件层
图形用户 接口


OSTaskCreate( )) 函数原型: OSTaskCreate( ---- 创建任务系统函数。

INT8U OSTaskCreate( OSStart( ) ---- 启动 uC/OS-II 任务调度器。 void (*task)(void *pd) , //指向任务的指针 OS_ENTER_CRITICAL( ) ---- 进入临界区 (宏) void *pdata , //传递给任务的参数 OS_EXIT_CRITICAL( ) ---- 退出临界区 (宏) OS_STK *ptos , //任务堆栈栈顶的指针 INT8U prio )
用户任务代码的一般结构
// 任务的初始化 //超循环构成任务体
void MyTask(void *pdata)
{ …… for ( ; ; ) {
可被中断的用户代码片断; OS_ENTER_CRITICAL();
//进入临界区(关中断)
不可被中断的用户代码片断; OS_EXIT_CRITICAL(); //退出临界区(开中断) 可被中断的用户代码片断; }

2.2.2 任务堆栈


堆栈 ---- LIFO访问原则组织的连续存储器 任务堆栈在 uC/OS-II 中的应用:

任务堆栈是任务的三大组成部分之一。 保存 CPU 寄存器现场(ARM处理器中的R0~R12、LR、 SPSR 等)。 本 Task 的私有数据。

2.2.2 任务堆栈

任务堆栈的创建
……;
while (1) {
//任务初始化部分
……;
} }
//任务功能代码
8
);
OSStart(); }
2.2.1 任务的基本概念
系统任务 统计任务( OSTaskStat( ))使用说明: 空闲任务(OSTaskIdel( ))使用说明: 1 空闲任务( OSTaskIdel( )) 、功能完成用户任务 CPU 使用率的统计,结果以百分 1、uC/OS-II 规定用户程序中必须使用 OSTaskIdel。 比的形式存放在变量 OSCPUsage 原型: void OSTaskIdel(void* pdata) 中。 22 、该任务不能用软件删除。 、该任务用户可选择使用。OS_CFG.H文件中的常数

由于嵌入式系统应用的硬件环境差异较大, 新增加的中间层位于操作系统和硬件之间, 包含了系统中与硬件相关的大部分功能 , 隐蔽了底层硬件的多样性
嵌入式系统的体系结构
功能层 应用程序
文件系统 软件层
图形用户 接口
任务管理
实时操作系统( R T O S ) 中间层 D/A A/D 硬件层 I/O 人机交互接口 嵌入式计算机系统 嵌入式 微处理器 B S P / H A L 硬件抽象层/ 板极支持包 通用接口 ROM SDRAM

OS_TASK_STAT_EN 设置为 1,使能该函数。 3 、该任务是 uC/OS-II 初始化时自动创建,其任务优先 统计任务( OSTaskStat( )) 级固定为最低级,用户也可修改该任务的业务。 3原型: 、用户在 OS_CFG.H 中使能该任务后,系统自动创建 void OSTaskStat(void* pdata) 该任务,但在用户使用统计数据前必须调用系统 4、目的 ---- 使 CPU 在没有用户任务可执行时也有事可 函数 OSStatInit() 先进行初始化。 做。 4、该任务固定拥有次末任务优先级。


学习嵌入式操作系统



学习一种实时操作系统RTOS,如 C/OS-Ⅱ,掌握实时系统的概念和设 计方法 嵌入式系统以应用为中心,要选择 “适用”的操作系统 嵌入式Linux 自己尝试“写”RTOS
2.1 嵌入式 RTOS uC/OS-II 简介
uC/OS由 Jean J. Labrosse 先生(加拿大)1992编写 的RTOS,1999年改写后命名为uC/OS-II 。 2000年被美航空管理局认证。 uC/OS-II中的代码 90%用C语言编写,只有少 量的相 关于硬件的代码用汇编编写,易移植到各类体系结构 的8位、16位、32位处理器。 官方网站:www.uCOS-II.com
2.2.1 任务的基本概念


wk.baidu.com
任务的优先权和优先级别
uC/OS-II 的每个任务都必须有唯一的优先级。
uC/OS-II 最多可以管理64个优先级别分配给64个任务。 uC/OS-II 中用一个8b的整型数来表示优先级别,数字越 小,优先级越高,prio = 0 的任务优先级最高。 uC/OS-II 中使用任务的优先级(prio)作为任务句柄。 用户通过修改 OS_CFG.H 中的宏定义常数 OS_LOWEST_PRIO 的值,约定本用户系统的最大优先 级数。
HAL简介

硬件抽象层(Hardware Abstraction Layer,HAL)是体系 结构相关的底层程序

处理系统启动、硬件初始化以及中断与异常


硬件抽象层对内核其它部分提供统一的调用接口
HAL可以提供BSP(board support package,板级支持包)
规范,提供跨平台可移植性
任务控制块 ---- uC/OS-II进行任务管理用的一个数据结构。 任务代码 ---- 描述任务算法的程序编码。 任务堆栈 ---- 任务的工作现场环境。
2.2.1 任务的基本概念
2.2.1

任务的基本概念
各个任务在多任务系统中也随着环境条 “宏观” 上的多任务并发,实际上是 任务的 5 种状态: Sleep ----进行多任务处理,“微观” 仅有编码未激活。 用单 件的情况而具有不同的状态。 CPU 任 Ready ---- 已激活并“万事俱备,只欠调度” 何时刻,只能运行一个任务,存在 CPU资 任务状态划分也是多任务操作系统的管 Running ---- 正占用 CPU 运行自己。 源竞争 ---- 任务调度、任务现场。 理手段。 Wait ---- 等待某事件发生。
任务管理
实时操作系统(RTOS) 中间层 D/A A/D 硬件层 I/O 人机交互接口 嵌入式计算机系统 嵌入式 微处理器 BSP/HAL 硬件抽象层/板极支持包 通用接口 ROM SDRAM
硬件抽象层的引入

嵌入式实时系统自底向上包含三个部分


硬件环境 嵌入式实时操作系统——RTOS 嵌入式实时应用程序
void (*task) (void *pd), //指向任务的指针 void * pdata, //传递给任务的参数 //任务的优先级别 MyTaskStk[ MyTaskStkSize-1 ], //任务堆栈栈顶的指针 INT8U prio )
2.2.2 任务堆栈


任务堆栈的使用注意事项

__ 存在两种堆栈形式



任务控制块链表 ---- 已分配的 TCB 链 OSTCBList。
2.2.3 任务控制块及任务控制块链表

任务控制块(TCB)的结构
任务控制块结构的主要成员 typedef struct os_tcb { struct os_tcb *OSTCBNext; //指向下一个TCB的指针 struct os_tcb *OSTCBPrev; //指向前一个TCB的指针 OS_STK *OSTCBStkPtr; //指向任务堆栈栈顶的指针 …… INT16U OSTCBDly; //任务等待时间 INT8U OSTCBStat; //任务的当前状态标志 INT8U OSTCBPrio; //任务的优先级别 …… } OS_TCB;
相关文档
最新文档