μCOS-II下通用驱动框架的设计与实现 - UcOS II
μCOS-II和ecos比较解读
嵌入式系统μC/OS-II与eCos的比较摘要:叙述嵌入式系统和嵌入式操作系统的概念,简述嵌入式实时系统的发展阶段。
重点介绍μC/OS-II和eCos的发展历史,并且对μC/O S-II与eCos进行比较,为大家在选择嵌入式操作系统时提供参考。
关键词:嵌入式系统μC/OS-II eCos1 背景随着计算机技术的迅速发展和芯片制造工艺的不断进步,嵌入式系统的应用日益广泛:从民用的电视、手机等电路设备到军用的飞机、坦克等武器系统,到处都有嵌入式系统的身影。
在嵌入式系统的应用开发中,采和嵌入式实时操作系统(简称RTOS)能够支持多任务,使得程序开发更加容易,便于维护,同时能够提高系统的稳定性和可靠性。
这已逐渐成为嵌入式系统开发的一个发展方向。
<P&NBSP; 随着计算机技术的迅速发展和芯片制造工艺的不断进步,嵌入式系统的应用日益广泛:从民用的电视、手机等电路设备到军用的飞机、坦克等武器系统,到处都有嵌入式系统的身影。
在嵌入式系统的应用开发中,采和嵌入式实时操作系统(简称RTOS)能够支持多任务,使得程序开发更加容易,便于维护,同时能够提高系统的稳定性和可靠性。
这已逐渐成为嵌入式系统开发的一个发展方向。
<>2 嵌入式操作系统概述嵌入式操作系统是一种支持嵌入式系统应用的操作系统软件。
它是嵌入式系统(包括硬、软件系统)极为重要的组成部分,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器Browser等。
嵌入式操作系统具有通用操作系统的基本特点,如能够有效管理越来越复杂的系统资源;能够把硬件虚拟化,使得开发人员从繁忙的驱动程序移植和维护中解脱出来;能够提供库函数、标准设备驱动程序以及工具集等。
与通用操作系统相比较,嵌入式操作系统在系统实时高效性、硬件的相关依赖性、软件固态化以及应用的专用性等方面具有较为突出的特点。
嵌入式系统的出现至今已经有30多年的历史。
uCOS-II简介
uC/OS-II简介u C / O S 是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。
μC/OS-II 的前身是μC/OS,最早出自于1992 年美国嵌入式系统专家Jean brosse 在《嵌入式系统编程》杂志的5 月和6 月刊上刊登的文章连载,并把μC/OS 的源码发布在该杂志的B B S 上。
μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。
CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。
用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II 嵌人到开发的产品中。
μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至 2KB 。
μC/OS-II 已经移植到了几乎所有知名的CPU 上。
严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。
没有提供输入输出管理,文件系统,网络等额外的服务。
但由于uC/OS-II 良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。
uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。
任务管理uC/OS-II 中最多可以支持64 个任务,分别对应优先级0~63,其中0 为最高优先级。
63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。
uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。
系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,改任务仅给一个整形变量做累加运算;另一个是系统任务,它的优先级为次低,改任务负责统计当前cpu的利用率。
北航ARM9实验报告:实验3uCOS-II实验
北航ARM9实验报告:实验3uCOS-II实验北航 ARM9 实验报告:实验 3uCOSII 实验一、实验目的本次实验的主要目的是深入了解和掌握 uCOSII 实时操作系统在ARM9 平台上的移植和应用。
通过实际操作,熟悉 uCOSII 的任务管理、内存管理、中断处理等核心机制,提高对实时操作系统的理解和应用能力,为后续的嵌入式系统开发打下坚实的基础。
二、实验环境1、硬件环境:ARM9 开发板、PC 机。
2、软件环境:Keil MDK 集成开发环境、uCOSII 源代码。
三、实验原理uCOSII 是一个可裁剪、可剥夺型的多任务实时内核,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。
其基本原理包括任务管理、任务调度、时间管理、内存管理和中断管理等。
任务管理:uCOSII 中的任务是一个独立的执行流,每个任务都有自己的堆栈空间和任务控制块(TCB)。
任务可以处于就绪、运行、等待、挂起等状态。
任务调度:采用基于优先级的抢占式调度算法,始终让优先级最高的就绪任务运行。
时间管理:通过系统时钟节拍来实现任务的延时和定时功能。
内存管理:提供了简单的内存分区管理和内存块管理机制。
中断管理:支持中断嵌套,在中断服务程序中可以进行任务切换。
四、实验步骤1、建立工程在 Keil MDK 中创建一个新的工程,选择对应的 ARM9 芯片型号,并配置相关的编译选项。
2、导入 uCOSII 源代码将 uCOSII 的源代码导入到工程中,并对相关的文件进行配置,如设置任务堆栈大小、系统时钟节拍频率等。
3、编写任务函数根据实验要求,编写多个任务函数,每个任务实现不同的功能。
4、创建任务在主函数中使用 uCOSII 提供的 API 函数创建任务,并设置任务的优先级。
5、启动操作系统调用 uCOSII 的启动函数,使操作系统开始运行,进行任务调度。
6、调试与测试通过单步调试、查看变量值和输出信息等方式,对系统的运行情况进行调试和测试,确保任务的执行符合预期。
五、ucos-II的移植-智能嵌入技术开发与实践-佟国香-清华大学出版社
11
Intel/AMD 80186 Motorola 68HC11
\SOFTWARE\uCOS-II\Ix86S \OS_CPU.H \OS_CPU_A.ASM \OS_CPU_C.C \SOFTWARE\uCOS-II\Ix86L \OS_CPU.H \OS_CPU_A.ASM \OS_CPU_C.C \SOFTWARE\uCOS-II\68HC11 \OS_CPU.H \OS_CPU_A.ASM \OS_CPU_C.C
➢ uC/OS-II的全部源代码量大约是6000-7000行,一共有15 个文件。将 uC/OS-II 移植到ARM处理器上,需要完成的工 作也非常简单,只需要修改三个和ARM体系结构相关的文件 ,代码量大约是500行。
14
移植工作
如果处理器和编译器满足了μC/OS-Ⅱ的要求,并 且已经有了必要工具。移植工作包括以下几个内容: (1)用#define设置一些常量的值(OS_CPU.H) (2)声明10个数据类型(OS_CPU.H) (3)用#define声明三个宏(OS_CPU.H) (4)用C语言编写六个简单的函数(OS_CPU_C.C) (5)编写四个汇编语言函数(OS_CPU_A.ASM)
7
处理器支持硬件堆栈
COS-II进行任务调度的时候,会把当前任 务的CPU寄存器存放到此任务的堆栈中,然后, 再从另一个任务的堆栈中恢复原来的工作寄存器 ,继续运行另一个任务。所以,寄存器的入栈和 出栈是COS-II多任务调度的基础。
处理器中有专门的指令处理堆栈,可以灵活 的使用堆栈。
μCOS-II-下-LwIP-协议栈的移植和测试
1、引言为了实现嵌入式系统终端连入互联网,而有必要为其引入了网络功能。
μC/OS II 是一个源代码开放的实时操作系统,但是它只是一个实时的任务调度及通信内核,并没有集成TCP/IP 通信协议,为了实现网络功能,需要在μC/OS II 移植一个轻量级的TCP/IP 通信协议LwIP。
本文主要论述μC/OS II 下通信协议LwIP 的移植以及测试。
2、LwIP 简介LwIP ( light weight IP)是瑞士计算机科学院的Adam Dunkels 等开发的一套开放TCP/IP 协议栈源代码。
LwIP 既可以移植到操作系统上,又可以在无操作系统的情况下独立运行。
LwIP 实现的重点是在保持TCP/IP 协议主要功能的基础上减少对RAM 的占用,这使LwIP 适合在低端嵌入式系统中使用。
其主要特点如下:(1)支持多网络接口下IP 转发;(2)支持ICMP 协议;(3)包括试验性扩展的UDP;(4)包括简单的拥塞控制,RTT 估算和快速恢复和快速转发的TCP;(5)提供专门的内部回调接口(Raw API)用于提高应用程序性能;(6)可选择的Berkeley 接口API;3、LwIP 协议栈移植到μC/OS II 操作系统的具体实现3.1 嵌入式系统结构和LwIP 接口整个嵌入式系统的结构如图 1 所示,由ARM 微处理器、网卡、网络设备驱动、μC/OSII 操作系统、LwIP 协议栈和应用程序组成。
图 1 嵌入式系统结构图LwIP 在设计时为了适应不同的操作系统,并没有在代码中使用和某个特定的操作系统相关的系统调用和数据结构,而是在LwIP 和操作系统之间提供了一个接口层(sys_arch interface),该接口主要实现的功能包括数据类型的定义、存储模式的选择、任务间的同步、时间和内存的管理等。
因此,完成LwIP 在μC/OS II 移植,我们就是要通过修改这个接口层来实现。
同时,还要根据自己所要实现的具体目的,可以对LwIP 协议栈进行一定的裁减。
嵌入式实时操作系统uCOS-II(中文版)
嵌入式实时操作系统uCOS-II(中文版)第一章:范例在这一章里将提供三个范例来说明如何使用µC/OS-II。
笔者之所以在本书一开始就写这一章是为了让读者尽快开始使用µC/OS-II。
在开始讲述这些例子之前,笔者想先说明一些在这本书里的约定。
这些例子曾经用Borland C/C++ 编译器(V3.1)编译过,用选择项产生Intel/AMD80186处理器(大模式下编译)的代码。
这些代码实际上是在Intel Pentium II PC (300MHz)上运行和测试过,Intel Pentium II PC可以看成是特别快的80186。
笔者选择PC做为目标系统是由于以下几个原因:首先也是最为重要的,以PC做为目标系统比起以其他嵌入式环境,如评估板,仿真器等,更容易进行代码的测试,不用不断地烧写EPROM,不断地向EPROM仿真器中下载程序等等。
用户只需要简单地编译、链接和执行。
其次,使用Borland C/C++产生的80186的目标代码(实模式,在大模式下编译)与所有Intel、AMD、Cyrix公司的80x86 CPU兼容。
1.00 安装µC/OS-II本书附带一张软盘包括了所有我们讨论的源代码。
是假定读者在80x86,Pentium,或者Pentium-II处理器上运行DOS或Windows95。
至少需要5Mb硬盘空间来安装uC/OS-II。
请按照以下步骤安装:1.进入到DOS(或在Windows 95下打开DOS窗口)并且指定C:为默认驱动器。
2.将磁盘插入到A:驱动器。
3.键入 A:INSTALL 【drive】注意『drive』是读者想要将µC/OS-II安装的目标磁盘的盘符。
INSTALL.BAT 是一个DOS的批处理文件,位于磁盘的根目录下。
它会自动在读者指定的目标驱动器中建立\SOFTWARE目录并且将uCOS-II.EXE文件从A:驱动器复制到\SOFTWARE并且运行。
【精品】第8章基于ucosii的程序设计实例
第八章基于μC O S-I I的程序设计实例8.1 实例介绍为了使读者对μCOS-II操作系统有更深的理解,本章将介绍一个在STM32F103 处理器平台上使用μCOS-II实时操作系统的程序设计实例。
此实例使用英倍特公司提供的STM103V100评估板来实现一个简易温度计。
该实例使用STM103V100评估板自带的高灵敏度数字温度传感器来传送温度数据,根据实际采样周期的需要,安排了四种不同的采样方式。
采样的条件和周期可以通过键盘输入进行调节,采样得到的结果可以在评估板的液晶屏上同步显示,并通过串口将采样所得的结果送到上位机。
关于STM103V100评估板的更多内容超出本书范围,请读者参阅其它相关资料。
8.2 实例分析本节主要分析如何通过基于实时操作系统编程的方法实现整个系统的所有功能。
下面的内容将从任务划分开始,详细说明任务分析的过程。
8.2.1 实例任务划分为了更合理的将整个系统划分为不同任务,首先要明确一个好的实时系统应具备那些特点,即任务划分的基本原则是什么。
一般说来,任务划分的基本原则有以下几点:∙满足系统“实时性”:一般使用μCOS-II的嵌入式应用系统,对于响应时间要求很高,如果实时性得不到满足,系统会出现错误甚至导致难以挽回的故障。
因此在任务划分时,保证系统实时性是首要原则。
∙较少资源需求:多个任务协同运转,依靠操作系统的调度策略。
任务之间的同步,任务之间的通信,内存管理都需要消耗系统资源。
所以在任务划分时,尽量将使用同类资源的应用归入同一任务中,以减少操作系统调度时所消耗的资源。
∙合理的任务数:同一系统,任务划分的数目越多,每个任务的功能越简单,实现越容易,但任务数目的增多,加大了操作系统的调度负担,资源开销也随之加大;相反,如果任务划分的数目太少,会增加每个任务的复杂性,使任务设计难度加大。
最极端的情况,当系统任务数目减少到1时,也就失去了使用多任务操作系统的意义。
对一个具体的嵌入式应用系统进行任务划分时,可以有不同的任务划分方案。
《μCOS嵌入式操作系统》实验指导书
μ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的工具。
uCOS-II在51单片机上的移植
功能
处理临界段方式选择 堆栈增长方向 进入临界区 退出临界区 就绪态最高优先级任务运行 任务级任务切换 中断级任务切换 时钟节拍 任务堆栈初始化
表7-1 需要修改的关键函数和宏定义
6
7.1.6 INCLUDES.H
* * * * * * 文件名 : INCLUDES.H * 作者 : Jean J. Labrosse ****************************************************************************/
9
7.1.8 OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()
临界代码的概念。 uC/OS-II定义的两个宏。
{ OS_ENTER_CRITICAL(); /* µC/OS-II 临界代码段 */ OS_EXIT_CRITICAL(); }
#define OS_ENTER_CRITICAL() EA=0 #define OS_EXIT_CRITICAL() EA=1 #define OS_ENTER_CRITICAL() \
例如,任务A和任务B都要调用函数Swap(), 而该函数又使用了全局变量temp。于是当任 务A调用Swap()函数期间,系统发生了任务 切换而使任务B也调用了Swap(),那么任务B 将要改变全局变量temp的值,使任务A传递 给全局变量temp的值丢失而出现错误。
一般来说,一个可重入函数应该在函数中只 使用局部变量,因为函数的局部变量存储在 任务的堆栈中,所以可保证不同的任务在调 用同一个函数时不会发生冲突。
/ ******************* 与处理器相关的代码 ********************/ #define OS_CRITICAL_METHOD ?? #if OS_CRITICAL_METHOD = = 1 #define OS_ENTER_CRITICAL() ?? #define OS_EXIT_CRITICAL() ?? #endif
基于μCOS-II智能公交系统终端设计与实现
D e s i n a n d i m l e m e n t a t i o n o f i n t e l l i e n t b u s s s t e m g p g y / t e r m i n a l b a s e d o nμ C O S- I I
,WANG ,WANG i n S UN Y a n M e n l o n Y i n - - j g g g g
2 0 1 2年1 2月 第3 3卷 第1 2期
计算机工程与设计
C OMP UT E R E NG I N E E R I NG AN D D E S I GN
D e c . 2 0 1 2 V o l . 3 3 N o . 1 2
:T A b s t r a c t o r o m o t e s t a n d a r d i z e d m a n a e m e n t o f t h e b u s s s t e m a n d i m l e m e n t r e m o t i n m o n i t o r i n o f t h e u b l i c t r a n s o r t a t i o n s s - p g y p g g p p y / t e m, a n i n t e l l i e n t m o n i t o r i n t e r m i n a l b a s e d o n S TM 3 2 F 1 0 3 V C T 6a n d e m b e d d e d r e a l t i m e o e r a t i n s s t e mμ C O S I I i s d e s i n e d . T h e - - g g p g y g f u n c t i o n s a r e a n a l z e d a n d t h e o v e r a l l d e s i n s c h e m e i s i n t r o d u c e d . T h e s e c i f i c i m l e m e n t a t i o n o f e a c h m o d u l e i s d e s c r i b e d . T h e s s t e m y g p p y / s w i t c h i n a n d i m l e m e n t a t i o n o f s s t e m k e r n e l u n d e r C O S I I o e r a t i n s s t e m i s s e c i f i e d . P r a c t i c a l t e s t s s h o w t h a t t h e s s t e m c o n t e x t - g p y p g y p y μ l a t f o r m. r e a l i z e b u s r e m o t i n m o n i t o r i n b r e a l t i m e d a t a a c u i s i t i o n a n d t r a n s m i s s i o n o n G P R S s e r v i c e - p g g y q : ; ; K e w o r d s b u s s s t e m; r e m o t e m o n i t o r i n e m b e d d e d r e a l t i m e o e r a t i n s s t e m; i n t e l l i e n t t e r m i n a l G P R S - y g p g y g y
设计任务二 uCOS-Ⅱ的移植与应用
设计任务二uC/OS-Ⅱ的移植与应用一、设计目的:1.了解嵌入式实时操作系统u C/OS-Ⅱ可移植、可裁剪等性能特点,正确理解实时操作系统中任务、信号、消息、中断等基本概念以及u C/OS-Ⅱ多任务管理的调度算法;2.掌握u C/OS-Ⅱ在ARM7上移植的方法;3.能将u C/OS-Ⅱ移植在LPC2106中,并根据具体要求创建用户任务,解决实际问题;二、具体任务:1.u C/OS-Ⅱ移植在LPC2106中。
2.编写用户任务程序,完成实时温度的采集控制。
硬件电路见参考硬件电路图,图中用滑动变阻器代替温度传感器转换后的电压,用ADC0809完成A/D转换,并用数码管显示出来。
三、参考硬件电路。
(用文字对所设计的电路功能、原理做详细说明)附图:四、源程序。
(只将C语言应用程序附在后面,其它项目文档不要提供,C语言应用程序要有一定的注释说明)源程序:/******************************************************************** ************************************/#include "config.h"#define TASK_STK_SIZE 64INT32U NUM=0;INT32U LED[10]={0x3F,0x06,0x5b,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴级数码管显示段码表INT32U P8=0x00000100; //管脚P0.8INT32U P9=0x00000200; //管脚P0.9INT32U P10=0x00000400; //管脚P0.10INT32U P11=0x00000800; //管脚P0.11INT32U P12=0x00001000; //管脚P0.12INT32U P13=0x00002000; //管脚P0.13INT32U P14=0x00004000; //管脚P0.14OS_STK Task1Stk[TASK_STK_SIZE];OS_STK Task2Stk[TASK_STK_SIZE];OS_STK Task3Stk[TASK_STK_SIZE];void Task1(void *data);void Task2(void *data);void Task3(void *data);void IO_init(void);void delay(INT32U n);/******************************************************************** *************************************** 函数名称: main** 功能描述: c语言的主函数,由它启动多任务环境********************************************************************* ***********************************/int main (void){OSInit();OSTaskCreate(Task1, (void *)0, &Task1Stk[TASK_STK_SIZE - 1], 4);OSTaskCreate(Task2, (void *)0, &Task2Stk[TASK_STK_SIZE - 1], 5);OSTaskCreate(Task3, (void *)0, &Task3Stk[TASK_STK_SIZE - 1], 6);OSStart();return 0;}/******************************************************************** *************************************** 函数名称: Task1** 功能描述: μCOS-II的第一个任务,通常由它初始化目标板和建立其它任务********************************************************************* ***********************************/void Task1(void *p_arg){p_arg = p_arg; /* 避免编译警告*/TargetInit(); /* 初始化*/IO_init();while(1){while((IOPIN&P12)!=0);IO_init();while((IOPIN&P12)==0);IOCLR=0x0000FFFF; //输出引脚清零OSTaskSuspend(4); //任务切换}}/******************************************************************** *************************************** 函数名称: Task2** 功能描述: μCOS-II的第二个任务********************************************************************* ***********************************/void Task2(void *p_arg){p_arg = p_arg; /* 避免编译警告*/ IO_init();while(1){IOCLR=P13;delay(10); //送单次脉冲启动A/D转换IOSET=P13;delay(10);IOCLR=P13;delay(10);IO_init();while((IOPIN&P14)==0);IOSET=P11; //打开传送数据开关NUM=IOPIN; //读取数据NUM=NUM>>15;OSTaskSuspend(5); //切换任务}}/******************************************************************** *************************************** 函数名称: Task3** 功能描述: μCOS-II的第三个任务********************************************************************* ***********************************/void Task3(void *p_arg){INT32U n;INT32U A,B,C;p_arg = p_arg; /* 避免编译警告*/while(1){A=NUM/100;B=NUM%100/10;C=NUM%10;IOCLR=0x000000FF;IOSET=0x00000700;for(n=0;n<500;n++){IOCLR=P10;IOSET=LED[C];delay(20);IOCLR=0x000000FF;IOSET=P10;IOCLR=P9;IOSET=LED[B]+0x0000080;delay(20);IOCLR=0x000000FF;IOSET=P9;IOCLR=P8;IOSET=LED[A];delay(20);IOCLR=0x000000FF;IOSET=P8;}OSTaskResume(5);}}/******************************************************************** *************************************** 函数名称: 其他子函数** 功能描述: 供给多任务调用********************************************************************* ***********************************/void IO_init(){PINSEL0=0x0;PINSEL1=0x0; // PO口为普通io口IODIR=0x00002FFF; // 设置PO口的方向}void delay(INT32U n){INT32U i;for(i=0;i<=n;i++);}/******************************************************************** *************************************** End Of File********************************************************************* ***********************************/五、仿真效果。
北航ARM9嵌入式系统实验实验三uCOS-II实验
北航ARM9嵌⼊式系统实验实验三uCOS-II实验实验三 uCOS-II实验⼀、实验⽬的在内核移植了uCOS-II 的处理器上创建任务。
⼆、实验内容1)运⾏实验⼗,在超级终端上观察四个任务的切换。
2)任务1~3,每个控制“红”、“绿”、“蓝”⼀种颜⾊的显⽰,适当增加OSTimeDly()的时间,且优先级⾼的任务延时时间加长,以便看清三种颜⾊。
3)引⼊⼀个全局变量BOOLEAN ac_key,解决完整刷屏问题。
4)任务4管理键盘和超级终端,当键盘有输⼊时在超级终端上显⽰相应的字符。
三、预备知识1)掌握在EWARM 集成开发环境中编写和调试程序的基本过程。
2)了解ARM920T 处理器的结构。
3)了解uCOS-II 系统结构。
四、实验设备及⼯具1)2410s教学实验箱2)ARM ADS1.2集成开发环境3)⽤于ARM920T的JTAG仿真器4)串⼝连接线五、实验原理及说明所谓移植,指的是⼀个操作系统可以在某个微处理器或者微控制器上运⾏。
虽然uCOS-II的⼤部分源代码是⽤C语⾔写成的,仍需要⽤C语⾔和汇编语⾔完成⼀些与处理器相关的代码。
⽐如:uCOS-II在读写处理器、寄存器时只能通过汇编语⾔来实现。
因为uCOS-II 在设计的时候就已经充分考虑了可移植性,所以,uCOS-II的移植还是⽐较容易的。
要使uCOS-II可以正常⼯作,处理器必须满⾜以下要求:(1)处理器的C编译器能产⽣可重⼊代码可重⼊的代码指的是⼀段代码(如⼀个函数)可以被多个任务同时调⽤,⽽不必担⼼会破坏数据。
也就是说,可重⼊型函数在任何时候都可以被中断执⾏,过⼀段时间以后⼜可以继续运⾏,⽽不会因为在函数中断的时候被其他的任务重新调⽤,影响函数中的数据。
(2)在程序中可以打开或者关闭中断在uCOS-II中,可以通过OS_ENTER_CRITICAL()或者OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。
这需要处理器的⽀持,在ARM920T的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。
基于μCOS-II的球形机器人控制软件设计
基于μC/OS-II的球形机器人控制软件设计摘要:球形机器人是一种外壳为球形的新型的机器人,依靠球壳内部的驱动机构实现滚动行走,具有很强的姿态恢复能力和机动性,其在工业、军事和民用上有着广泛的应用前景。
本文首先介绍了结构简化球形机器人的整体软件功能;其次,设计实现了球形机器人本体控制系统,并移植嵌入式实时操作系统μC/OS-II至本体控制芯片TMS320F2812中,通过实验测试表明移植正确可行;最后设计应用任务,通过嵌入式实时操作系统的调度实现球形机器人各项功能。
实验结果表明,该球形机器人具有良好的实时性,其后期维护和功能扩展方便易行,其软件具有良好的稳定性和可靠性。
关键词:球形机器人;μC/OS-II;TMS320F2812;移植中图分类号:TP24 文献标识码:AControl software design of spherical robot based on μC/OS-IIAbstract:Spherical robot is a new kind of robot that has a global shell. This kind of robot rolls by inside drive unit. It has some special advantages as follows, strong attitude recovery ability and maneuverability, low energy consumption.Consequently, spherical robot has a bright future in fields of military affairs, industry and civil application. In this paper we propose the function structure of the control software in spherical robot with simplified structure. In the control system, we ported μC/OS-II to TMS320F2812 and tested the porting work. Finally, we designed a application task and implemented all function of spherical robot under the scheduling of μC/OS-II. Thus, robot system has better real-time performance and software has higher quality which makes maintenance and expansion easier. This paper also played a promoting role for the generalization and application of spherical robot.Keywords: spherical robot; μC/OS-II; TMS320F2812; porting球形机器人(Spherical Robot)是一种外壳为球形的新型的移动机器人,其运动方式以滚动为主。
μCOS-Ⅱ操作系统
μC/OS-Ⅱ操作系统的简介2009-05-26 22:06μc/os-ii是由jean brosse于1992年编写的一个嵌入式多任务实时操作系统。
最早这个系统叫做μc/os,后来经过近10年的应用和修改,在1999年jean j.labrosse推出了;μc/os-ii,并在2000年得到了美国联邦航空管理局对用于商用飞机的、符合rtca do178b标准的认证,从而证明μc/os-ii具有足够的稳定性和安全性。
μc/os-ii是一个可裁减、源代码开放、结构小巧、可抢占式的实时多任务内核,是专为微控制器系统和软件开发而设计的,是控制器启动后首先执行的背景程序,并作为整个系统的框架贯穿系统运行的始终。
它具有执行效率高、占用空间小、可移植性强、实时性能良好和可扩展性强等特点。
采用μc/os-ii实时操作系统可以有效地对任务进行调度;对各任务赋予不同的优先级可以保证任务及时响应,而且采用实时操作系统,降低了程序的复杂度,方便程序的开发和维护。
μc/os-ii的文件体系结构如图1所示。
图1 μc/os-ii的文件体系结构图基于μC/OS—II的嵌入式构件系统设计2009-05-26 22:08引言近些年来,随着嵌入式产品需求的不断增加,嵌入式软件正变得越来越复杂,而产品的开发周期也越来越短。
嵌入式软件开发迫切需要更高效的软件重用手段。
随着软件复用研究成为热点,其核心技术——构件化软件开发方法(CBD)引起了软件工程领域的高度关注,并且在工程应用领域获得了极大的成功。
这种开发方法已在办公应用、电子商务、因特网及分布式网络应用中广泛使用;但在嵌入式领域,构件技术仍处于起步阶段,目前没有一个统一通用的构件规范。
尽管如此,由于基于构件的软件设计方法能够极好地满足嵌入式软件几乎所有的特性(如定制、裁剪、动态演变等),有效缩短产品开发周期,这种设计方法无疑将给嵌入式系统的开发带来巨大的好处。
本文尝试将构件化软件设计思想引入嵌入式软件设计中,提出了一种适用于嵌入式软件的基于构件的软件体系结构,并且在常用输入设备键盘的应用实践中,验证了此体系结构的可行性。
μcos_II之移植篇
/**Author:Callon Huang*Version:1.0*Time:2014/11/5*blog:/u/2451220761*/希望博客也能帮到你~第一步:μcosII源码下载/downloadcenter/STM32固件库stm32f10x_stdperiph_lib.zip的下载第二步:新建文件夹,并准备子目录:其中Software是μcosII源码下载完成后拷贝过来的,其它的都自己新建.App 用来存放应用程序文件,Bsp 用来存放版级驱动文件,Lib 用来存放 STM32 的标准外设库文件,Source 用来存放uCOS 文件第三步:把Software里的uCOS-II、uC-LIB和uC-CPU文件夹到Source里并把后两者拷贝到uCOS-II文件夹里,最后如下:第四步:找到Software\EvalBoards\ST\STM32F103ZE-SK\IAR下的BSP文件夹,复制到Source文件夹下第五步:找到Software\EvalBoards\ST\STM32F103ZE-SK\IAR下的OS-Probe-LCD文件夹,复制到Source文件夹下并改名为APP第六步:解压下载好的stm32f10x_stdperiph_lib.zip固件库:找到stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Librari es\STM32F10x_StdPeriph_Driver下的inc和src文件夹并复制到Lib 文件夹下第七步:复制stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Librari es\CMSIS下的CM3文件夹到Lib文件夹下第八步:删除一些不需要的文件:APP文件夹只需要:BSP文件夹只需要:在Software\CPU\ST\STM32里也有inc和src文件夹,但是比STM32固件库的要多两个文件stm32f10x_systick.c和stm32f10x_systick.h把这两个文件拷贝到SysTick文件夹下.第九步:建立工程my_ucosII,把所有的.c文件和.asm文件都加进来:‘第十步:对工程进行一些设置:Device就不用说了;Target不变;Output勾选上Create HEX File,并在里选择Obj文件夹;C/C++中添加头文件所在路径,否则会出现大量如下编译错误:头文件路径:Libraries文件夹是这三个最后这部分全部设置好后,如下:最后总体设置完如下:Debug里最后下载程序的时候,如果碰到MDK中出现“Error Flash download failed-Cortex-M3”错误,可以通过上面的添加On-chip-Flash来解决。
ucosii任务管理及调度
统计任务OSTaskStat(),提供运行时间统计。每 秒钟运行一次,计算当前的CPU利用率。其优先级 是OS_LOWEST_PRIOR-1,可选。
22
任务控制块TCB 任务控制块 OS_TCB是描述一个任务的核 心数据结构,存放了它的各种管理信息 ,包括任务堆栈指针,任务的状态、优 先级,任务链表指针等;
11
µC/OS-II的各种商业应用
全世界有数百种产品在应用:
Avionics Medical Cell phones
Routers and switches
High-end audio equipment Washing machines and dryers UPS (Uninterruptible Power Supplies)
19
任务也可以自我删除(并非真的删除,只是内核不 再知道该任务)
void MyTask (void *pdata) {
UCOS-II硬件抽象层驱动框架设计
case 'c': i = -1; nval = va_arg(ap,int); Dev->DevPutch((uint8*)&nval,1); break; case 's':i = -1; PointChar = (char *)va_arg(ap,int); nval = *PointChar; while(nval){ nval = *PointChar; if(nval!=0){ Dev->DevPutch(PointChar,1); } PointChar++; } break; default : break; } for( ;i >= 0;i--){ nval = strval[i]+48; Dev->DevPutch((uint8*)&nval,1); }
(图 1 通用驱动框架模型) (2)设备管理核心数据结构层:这是通用驱动框架的核心,主要用每个 设备分配一个设备控制块,通过链表形式进行管理,该链表定义为设备控制 块链表 DEV_CONTROL_BLOCK* HvlConList。在这一层,为系统中的每个硬件 设备分配唯一的设备 ID,上层应用程序通过将设备 ID 作为参数传递给 DeviceOpen 函数实现对相应设备的核心管理数据结构的定位搜索,通过搜 索,DeviceOpen 函数找到相应设备控制块,申请设备的使用权限,获得相应 硬件设备的操作句柄,该句柄指向具体的外设底层操作函数列表,返回该设 备句柄;再通过上层抽象接口层提供的接口函数对设备进行访问。 (3)硬件设备驱动模块层:这一层是硬件设备驱动模块功能的实现层, 对各个硬件设备的驱动在相应的硬件设备驱动模块中完成。各个硬件设备驱 动模块, 原则上 需要实现如下几个函数: DevGetch、 DevPutch、 DevControl, 分别完成相应设备的读、写、控制,当然,可以根据具体设备的特性,只实 现 3 个驱动函数的其中一部分,例如,如果某设备不支持 写操作,那么就不 用实现 DevPutch 函数。 下面,对该模型的工作原理进行简单描述:首先,在上层应用程序可 以访问硬件设备之前,需要首先打开欲操作的设备,这可以通过调用“上层 抽象接口层”的 DeviceOpen 函数实现。上层应用程序将欲打开的设备的设 备 ID 传递给 DeviceOpen 函数,DeviceOpen 函数通过该设备 ID 从设备控制
ucos-ii嵌入式操作系统复习选择题
ucos-ii嵌入式操作系统复习选择题01、删除任务,是说任务将返回并处于(),任务的代码不再被μC/OS-II调用。
【A】休眠状态【B】等待状态【C】就绪态【D】中断状态02、任务一旦建立,这个任务就进入了()【A】睡眠状态【B】等待状态【C】就绪态【D】运行态03、μC/OS-II中,下列哪个系统函数不能够引起任务调度()【A】OSStart()【B】OS_TASK_SW()【C】OSTaskSuspend()【D】OSTaskResume()04、任务是一个无返回的无穷循环,μC/OS-II总是进入就绪态的()的任务【A】最高优先级【B】最低优先级【C】第二高优先级【D】任意优先级05、ANSI C中,可以用malloc()和free()两个函数动态地分配和释放内存,下面关于这两个函数,说法正确的是()【A】嵌入式实时操作系统中,调用这两个函数却是安全的【B】多次调用这两个函数,不会产生大量内存碎片【C】malloc()和free()函数的执行时间是确定的【D】可能使得内存无法再分配使用06、以下哪个部分不属于μC/OS-II的任务的组成部分()【A】函数【B】任务堆栈【C】任务控制块【D】线程07、当___时由运行状态转为就绪状态?()【A】任务的CPU使用权被剥夺【B】等待某一事件的运行【C】任务获得了CPU的使用权【D】任务响应中断申请08、μCOS-II操作系统不属于()。
【A】RTOS【B】抢占式实时操作系统【C】分时操作系统【D】嵌入式实时操作系统09、对于μCOS-II操作系统,以下说法不正确的是()【A】任务可以有类型说明【B】任务可以返回一个数值【C】任务可以有形参变量【D】任务是一个无限循环10、在μC/OS-II系统中,OSTimeTick()函数只被以下()函数或过程所调用。
【A】OSTickISR【B】OSShed【C】OSCtxSw【D】OSIntCtxSw11、下面临界区概念论述正确的是()【A】临界区是指进程中用于实现进程互斥的那段程序代码【B】临界区是指进程中用于实现进程同步的那段程序代码【C】临界区是指进程中用于实现进程通信的那段程序代码【D】临界区是指进程中用于访问临界资源的那段程序代码12、多道程序设计是指()。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在μC/OS-II下,设计了一个通用的设备管理模型,称为通用驱动框架,通过该驱动框架,可以实现对硬件设备的统一、一致的管理,同时,也为上层应用程序提供了统一、一致的设备访问在μC/OS-II下,设计了一个通用的设备管理模型,称为通用驱动框架,通过该驱动框架,可以实现对硬件设备的统一、一致的管理,同时,也为上层应用程序提供了统一、一致的设备访问接口,并在以ARM7TDMI-S为核心的LPC2210微控制器开发板上给出了一例实现。
1、概述在嵌入式应用系统中使用嵌入式操作系统可以提高应用系统的开发效率和提升嵌入式应用系统的稳定可靠性,因此,在嵌入式应用系统中使用嵌入式操作系统将成为嵌入式应用系统的设计主流[1]。
μC/OS-II是由美国学者Labrosse设计的一个优秀的嵌入式实时操作系统[2],它是一个源码公开、可移植、可固化、可裁剪、占先式的实时多任务操作系统,目前已经得到广泛应用。
μC/OS-II提供了操作系统必须具备的基本功能,包括:任务管理、信号量管理、邮箱管理、消息队列管理、事件管理、时间管理、内存管理,但它不提供设备管理和文件系统管理,已有研究者对μC/OS-II进行了文件子系统功能扩展[3]。
在实际应用中,对系统设备的有效管理也是一个非常重要的任务,因此,需要对μC/OS-II进行扩展,以实现这一功能。
本文为μC/OS-II设计了一个对系统设备进行统一管理的通用驱动框架,在此框架下,可以屏蔽系统硬件的差异,在无约束地发挥硬件能力的前提下,为上层应用提供了统一、一致的调用接口 API,从而实现了对系统设备的有效管理。
2、μC/OS-II下通用驱动框架的基本模型为了给上层应用提供统一、一致的系统设备调用接口,需要对上层应用程序对系统设备的访问操作进行抽象,在这方面,Unix系统和Linux系统做得比较成功[4][5]。
本文借鉴了Unix及Linux系统的成功经验,同时考虑到嵌入式操作系统的特殊性,为μC/OS-II 建立了如图1所示的通用驱动框架模型。
在图1所示的通用驱动框架模型中,共包括三个层次:(1)上层访问抽象接口层:在这一层,通过对设备访问操作的抽象,为上层应用提供了5个访问接口API:UDFOpen、UDFRead、UDFWrite、UDFIoctrl、UDFClose,分别用于打开设备、读设备、写设备、设备控制和关闭设备。
(图1 通用驱动框架模型)(2)设备管理核心数据结构层:这是通用驱动框架的核心,在这一层,为系统中的每个硬件设备分配唯一的设备名,上层应用程序通过将设备名作为参数传递给 UDFOpen 函数实现对相应设备的核心管理数据结构的定位寻址,通过寻址,UDFOpen函数得到相应设备的核心管理数据结构,并定位到相应的设备驱动模块,获得相应硬件设备的操作函数表,再通过上层访问抽象接口层的其他接口函数UDFRead、UDFWrite、UDFIoctrl 和UDFClose 实现对设备的统一访问控制。
(3)硬件设备驱动模块层:这一层是硬件设备驱动模块功能的实现层,对各个硬件设备的驱动在相应的硬件设备驱动模块中完成。
各个硬件设备驱动模块,原则上需要实现如下几个函数:devOpen、devRead、devWrite、devIoctrl和 devClose分别完成相应设备的打开、读、写、控制和关闭,当然,可以根据具体设备的特性,只实现5个驱动函数的其中一部分,例如,如果某设备不支持写操作,那么就不用实现devWrite 函数。
下面,对该模型的工作原理进行简单描述:首先,在上层应用程序可以访问硬件设备之前,需要首先打开欲操作的设备,这可以通过调用“上层访问抽象接口层”的 UDFOpen函数实现。
上层应用程序将欲打开的设备的设备名传递给UDFOpen函数,UDFOpen函数通过该设备名从“设备管理核心数据结构”中得到相应设备的核心数据结构,进而得到相应设备的操作函数表,并调用设备驱动模块的devOpen函数对设备进行初始化,当完成相应设备的初始化后,UDFOpen函数返回给上层应用程序一个句柄,这个句柄是上层应用程序进行后续设备操作的基础。
现在假设上层应用程序需要从设备中读取数据,这是通过调用“上层访问抽象接口层”的UDFRead函数完成的:上层应用程序将UDFOpen函数返回的设备句柄和相关的读取参数传递给UDFRead函数,UDFRead函数通过该句柄从“设备管理核心数据结构”中得到相应设备的核心数据结构,进而得到相应设备的操作函数表,并调用设备驱动模块的devRead函数对设备进行读取操作,当完成读取操作后,将读取到的数据返回给上层应用程序。
其它的操作如 UDFWrite、UDFIoctrl和UDFClose是类似的。
3、μC/OS-II下通用驱动框架的实现 3.1 实现环境本文在以下的环境中实现了所设计的通用驱动框架:开发工具采用ARM公司的ADS 1.2,目标板采用周立功公司开3、μC/OS-II下通用驱动框架的实现3.1 实现环境本文在以下的环境中实现了所设计的通用驱动框架:开发工具采用ARM公司的ADS 1.2,目标板采用周立功公司开发设计的以LPC2210为微控制器的SmartARM2210开发板[6]。
LPC2210是一颗以ARM7TDMI-S为核心的微控制器,支持8位、16位、32位总线,具有丰富的片内外设,其中就包括两个具有16Bytes FIFO的UART接口和高速I2C接口。
开发主机通过EasyJTAG连接目标板以建立交叉开发调试环境。
3.2 设备管理核心设计数据结构的设计实现如上文所述:通用驱动框架以“设备管理核心数据结构”为核心,它在模型中起着承上启下的作用。
设备管理核心数据结构包括两个结构:UDFFramework和UDFOperations,定义如下:typedef struct {INT8U deviceName[UDF_MAX_NAME]; //设备名INT8U deviceType; //1—块设备, 2—字符设备;INT8U canShared; //0---不可共享使用, 1—可共享使用INT16U openCount; //对于共享设备,此字段为打开次数计数;UDFOperations op; //设备驱动模块提供的设备操作函数表;} UDFFramework;该结构描述了系统设备的特性,包括:设备名、设备类型、共享设备的打开计数、设备操作函数表等,通过建立UDFFramework结构的一个数组来描述系统中的所有设备,并通过设备名字段deviceName实现对设备操作函数表UDFOperations 结构的寻地定位。
UDFOperations结构定义如下:typedef struct {INT32S (*devOpen)(void *pd);INT32S (*devRead)(INT8S *buffer, INT32U blen, INT32U lenToRead, INT8U waitType);INT32S (*devWrite)(INT8S *buffer, INT32U lenToWrite, INT8U waitType);INT32S (*devIoctl)(INT32U too, void *pd);INT32S (*devClose)(void *pd);} UDFOperations;该结构定义了相应设备的操作函数表,具体的操作函数的实现在相应的设备驱动模块中提供,通过使用通用驱动框架的设备驱动安装函数可以将设备驱动模块安装到UDFFramework结构中。
3.3 上层访问抽象接口层设计实现基于设备管理核心数据结构,上层访问抽象接口层为上层应用提供了5个API函数:UDFOpen、UDFRead、UDFWrite、 UDFIoctrl、UDFClose。
本文以UDFOpen 和UDFRead为例说明这些API函数的实现逻辑。
UDFOpen函数的实现逻辑如下:INT32S UDFOpen(char *deviceName, void *pd){在UDFFramework结构数组中查找名为deviceName的设备;if (找到名为deviceName的设备) {if (设备已被其它应用打开) {if (设备不可共享)返回出错信息并返回;else将设备的打开计数器openCount加1}else {从UDFFramework结构中得到该设备的UDFOperations结构数据并调用该设备的devOpen函数初始化该设备;将UDFFramework结构的数组下标作为句柄handle返回给上层应用程序;}}else {提示设备驱动未安装并返回;}}UDFRead函数的实现逻辑如下:INT32S UDFRead(INT32U handle, INT8S *buffer, INT32U blen, INT32U lenToRead, INT8U waitType){判断参数handle句柄是否合法;if (handle合法)return UDFF[handle].op.devRead(buffer, blen, lenToRead, waitType);else返回出错信息并返回;}3.4 硬件设备驱动模块的设计实现本文在该通用驱动框架下实现了UART0设备和I2C接口设备CAT1025JI-30的E2PROM 设备的驱动模块。
LPC2210的UART0设备满足16C550工业标准,具有16Bytes的接收FIFO和16Bytes的发送FIFO,本文采用中断方式接收数据、查询方式发送数据,按照通用驱动框架设备驱动模块的设计要求,为UART0实现了以下驱动函数:UART0Open、 UART0Read、UART0Write、UART0Ioctrl、UART0Close,并通过通用驱动框架的设备驱动程序安装函数 InstallDriver将UART0驱动模块安装到UDFFramework结构数组中。
对CAT1025JI-30设备的驱动模块的实现是类似的。
4、结束语本文在μC/OS-II下设计了一个通用驱动框架模型以实现对系统硬件设备的统一、一致的管理,并在以ARM7TDMI-S为核心、以LPC2210为微控制器的开发板上进行了实现,结果表明,该框架实现简单但效率和可靠性方面都有比较好的表现。
同时,虽然该框架是在LPC2210开发板上实现的,但代码是用ANSI C编写的,可以较容易地移植到其它类型的目标板上。