嵌入式实时操作系统μCOS原理与实践实验教程1
- 格式:ppt
- 大小:1.37 MB
- 文档页数:56
嵌入式操作系统实验报告系别:班级:学号:姓名:2013.12实验一嵌入式开发环境的建立一、实验目的通过此实验系统,读者可以了解嵌入式实时操作系统uC/OS-II 的内核机制和运行原理。
本实验系统展示了uC/OS-II 各方面的管理功能,包括信号量、队列、内存、时钟等。
在各个实验中具体介绍了uC/OS-II 的相关函数。
读者在做实验的同时能够结合理论知识加以分析,了解各个函数的作用和嵌入式应用程序的设计方法,最终对整个uC/OS-II 和嵌入式操作系统的应用有较为清楚的认识。
二、实验步骤1. 安装集成开发环境LambdaEDU集成开发环境LambdaEDU 的安装文件夹为 LambdaEDU ,其中有一个名为“Setup.exe”的文件,直接双击该文件便可启动安装过程。
具体的安装指导请看“LambdaEDU 安装手册.doc”文件。
当 LambdaEDU 安装完毕之后,我们看到的是一个空的界面,现在就开始一步一步地将我们的实验项目建立并运行起来。
2. 建立项目为了我们的实验运行起来,需要建立1 个项目基于x86 虚拟机的标准应用项目。
通过点击“文件”、“新建”、“项目”开始根据向导创建一个项目。
在随后出现的对话框中选择“Tool/标准应用项目”,点击下一步,开始创建一个标准的可执行的应用程序项目。
在随后出现的对话框中填入项目名称“ucos_x86_demo”。
点击“下一步”。
选择“pc386 uC/OS-II 应用(x86)”作为该项目的应用框架。
点击“下一步”选择“pc386_elf_tra_debug”作为该项目的基本配置。
点击“完成”。
新创建的项目“ucos_x86_demo”将会被添加到项目列表。
src 文件夹下保存了该项目中包含的源文件。
ucos2 文件夹中包含了移植到x86 虚拟机的全部代码。
init.c 文件是基于ucos2和本虚拟机的一个应用程序。
在进行ucos2 内核实验中,只需要替换init.c 文件,即可。
μCOS嵌入式操作系统实验指导书说明《嵌入式系统及应用实验指导书》包含:嵌入式开发板的硬件结构与u-boot基本命令、uClinux的多任务机制及其编程、uClinux的内存管理机制及其编程、在51单片机上移植μC/OS-II和在ARM7单片机上移植μC/OS-II 实验指导,适合电子与信息类专业的学生学习使用。
目录实验一嵌入式开发板的硬件结构与U-BOOT基本命令 (1)实验二UCLINUX的多任务机制及其编程 (6)实验三UCLINUX的内存管理机制及其编程 (9)实验四在51单片机上移植ΜC/OS-II (17)实验五在ARM7单片机上移植ΜC/OS-II (21)实验一嵌入式开发板的硬件结构与u-boot基本命令一、实验目的1、能够使用Embest IDE for ARM集成开发环境及ARM软件模拟器;2、通过实验掌握u-boot基本命令。
二、实验原理Bootloader代码是器件复位后进入操作系统前执行的一段代码,通过该代码初始化处理器各寄存器和片上外设,建立存储器映射图以及初始化堆栈,从而为操作系统提供基本的运行环境。
由于Bootloader与CPU和开发板配置有关,不可能有通用的Bootloader,因此需要根据具体情况进行移植。
嵌入式系统U-boot是当前流行、功能强大的Bootloader。
U-Boot用于多种嵌入式CPU的Bootloader程序,U-Boot支持ARM、PowerPC等多种架构的处理器,也支持Linux、NetBSD和Vx—Works等操作系统。
这里采用U—Boot 的版本为U-boot-1.1.6。
(1)U-Boot目录结构U-Boot目录结构如下:board是一些与现有开发板有关的文件,比如makefile和u-boot.1ds等都与具体开发板的硬件和地址分配有关;common 是与体系结构无关的文件,可实现各种命令的C文件;cpu是CPU相关文件,其子目录都是以U-boot支持的CPU命名,比如子目录arm920t,mips,s3e44bO 和nios等,每个特定的子目录都包括cpu.c,interrupt.C和start.s;doc是说明文档;drivers是通用设备驱动程序,比如:各种网卡、支持CFI的Flash 和USB总线等;fs是支持文件系统的文件,U—Boot可支持cramfs,fat,fdos,jffs2等文件;net是与网络有关的代码,比如:BOOTP协议、TFTP协议和NFS文件系统的实现;lib_arm是与ARM体系结构相关的代码;tools 是创建S-Record的格式文件和U-Boot images的工具。
目录学习情境一、嵌入式系统概述及集成环境的搭建与使用 (1)一、知识要点:嵌入式系统概述 (1)1.嵌入式系统基本概念 (1)2.嵌入式系统的特点 (2)3.嵌入式系统的应用领域 (3)(1)工业控制领域 (3)(2)信息家电 (4)(3)交通管理、环境监测、医疗仪器 (4)(4)嵌入式Internet应用 (4)(5)军事国防领域 (5)4.嵌入式系统的发展 (6)5.嵌入式系统的开发流程 (7)6.嵌入式系统的调试 (10)(1)在线仿真器(ICE)方式 (10)(2)在线调试器(ICD)方式 (11)(3)监控器方式 (11)7.基于μCOS-Ⅱ的嵌入式系统软件体系结构 (11)二、技能要求:嵌入式系统交叉开发环境的搭建 (2)1.交叉开发环境 (2)2.使用集成开发环境进行软件开发的流程 (2)3.ARM ADS集成开发工具及其组成 (3)(1)ADS集成开发工具 (3)(2)ADS集成开发工具的组成 (3)案例1.ADS 1.2的安装 (4)案例2.ADS集成开发环境的使用 (5)(1)新建工程 (5)(2)配置新建工程 (6)(3)添加文件,完成编译与链接,并生成目标文件.......... 错误!未定义书签。
案例3.其它工具的使用 .............................................................................. 错误!未定义书签。
(1)仿真器的连接与使用................................ 错误!未定义书签。
(2)超级终端的设置及映像下载.......................... 错误!未定义书签。
(3)Source Insight代码编辑器的使用.................... 错误!未定义书签。
学习情境二、嵌入式平台的接口驱动................................................................... 错误!未定义书签。
嵌入式实时操作系统UC/OS-II原理及应用第1章嵌入式实时操作系统的基本概念1.1 计算机操作系统1.1.1 什么是计算机操作系统1、计算机体系构架2、操作系统的作用:1)对计算机系统的主要资源进行管理;2)向计算机用户提供相关服务;3)隐藏计算机硬件,为应用程序提供透明的操作环境。
1.1.2 操作系统的作用和功能1、操作系统的作用为应用程序提供一个界面友好,性能稳定、安全,效率高,操作方便的虚拟计算机2、操作系统的功能1)处理器管理2)存储管理3)设备管理4)文件管理5)网络和通信管理6)提供用户接口1.2 嵌入式系统和嵌入式操作系统1.2.1 嵌入式系统的基本概念1、什么是嵌入式系统2、嵌入式系统的发展历程微型计算机→单板机→单片机→单片系统3、嵌入式系统的特点1)专用性强2)可裁剪性好3)实时性与可靠性好4)功耗低1.2.2 嵌入式操作系统1、什么是嵌入式操作系统运行在嵌入式硬件平台上,对整个系统及其所操作的部件、装置等资源进行统一协调、指挥和控制的系统软件2、嵌入式操作系统的特点1)微型化2)可裁剪性3)实时性4)高可靠性5)易移植性3、实时操作系统能及时响应外部事件的请求,并能及时控制所有实时设备与实时任务协调运行,且能在一个规定的时间内完成对事件的处理,这种操作系统称为实时操作系统。
4、实时操作系统的基本要求1)实时系统的计算必须产生正确的结果。
(逻辑或功能正确)Logical or Function Correctness)2)实时系统的计算必须在预定的时间内完成。
(时间正确)Timing Correctness5、实时操作系统的分类1)硬实时操作系统(极严格的时间内完成实时任务)2)软实时操作系统(系统完成实时任务的截止时间要求不十分严格)1.2.3 实时操作系统需要满足的条件1、实时操作系统应满足的条件1)必须是多任务操作系统2)任务的切换时间与系统中的任务数无关3)中断延迟的时间可预知并尽可能短1.2.4 嵌入式系统的任务及嵌入实时操作系统1、嵌入式系统的任务由于嵌入式系统所完成的是对一个装置或设备的控制任务,任务的功能相对固定,因此在一般情况下嵌入式实时操作系统所支持的典型任务应该是一个无限循环结构。
一.实验原理:掌握在基于嵌入式实时操作系统μC/OS-II的应用中,任务使用信号量的一般原理。
通过哲学家问题实验,了解如何利用信号量来对共享资源进行互斥访问。
二.实验平台:PC、XP操作系统、ADS集成开发环境三.实验目的复习对进程同步的机制,并加强学生动手能力,不仅让学生从原理上懂得操作系统,而且让学生实践,让学生自己动手写操作系统部分代码。
四:实验内容:哲学家动作:thinkinghungryeatingph 1 thinking! ph 2 thinking! ……….ph 1 hungry! ph 2 hungry! ……….ph 1 eating! ph 2 eating! ………..实现:while( 1 ) {显示ph x thinking;OSTimeDly()随机延时;显示ph x hungry;OSTimeDly()随机延时;显示ph x eating;OSTimeDly()随机延时;}五:实验要求:能在屏幕上输出5个哲学家的动作,分别是thinking,hungry,eating,如下所示:哲学家1 thinking, 哲学家2 thinking, ...哲学家1 hungry, 哲学家2 hungry, ...哲学家1 eating, 哲学家2 eating, ...六:实验代码:在ADS1.2中先后导入一下文件最后编写主函数main的程序,代码如下:#include "../ucos-ii/includes.h" /* uC/OS interface */#include "string.h"#include "gui.h"//task stack size#ifdef SEMIHOSTED#define TASK_STACK_SIZE (64+SEMIHOSTED_STACK_NEEDS) #else#define TASK_STACK_SIZE 10*1024#endif///***********define task************************/#define TASK_PRIO 2#define TASK_STK_SIZE 512INT8U *err; //用于退出的键OS_EVENT *SEM[5]; //定义对应的信号量指针数组extern char keyflag;OS_STK MyTaskStk1[TASK_STK_SIZE]; //定义任务堆栈区OS_STK MyTaskStk2[TASK_STK_SIZE];OS_STK MyTaskStk3[TASK_STK_SIZE];OS_STK MyTaskStk4[TASK_STK_SIZE];OS_STK MyTaskStk5[TASK_STK_SIZE];void Mytask1(void *pd){char buf[128];while(1){sprintf(buf,"ph%d is thinking\n",(unsigned int )pd+1);armulPrintf(buf);OSSemPend(SEM[0],0,err); //请求一个信号量,没有时间限制sprintf(buf,"ph%d is hungry\n",(unsigned int )pd+1);armulPrintf(buf);OSSemPost(SEM[1]); //发送一个信号量OSSemPend(SEM[0],0,err); //请求一个信号量,没有时间限制sprintf(buf,"ph%d is eating\n",(unsigned int )pd+1);armulPrintf(buf);OSSemPost(SEM[1]); //发送一个信号量OSTimeDlyHMSM(0,0,0,200); //等待200ms}}void Mytask2(void *pd){char buf[128];while(1){sprintf(buf,"ph%d is thinking\n",(unsigned int )pd+1);armulPrintf(buf);OSSemPend(SEM[1],0,err); //请求一个信号量,没有时间限制sprintf(buf,"ph%d is hungry\n",(unsigned int )pd+1);armulPrintf(buf);OSSemPost(SEM[2]); //发送一个信号量OSSemPend(SEM[1],0,err); //请求一个信号量,没有时间限制sprintf(buf,"ph%d is eating\n",(unsigned int )pd+1);armulPrintf(buf);OSSemPost(SEM[2]); //发送一个信号量OSTimeDlyHMSM(0,0,0,200); //等待200ms}}void Mytask3(void *pd){char buf[128];while(1){sprintf(buf,"ph%d is thinking\n",(unsigned int )pd+1);armulPrintf(buf);OSSemPend(SEM[2],0,err); //请求一个信号量,没有时间限制sprintf(buf,"ph%d is hungry\n",(unsigned int )pd+1);armulPrintf(buf);OSSemPost(SEM[3]); //发送一个信号量OSSemPend(SEM[2],0,err); //请求一个信号量,没有时间限制sprintf(buf,"ph%d is eating\n",(unsigned int )pd+1);armulPrintf(buf);OSSemPost(SEM[3]); //发送一个信号量OSTimeDlyHMSM(0,0,0,200); //等待200ms}}void Mytask4(void *pd){char buf[128];while(1){sprintf(buf,"ph%d is thinking\n",(unsigned int )pd+1);armulPrintf(buf);OSSemPend(SEM[3],0,err); //请求一个信号量,没有时间限制sprintf(buf,"ph%d is hungry\n",(unsigned int )pd+1);armulPrintf(buf);OSSemPost(SEM[4]); //发送一个信号量OSSemPend(SEM[3],0,err); //请求一个信号量,没有时间限制sprintf(buf,"ph%d is eating\n",(unsigned int )pd+1);armulPrintf(buf);OSSemPost(SEM[4]); //发送一个信号量OSTimeDlyHMSM(0,0,0,200); //等待200ms}}void Mytask5(void *pd){char buf[128];while(1){sprintf(buf,"ph%d is thinking\n",(unsigned int )pd+1);armulPrintf(buf);OSSemPost(SEM[0]); //发送一个信号量OSSemPend(SEM[4],0,err); //请求一个信号量,没有时间限制sprintf(buf,"ph%d is hungry\n",(unsigned int )pd+1);armulPrintf(buf);OSSemPost(SEM[0]); //发送一个信号量OSSemPend(SEM[4],0,err); //请求一个信号量,没有时间限制sprintf(buf,"ph%d is eating\n",(unsigned int )pd+1);armulPrintf(buf);OSTimeDlyHMSM(0,0,0,200); //等待200ms}}///****************************************/// main function///****************************************/int Main(int argc, char **argv){int i;//Init ARM hardwareARMTargetInit();//Init uCOS-IIOSInit();for(i=0;i<5;i++)SEM[i]=OSSemCreate(0); //建立计数器初值为0的信号量//for(i=0;i<NUM;i++)//OSTaskCreate(Mytask,(void*)i,&MyTaskStk[TASK_STK_SIZE-1],TASK_PRIO+i);OSTaskCreate(Mytask1,(void*)0,&MyTaskStk1[TASK_STK_SIZE-1],TASK_PRIO);OSTaskCreate(Mytask2,(void*)1,&MyTaskStk2[TASK_STK_SIZE-1],TASK_PRIO+1);OSTaskCreate(Mytask3,(void*)2,&MyTaskStk3[TASK_STK_SIZE-1],TASK_PRIO+2);OSTaskCreate(Mytask4,(void*)3,&MyTaskStk4[TASK_STK_SIZE-1],TASK_PRIO+3);OSTaskCreate(Mytask5,(void*)4,&MyTaskStk5[TASK_STK_SIZE-1],TASK_PRIO+4);//Create TaskARMTargetStart();//Start uCOS-IIOSStart();//*/while(1){};return 0; // can't run into here}运行本程序后可以得到期望的结果五:实验结果和总结:通过本实验,我对进程间的同步更熟悉,熟悉了信号量的运用,消除了对操作系统源代码的畏惧心理,受益匪浅。
嵌入式系统中的实时操作系统设计与应用实践嵌入式系统是一种特殊的计算机系统,被集成到其他设备中,用于控制设备的各种功能和操作。
实时操作系统(RTOS)是嵌入式系统的重要组成部分,它主要负责控制、调度和管理系统中各个任务的执行,确保这些任务能够按时、准确地完成。
在本文中,我们将探讨嵌入式系统中实时操作系统的设计原理和应用实践。
一、实时操作系统的设计原理实时操作系统的设计原理主要包括任务管理、调度算法、中断处理和内存管理等方面。
1. 任务管理实时操作系统中的任务是指系统需要执行的各个功能模块,不同的任务可能有不同的优先级。
任务管理的主要目标是确定任务的优先级、处理任务的同步和通信,以及任务的调度顺序。
为了确保实时性,任务管理需要采用一些同步和通信的机制,实现任务之间的协同工作。
常见的任务同步和通信的机制有信号量、消息队列和邮箱等。
2. 调度算法实时操作系统中的调度算法决定了系统如何根据任务的优先级来进行任务的调度。
常见的调度算法有优先级调度、循环调度和轮转调度等。
优先级调度算法是最常见的调度算法,它根据任务的优先级确定任务的执行顺序。
优先级数值越小,优先级越高。
循环调度算法是一种按照固定顺序执行任务的调度算法,而轮转调度算法则按照时间片的大小循环执行任务。
3. 中断处理中断是实时操作系统中常见的一种事件,它可以打破正常的任务执行顺序,立即处理一些关键的事件。
在中断处理过程中,需要保证中断响应的速度和处理的准确性。
因此,中断处理程序需要尽量简短,并在尽可能短的时间内完成。
4. 内存管理内存管理是实时操作系统中的一个重要模块,它负责管理系统内存的分配和释放,并确保任务之间的内存空间隔离和保护。
在实时操作系统中,为了提高系统的可靠性和稳定性,常常使用固定大小的内存块进行内存管理。
二、实时操作系统的应用实践1. 工业自动化实时操作系统在工业自动化中有着广泛的应用。
工业控制系统中的各种传感器和执行器需要实时地对外部环境做出响应,并控制设备的运行。
嵌入式实时操作系统μCOSII原理及应用习题答案(第四版)嵌入式实时操作系统μCOSII原理及应用习题答案(第四版)嵌入式操作系统是一种特殊的操作系统,用于控制和管理嵌入式系统。
实时操作系统(RTOS)是一种在给定的时间约束下,能够及时响应外部事件的操作系统。
μC/OS-II是一种广泛应用于嵌入式系统的实时操作系统。
本文将介绍μC/OS-II的原理及应用,并提供第四版的习题答案。
一、μC/OS-II原理1. 任务(Task)管理:μC/OS-II采用优先级抢占式调度算法,支持多任务。
每个任务具有自己的任务控制块(TCB),用于记录任务的状态、优先级、堆栈等信息。
任务之间可以通过任务切换进行调度,具有不同的优先级来确保系统的实时性。
2. 信号量(Semaphore)机制:信号量用于任务之间的同步和互斥操作。
μC/OS-II提供了两种信号量机制:二值信号量和计数信号量。
二值信号量用于任务之间的互斥操作,而计数信号量用于任务之间的同步操作。
3. 事件标志组(Event Flag Group)机制:事件标志组用于任务之间的同步和通信操作。
一个事件标志组中可以包含多个事件标志位,每个标志位都可以独立设置或清除。
任务可以等待一个或多个事件标志位的发生,并在发生时得到通知。
4. 消息邮箱(Mailbox)机制:消息邮箱用于任务之间的通信。
每个消息邮箱中可以存放一个或多个消息,任务可以通过发送和接收消息来进行通信。
消息邮箱还支持阻塞和非阻塞两种方式。
5. 定时器(Timer)管理:μC/OS-II提供了软件定时器的功能,可以设置定时器来触发任务或其他操作。
定时器可以基于时间片、滴答定时器或硬件定时器实现。
二、μC/OS-II应用1. 实时任务调度:μC/OS-II可以在多个任务之间进行优先级调度,保证任务的及时执行。
通过设置任务的优先级和时间片,可以确保高优先级任务优先执行,从而满足实时性要求。
同时,μC/OS-II还提供了任务切换和上下文切换机制,确保任务之间的切换及时有效。
嵌入式实时操作系统实验报告一、实验目的本实验的目的是让学生了解嵌入式实时操作系统的基本概念和特点,并能够运用实时操作系统编写嵌入式程序。
同时,通过本实验让学生对实时性和可靠性的要求有更深入的理解。
二、实验内容本实验的内容包括以下几个方面: 1. 实时操作系统的概念和基本特点; 2. 实时操作系统的任务调度机制; 3. 实时操作系统的信号量和消息队列; 4. 在实时操作系统上编写一个简单的示例程序。
三、实验原理1. 实时操作系统的概念和基本特点实时操作系统是一种以时间为基础的操作系统,它具有两个主要特点:可预测性和可靠性。
可预测性是指系统可以在规定时间内完成特定的任务,同时提供精确的响应时间。
可靠性是指系统能够保证任务的正确性和可靠性。
2. 实时操作系统的任务调度机制实时操作系统的任务调度有两种方式:一种是基于优先级的抢占式调度,另一种是基于时间片的轮询式调度。
在优先级抢占式调度中,系统会根据任务的优先级来决定任务的执行顺序。
而在时间片轮询式调度中,系统会为每个任务分配一个时间片,当时间片用完后会切换到下一个任务。
3. 实时操作系统的信号量和消息队列信号量是操作系统中一种用于同步和互斥的机制,信号量可以用来保护共享资源,从而避免多个任务同时访问共享资源导致的冲突。
消息队列是一种用于任务之间通信的机制,它可以保证任务之间传递的消息的可靠性和有序性。
4. 编写示例程序在实时操作系统上编写程序时,需要首先定义任务,并对任务的优先级进行设置。
然后在任务中编写对共享资源的读/写操作,同时使用信号量或消息队列来实现任务之间的通信。
四、实验步骤1.学习实时操作系统的概念和基本特点;2.了解实时操作系统的任务调度机制,包括优先级抢占式调度和时间片轮询式调度;3.学习实时操作系统的信号量和消息队列;4.根据实验要求,编写一个简单的示例程序;5.运行程序并进行测试,检查程序的正确性和实时性。
五、实验结果与分析在本实验中,我首先学习了实时操作系统的基本概念和特点,并了解了其任务调度机制和信号量、消息队列等机制。
嵌入式实时操作系统μCOS系统因为它具有软件代码小、高度、响应速度快等特点已经使它在许多领域得到广泛的应用。
从家里的洗衣机、电冰箱,到作为交通工具的自行车、小汽车,到办公室里的远程会议系统等。
嵌入式系统通常由硬件环境和操作系统构成。
在嵌入式操作系统的统一调度管理下实现对全部系统资源的合理利用和分配,达到提高系统性能和有效利用有限资源的目的。
μCOS-Ⅱ作为一个源码开放的嵌入式实时操作系统,同时具有良好的可移植性、可裁剪性、可剥夺性、稳定性和牢靠性等优点,使其成为许多嵌入式操作系统的首选。
本文将μCOS-Ⅱ在的8位处理器芯片HC9S08上移植实现。
2、μCOS-Ⅱ系统结构μCOS-Ⅱ是一个完整的可移植可固化可裁剪的抢占式实时多任务内核。
可以在不需要做很大修改的基础上便利的移植到多种处理器上。
条件是:该处理器要具有一定数量的堆栈,能够用法软件中断,产生定时器中断,此外,编译器要支持可重入代码,并且要能用法汇编实现对处理器内部寄存器的相关操作。
通过μCOS-Ⅱ的管理,使多个任务之间互相协调,分时的占用CPU,实现充分利用资源和实时等相应的功能。
任务通常是一个死循环,用来完成某一特定的功能;一个任务相当于一个线程。
μCOS-Ⅱ可以管理多达64个任务,每个任务都具有一个唯一的合法优先级。
但是,优先级最低的那个任务已经被系统定义为空闲任务,用户不能用法。
用户可以通过函数OSTaskCreate()来创建任务,通过OSTaskDel()来删除任务。
任务可能有以下五种状态:睡眠态、就绪态、运行态、等待状态、中断服务态。
利用不同的系统函数可以实现任务在各状态之间的转换。
μCOS-Ⅱ通过对就绪表的操作总是挑选在就绪任务中优先级最高的那个任务开头运行。
任务级的调度是由函数OSSched()来完成的;而中断级的调度是由OSIntExt()完成的。
任务切换的过程分为两步:将被挂起任务的处理器寄存器状态保存在它的任务堆栈中;将将要执行的任务堆栈中保存的寄存器值弹处第1页共4页。