《嵌入式实时操作系统复习纲要.doc》由会员分享,可在线阅读,更多相关《嵌入式实时操作系统复习纲要.doc(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精品文档,仅供学习与交流,如有侵权请联系网站删除嵌入式实时操作系统复习纲要第一章l 嵌入式系统:嵌入到对象体系中,为实现对象体系智能化控制的计算机系统,叫做嵌入式计算机系统,简称嵌入式系统。l 嵌入式操作系统:嵌入到特定设备的专用的可裁剪的计算机系统l 嵌入式操作系统分为实时操作系统和分时操作系统。l 嵌入式系统的三个要素:嵌入性、专用性和计算机系统l 嵌入式系统的特点:专用性强、可裁剪性好、实时性与可靠性好、功耗低l 内核类型:可剥夺型和不可剥夺型l 几种常见的嵌入式操作系统:VxWorks、pSOS、Windows CE、QNX OS;手持设备的有:Plam、WinCE、EPOC;互联网方
2、面的有:uCLinux、uC/OS-II.(记住其中五种)第二章l 任务:任务是一种程序实体,实质上时一个线程。l uC/OS-II的任务组成:任务程序代码(任务的执行部分)、任务推栈(保存任务工作环境)、任务控制块(保存任务属性)l uC/OS-II的任务有两种:用户任务和系统任务;其中系统任务有分为:空闲任务和统计任务,空闲任务是用户应用程序必须使用的,统计任务是应用程序可以根据实际需要来选择使用的。l 任务的5种状态:睡眠状态、就绪状态、运行状态、等待状态、中断服务状态。要重点看一下P17页的图2-2。在这些状态中睡眠状态只能直接进入就绪状态,就绪状态和中断服务状态可以直接进入运行状态,
3、就绪状态可以直接进入睡眠状态和运行状态,中断服务状态只能直接进入运行状态,等待状态可以直接进入除了中断服务状态外的其他三种状态。运行状态可以进入其他四种状态。等待状态有:延时等待、请求等待和任务挂起等。l 临界段:为了有效地对中断进行控制,在任务的代码里可使用uC/OS-II定义的宏OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()来控制任务何时响应中断,何时屏蔽中断。在运行这两个宏之间的代码时是不会响应中断的,这种受保护的代码段叫做临界段。作用:使临界段中的代码不能被中断,以保护一些不能被中断的用户代码(要求不受干扰地连续运行),保证系统的正常工作。说明在临界段中不
4、能调用uC/OS-II提供的系统函数,否则可能引起系统崩溃。l 关中断asm(“DI”)和OS_ENTER_CRITICAL();开中断asm(“EI”)和OS_EXIT_CRITICAL()。l uC/OS-II最多有64个任务,优先级为0的任务的优先级最高,优先级为63的任务的优先级最低。重点看明白课本P21页的例2-3.l P22-P23页,给出三个参数及堆栈增长方向,要知道如何创建任务。见后面的程序题l 看名称写含义P26,OSTCBDly表示任务等待的时限(节拍数)、OSTCBStat表示任务的当前状态标志、OSTCBPrio表示任务的优先级别、OS_STAT_RDY表示任务处于就绪
5、状态、OS_STAT_SEM表示任务处于等待信号量状态、OS_STAT_MBOX表示任务处于等待消息邮箱状态、OS_STAT_Q表示任务处于等待消息队列状态、OS_STAT_SUSPEND表示任务处于挂起状态、OS_STAT_MUTEX表示任务处于等待互斥型信号量状态。l uC/OS-II管理任务的两条链表:空任务链表(单向)、任务块链表(双向)l uC/OS-II操作系统内核的主要工作就是对任务进行管理和调度。对任务就绪表的操作详细看P30的例2-5和P26-P27页。如何从任务就绪表中获取优先级别最高的就绪任务的代码如下:y=OSUnMapTa1OSRdyGrp;x= OSUnMapTa1
6、OSRdyTb1y;prio=(y3)+x;或y=OSUnMapTa1OSRdyGrp;prio=(INT8U)(y3&=-OSMapTb140&0x07)=0) OSRdyGrp&=-OSMapTb1403;3.(1)一个任务中将任务自己挂起 OSTaskSuspend(OS_PRIO_SELF); 或者OSTaskSuspend(0xFF); (2)将优先级为3的任务恢复 OSTaskResume(3);4.创建一个初始信号为0的信号量集并向信号量集的第2位和第3位发送信号1. OS_FLAG_GRP *Sem_F; Sem_F=OSFlagCreate(0,&err);/创建信号量集,并
7、初始化信号为0 OSFlagPost( Sem_F, (OS_FLAGS)12,/给第第2位和第3位发送信号 OS_FLAG_SET,/信号值1 &err若要求请求信号量集则添加代码如下:(这部分一般不要求,简单了解即可) OSFlagPend( Sem_F, /请求信号量集 (OS_FLAGS)12; /请求第第2位和第3位信号 OS_FLAG_WAIT_SET_ALL, /信号都为1表示有效 0, &err若要求查询信号量集则添加代码如下:Flags=OSFlagQuery(Sem_F,&err); switch(Flags)5.使优先级为11的任务进入就绪状态 OSRdyGrp|= OS
8、MapTb1113; OSRdyTb1113|= OSMapTb111&0x07;6.(1)使优先级为2的任务的优先级改为4 OSTaskChangePrio(2,4);(2)将优先级为3的任务删除OSTaskDel(3);如果是删除任务自身则为:OSTaskDel(OS_PRIO_SELF);7.(1)将当前任务延时1000个时钟节 OSTimeDly(1000);(2)将当前任务延时2秒钟 OSTimeDlyHMSM(0,0,2,0); (3)取消任务优先级为3的任务的延时。 OSTimeDlyResume(3);8.如果当前时钟节拍数大于1000,则将当前正在运行的任务挂起。 INT8U
9、 ostim=0;/设置一个变量用于保存系统的时钟节拍数。 ostim=OSTimeGet(); if(ostim1000) OSTaskSuspend(OS_PRIO_SELF); 或者为if(OSTimeGet()1000) OSTaskSuspend(OS_PRIO_SELF);9.创建一个含有12个内存块并且每个内存块的长度为32字节的内存分区 /此方法为动态创建内存分区 /定义全局变量 OS_MEM *CommTxBuffer;/定义内存分区指针 INT8U CommTxPart1232;/定义分区和内存块 INT8U err; INT8U *BlkPtr; /内存分区的指针/*若题目还要求请求一个内存块时增加此行代码,/否则不需要*/ void main() INT8U err; CommTxBuffer=OSMemCreate( CommTxPart,/内存分区的首地址 12, /分区内内存块的数目 32, /每个内存块的长度 &err/*若题目还要求“请求一个内存块和释放时”时增加下面红色部分代码,否则不需要*/ BlkPtr=OSMemGet( CommTxBuffer,/内存分区的指针 &err /错误信息 OSMemPut(CommTxBuffer,IntBlkPtr);OSStart();/启动任务,可不写【精品文档】第 8 页