第1 章
嵌入式实时操作系统的基本概念 1、 什么是嵌入式系统?(了解)
人们把嵌入到对象体系中,为实现对象体系智能化控制的计算机系统,称作嵌入式计算机系统,简称为嵌入式系统。
2、 什么是嵌入式操作系统? 运行在嵌入式硬件平台上,对整个系统及其所操作的部件、装置等资源进行统一协调、指挥和控制的系统软件就叫做嵌入式操作系统。
3、 实时操作系统需要满足的条件有哪些? 实时操作系统应满足以下三个条件:
(1)
实时操作系统必须是多任务系统。
(2)
任务的切换时间应与系统中的任务数无关。
(3)
中断延迟的时间可预知并尽可能短。
4、 一个用 C 语言编写的任务的结构(P11 例 1-1,重点掌握):
void mytask(void *pdata) {
for(;;)
{
用户编写的代码;
} } 第2 章
预备知识 1、 取址运算符与取值运算符 “取址”运算符“&”,“取值”运算符“*”。
2、 函数指针 函数名就是该函数的指针(重点掌握)。
第3 章
uC/OS- -I II 中的任务 1、任务的组成
2、任务有哪两种
用户任务、系统任务 3、任务的 5 种状态(重点)(作简单描述即可)
(1)睡眠状态:任务在没有被配备任务控制块或被剥夺了任务控制块时的状态叫做任务的睡眠状态;
(2)就绪状态:如果系统为任务配备了任务控制块且在任务就绪表中进行了就绪
登记,则任务就具备了运行的充分条件,这时任务的状态叫做就绪状态;
(3)运行状态:处于就绪状态的任务如果经调度器判断获得了 CPU 的使用权,则任务就进入运行状态。任何时刻只能有一个任务处于运行状态,就绪的任务只有当所有优先级高于本任务的任务都转为等待状态,才能进入运行状态;
(4)等待状态:正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把 CPU 的使用权让给其他任务而使任务进入等待状态;
(5)中断服务状态:一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态。
4、P61 例 3-1 一个用 C 语言编写的任务
5、空闲任务(该任务必须用)
为了使 CPU 在没有用户任务可执行时有事可做,uC/OS-II 提供了一个叫做空闲任务 OSTaskIdle()的系统任务。
6、统计任务(该任务可用可不用)
统计任务 OSTaskStart()。
7、任务的优先权与优先级
最多可以在 uC/OS-II 中创建 64 个任务,所以任务的优先级别最多有 64 级,每个级别都用一个整数数字来表示,即 0、1、2、…、63;数字越小优先级别越高。
8、任务堆栈
所谓堆栈,就是在存储器中按数据“后进先出(LIFO)”的原则组织的连续存储空间。
9、任务堆栈的创建
#define Task_STK_SIZE
512
//定义堆栈的长度为(1024 字节)
OS_STK [Task_STK_SIZE];
//定义一个数组来作为任务堆栈 10、堆栈的增长方向
堆栈的增长方向有两种:向下的(如[MyTaskStKN-1])、向上的。
11、任务控制块结构(给出结构体,说明其成员及作用)
12、P70 了解空任务链表和任务控制块链表 13、P73 任务就绪表结构
14、任务调度
调度器的主要工作:
(1)
在任务就绪表中查找具有最高优先级别的就绪任务; (2)
实现任务的切换。
实现函数 (1)
任务级的调度器由函数 OSSched()来实现; (2)
中断级的调度器由函数 OSIntExt()来实现。
15、用函数 OSTaskCreate()创建任务
16、挂起任务(了解)
挂起任务函数 OSTaskSuspend() 17、恢复任务(了解)
恢复任务函数 OSTaskResume() 18、任务的删除
(过程重要)先申请再删除自己。
19、uC/OS-II 的初始化
初始化函数 OSInit() 20、uC/OS-II 的启动
启动函数 OSStart() 课后题 1、 什么是可剥夺型内核?
2、 一个应用程序为什么一定要使用空闲任务?
3、 统计任务是必须使用的吗?
4、 什么叫做任务的优先权? uC/OS-II 是用什么来描述任务的优先权的?
5、 在 uC/OS-II 中任务有哪 5 种状态?
6、 任务控制块记录了任务的哪些信息?
7、 什么是空任务控制块链表?什么是任务控制块链表?
8、 数组 OSTCBTbl[]有什么用途?
9、 正在运行任务的任务控制块指针存放在哪个指针变量中?
10、变量 OSRayGrp 有什么用?
11、编写一个有 3 个任务的应用程序,每个任务均会在显示器上显示一个字符,并让 3 个任务具有不同的等待时间,观察应用程序运行中任务被调度的情况。
第 第 4 4 章
uC/OS- -I II 的中断和时钟 1、uC/OS-II 中断响应过程(可了解 P110 图 4-1)
中断->若有高优先级则运行高级别的任务->回到原处 2、临界段的基本概念
不希望被中断的代码段叫做临界段,处在关中断和开中断之间的代码段就是临界段。
3、关中断与开中断
OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()这两个宏封装了与系统硬件相关的关中断和开中断指令。
4、uC/OS-II 的时钟(P115 掌握时钟节拍)
最小的时钟单位就是两次中断之间相间隔的时间,这个最小时钟单位叫做时钟节拍(Time Tick)。
5、钩子函数
钩子函数 OSTimeTickHook() 6、任务的延时(重要)
OSTimeDly()或 OSTimeDlyHMSM() 课后题 1、 全局变量 OSIntNesting 的作用是什么?(记录中断嵌套的次数,P110 图 4-1 下面)
2、uC/OS-II 的中断服务程序何时返回被中断的任务?何时不返回被中断的任务?
3、说明延时函数 OSTimeDly()与 OSTimeDlyHMSM()的区别。
第 第 5 5 章
任务的同步与通信 (重点)
1、事件
信号量、邮箱(消息邮箱)和消息队列。
2、信号量
互斥型信号量、计数型信号量。
3、消息邮箱
在多任务操作系统中,常常需要在任务与任务之间通过 传递一个数据(这种数据叫做“消息”)的方式来进行通信。为了达到这个目的,可以在内存中创建一个存储空间作为该数据的缓冲区。如果把这个 缓冲区叫做消息缓冲区,那么在任务间传递数据(消息)的一个最简单的方法就是传递消息缓冲区的 指针。因此, 用来传递消息缓冲区指针的数据结构就叫做消息邮箱。
4、消息队列
让数组的每个元素都存放一个消息缓冲区指针,那么任务就可通过传递这个指针数组指针的方法来传递多个消息了。这种可以传递多个消息的数据结构就叫做消息队列。
5、P145-P146 等待任务控制链表(知识点多,需具体掌握)
等待任务表 OSEventTbl[]与变量 OSEventGrp[] 6、任务优先级的反转现象(其解释及如何防范此现象,可参考 P161 图 5-15)(必考)
解释:在可剥夺型内核中,当任务以独占方式使用共享资源时,会出现低优先级任务先于高优先级任务而被运行的现象,这就是所谓的任务优先级反转;
防范:用互斥型信号量,一旦运行提高优先级。
7、P167 互斥型信号量
高 8 位用来存放为了避免出现优先级反转现象而要提升的优先级别 prio。
课后题 1、 叙述信号量的工作过程。
任务 A 任务 B 指针(消息队列)
消息缓冲区(存地址)
真实信息(多条)
2、 什么叫优先级反转现象?这种现象会在什么情况下发生?有什么危害?
3、 互斥型信号量是如何防止优先级反转现象出现的?
4、 什么叫消息邮箱?
5、 使用消息邮箱实现任务之间的通信有什么好处?
6、 什么是消息队列?
7、想一想,在应用程序中消息队列都可以做些什么工作?
第 第 6 6 章
信号量集 1、基本概念
在程序中一个任务的操作能否实施,常常需要由多个信号量的逻辑运算结果作为前提条件。为了处理此类问题,uC/OS-II 提供了可以处理多个信号量的信号量集。
2、信号量集的功能分成哪两部分
标志组和等待任务链表 3、信号量集的标志组的主要组成部分
一个叫做信号列表的二进制书 OSFlagFlags。OSFlagFlags 其实就是一个位图,其长度可在系统配置文件 OS_CFG.H 中来定制,系统默认定义为 16 位。
4、等待任务必须完成的两个操作
(1)在多个信号量的输入中挑选等待任务感兴趣的输入;
(2)把挑选出来的输入按照等待任务所希望的逻辑来运算,以得出输出。
5、示例代码
6、查询信号量集的状态
调用函数 OSFlagQuery()可以查询一个信号量集的状态; 作用:使任务可根据信号的不同状态实现不同的功能。
第 第 7 7 章
动态内存管理
1、可动态分配内存的划分
内存块、内存分区 2、内存块
uC/OS-II 以若干个数据单元组成一个内存块,内存块的大小可由用户定制。在uC/OS-II 中,内存块是系统向应用程序提供动态内存的最小单位。
3、内存分区
使用内存块来进行动态内存的管理显得过于零碎,因此 uC/OS-II 将多个内存块组成一个内存分区,从而把内存分区作为管理的基本单位。
4、内存控制块 OS_MEM 的定义
课后题 1、 什么叫内存分区?什么叫内存块?内存分区与内存块之间有什么关系?
2、在同一个内存分区中内存块是按什么方式组织起来的?
通过指针
3、什么叫内存控制块?内存控制块中都记录了一些什么信息?