资源描述
分类号 密级
U D C 编号
本科毕业论文(设计)
题 目 基于μC/OS-II操作系统的小车运动控制
院 (系)
专 业
年 级
学生姓名
学 号
指导教师
二○一三 年 六 月
湖北文理学院
学位论文原创性声明
本人郑重声明:所呈交的学位论文是本人在导师指导下独立进行研究工作所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。本人完全意识到本声明的法律后果由本人承担。
学位论文作者签名: 日期: 年 月 日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保障、使用学位论文的规定,同意学校保留并向有关学位论文管理部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权省级优秀学士学位论文评选机构将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
本学位论文属于
1、保密 □ ,在_____年解密后适用本授权书。
2、不保密 □。
(请在以上相应方框内打“√”)
学位论文作者签名: 日期: 年 月 日
导师签名: 日期: 年 月 日
2
摘 要
近些年,数字技术得到高速发展,嵌入式技术已经出现在我们生活中的每个地方。嵌入式操作系统又作为嵌入产品的基本,在发展过程中担任了越来越重要的角色。本文主要探讨了嵌入式操作系统中应用较为应用多的、开源的μC/OS-II系统在STM32芯片上的移植,并且在此系统上实现小车躲避障碍的运动控制。
本文先行介绍了μC/OS-II实时系统的内核结构,包括第一部分μC/OS-II的中的任务、事件等基本概念以及操作系统对任务和事件的一些操作。然后介绍了本次移植使用的STM32F103系列微处理器并介绍了该微处理器内核Cortex-M3的结构及其编程模型和部分本次试验所用的STM32F013系列微处理器的外设。然后以此为基础分析了μC/OS-II在STM32F103系列芯片上的移植,并讲解了μC/OS-II操作系统因移植需要改写的代码的结构和如何编写。然后,应用STM32F103微处理器芯片上的部分外设,实现串口通信、红外检测模块、LCD显示,电机控制,这些任务在系统的调度下自动切换、不断地运行。这些代码都在基于ARM Cortex-M3的stm32单片机开发板上完成了测试工作。测试所得到的现象就是红外发射器不停发射信号,接收器同时接收返回信号、通过反馈的红外信号控制车轮转动、LCD则实时显示小车运动状态。这些也就反应了μC/OS-II的多任务特性。
关键词:μC/OS-II移植;STM32;运动控制;红外探测;LCD显示;
Abstract
Nowadays with the rapid development of digital technology, embedded products have appeared in every aspect of our lives. Embedded operating system, which is the basis of embedded products, plays an increasingly irreplaceable role. In this paper, an embedded operating system,μC/OS-II, which is open source and widely used will be introduced, and then the presentation of the port of μC/OS-II to chip STM32F103 will be shown, and realize the car motion control on this system.
This paper at first analyzes the structure of the kernel of the real-time system, μC/OS-II and then introduces some basic concept of μC/OS-II such as task , event etc.,and the operation of them . After this, the microprocessor STM 32F103 serials, and its peripherals, which are used in the port experiment, will be described, and the structure and programmer‘s model of its Cortex–M3 kernel will be introduced briefly too. Then on this basis, introduce the port of μC/OS-II in STM32F103 serial chips; the part of CPU-related code which needs to be modified will be described at length. Finally, LCD display , infrared detection ,and Motion control will be realized. These tasks are scheduled by the OS automatically and running all the time .what’s more, the code has passed test on OPEN-STM32 board. The phenomenon of this test is : The infrared detection module send and receive signal, based on this signal the electrical machine module control the car avoid the barrier and meanwhile ,the LCD display module show the move state on LCD. All of these reflects the feature of multi-task about μC/OS-II.
Key words: μC/OS–II port; STM32; LCD display; infrared detection; Motion control
目 录
摘 要 I
Abstract.. II
1. 绪论 1
1.1. 引言 1
1.2. 课题背景,研究目的和意义 1
1.2.1. 课题背景 1
1.2.2. 研究目的和意义 2
1.3. μC/OS-II的移植概述 2
1.3.1. μC/OS-II的内核结构 2
1.3.2. STM32系列微处理器简单介绍 4
1.3. 国内外在该方向的研究现状及分析 4
1.5. 本文主要研究的内容 5
1.6. 本论文结构 5
1.7. 本章小结 6
2. RTOS概念和μC/OS-II内核结构简要分析 7
2.1. RTOS 7
2.1.1. 实时系统的基本要求 7
2.2. 实时操作系统的特点 7
2.3. 实时系统μC/OS-II的分析 8
2.3.1. μC/OS-II的任务结构 8
2.3.2. μC/OS-II任务的管理 12
2.3.3. μC/OS-II任务的调度 13
2.3.4. 任务的初始化和启动 13
2.3.5. 中断和时钟 13
2.3.6. 任务间的通信 14
2.4. Cortex-M3内核简介 14
2.5. Cortex-M3内核编程模型 14
2.6. STM32F103系列处理器介绍 15
2.7. 本章小结 16
3. 在STM32F103系列处理器上的移植 17
3.1. 移植关键代码分析(OS_CPU.H)(OS_CPU_A.ASM)(OS_CPU.C) 17
3.1.1. 定义与处理器无关的数据类型 17
3.1.2. 临界代码段 17
3.1.3. 栈的增长方向 18
3.1.4. 任务级任务切换 18
3.1.5. 中断级任务切换 18
3.1.6. OS_CPU_PendSVHandler中断处理函数 19
3.1.7. 关中断函数(OS_CPU_SR_Save()) 20
3.1.8. 恢复中断函数(OS_CPU_SR_Restore()) 20
3.1.9. 启动最高优先级任务运行(OSStartHighRdy()) 21
3.1.10. 与CPU相关的C函数和钩子函数(OS_CPU_C.C) 22
3.1.11. 定时器初始化函数OS_CPU_SysTickInit() 24
3.1.12. 时钟中断服务函数OS_CPU_SysTickHandler() 24
3.2. 若干细节 25
3.2.1.系统的剪裁(OS_CFG.H) 25
3.2.2.关于启动代码的修改 25
3.3. 本章小结 26
4. 在STM32开发板上实现 27
4.1. STM32开发板概述 27
4.2. 工程简介 28
4.3. 红外发射模块 29
4.3.1 硬件电路 29
4.3.2. 软件代码 30
4.4. 电机驱动模块 31
4.4.2. 代码实现 32
4.4.3. 实现结果 32
4.5. LCD显示模块 33
4.5.1. 硬件电路 33
4.5.2. 软件代码 34
4.5.3. 实现结果 35
4.6. 主函数 35
4.7. 执行效果 37
4.8. 本章小结 37
结 论 38
致 谢 39
[参考文献] 40
IV
┊
┊
┊
┊
┊
┊
┊
┊
┊
┊
┊
┊
┊
装
┊
┊
┊
┊
┊
订
┊
┊
┊
┊
┊
线
┊
┊
┊
┊
┊
┊
┊
┊
┊
┊
┊
┊
┊
湖北文理学院 毕业设计(论文)报告纸
1. 绪论
1.1. 引言
电子计算机无疑是人类目前一项伟大的发明。从1946年宾夕法尼亚大学研制成第一台电子计算机开始,计算机就一直向前发展。到了现在的21世纪,就是所谓的“后PC”时代,计算机技术已经进入人们生活的每个部分。应用最广泛的计算机产品就是嵌入式计算机。据统计,90%的计算机为嵌入式[1, 2]计算机。随着信息迸发的时代的到来,给大家带来更多的方便和享乐。与此同时,我们会面临更多的挑战,其中就有:嵌入式系统已经越来越复杂,而且复杂程度依然在不断的加大,甚至到失去控制的局面。所以对嵌入式系统的研究非常有价值也很有必要。
1.2. 课题背景,研究目的和意义
1.2.1. 课题背景
嵌入式技术[3-5]是嵌入式系统生产的技术基础。包含了嵌入式软件中间件、嵌入式操作系统、嵌入式IC设计(含嵌入式微处理器和SOC设计),MEMS技术和智能传感器技术行业等。嵌入式系统产业是以行业需求决定的,基于功能设计、系统结构设计、工程设计的产业。嵌入式系统产业分布到社会的各个具体的行业,该行业系统和标准决定了嵌入式系统产品是以合适的嵌入式技术作为关键并结合应用软件、系统集成开发为特征。区别于传统的通用计算机系统,嵌入式系统指向特定的应用功能,根据人们的需求专门制作,并跟随智能化产品的广泛需求应用带生活中的方方面面。嵌入式软件变成产品数字化、智能化的关键性技术。并且嵌入式软件以嵌入式操作系统为支持。
近年来嵌入式实时操作系统[1, 6, 7](RTOS)飞速发展,各种广泛应用的MCU,8位、16位和32位均可以方便的移植多种嵌入式操作系统。8位、16位MCU以工业控制为主,32位以面向智能机器和多媒体处理方面,并且Linux正慢慢成为嵌入式操作系统的主流系统[8-13]。嵌入式实时操作系统有很多优点,比如微型化、实时性等特征,并且还将向高可靠性、智能化、多核、构件组件化的方向发展。社会对嵌入式的这些优点有很强的需求,使得很多种的操作系统并存于世,互相竞争。嵌入式技术也因此不断发展,不断创新。
μC/OS-II[2, 7, 14, 15]是个优秀的并且开源的嵌入式操作系统,为了成功满足可移植的特性,很多的关键代码用C语言写,极少部分用汇编语言编写。对于嵌入式系统,应该会对嵌入式系统内核本身进行一些裁剪,修改操作系统的部分代码,以实现μC/OS-II在不同平台上的移植。
1.2.2. 研究目的和意义
由于目前的MCU结构设计的越来越复杂,在上面的系统跟随他变得更加的复杂。并且也更加强大,随之产生的就是嵌入式的操作系统,这些专用的嵌入式操作系统来管理复杂的硬件。如此应用程序开发人员可以开发更多的应用程序,同时提高了嵌入式系统的各项性能。而对于商用嵌入式操作系统,开放源代码的μC/OS-II凭借其优势,在市场中占有一席之地。并且,这个系统已经通过美国的FAA安全认证,足以证明μC/OS-II的性能是值得依靠的。并且,μC/OS-II是实时内核[16-18],对嵌入式应用有专用性,可用于各种单片机,能在许多领域发挥自己的作用。μC/OS-II是一个基于抢占式的实时多任务内核,可剪裁、可固化、稳定、可靠,此外,该系统最关键是开放源代码,便于移植和维护。
Arm处理器运算能力强大、应用也广泛,因此也要使用更好的操作系统才能发挥其作用。μC/OS-II作为开源系统,完全符合嵌入式应用的要求,开源使得整个系统更加透明,减少了系统中的隐患,并且μC/OS-II系统能够裁剪,移植更加的分便,并且使得系统更加灵活。使嵌入式系统易开发、易管理、易维护,成本低廉[19-25]。综上所述,本研究在现实中具有重大并且实际的意义。
1.3. μC/OS-II的移植概述
1.3.1. μC/OS-II的内核结构
对于Uc/os-ii,这个操作系统首先得来看看它的内核结构,如图1-1所示。
先讲解下图中的架构。在图中上部,是应用程序,这个好理解,应为考虑到应用程序的移植问题,应用程序必须有很好的移植行,主要的代码要与系统的硬件无关,所以在最顶部。
中间左边是系统的内核的代码,这部分代码占了所有代码的一大部分。这也体现了这个系统的良好的可移植性。是这个系统的一大优势。在整个移植的过程中这一部分的代码是不需要更改的就可以直接搬过去。为移植节省了很多工作。
图1-1 μC/OS-II的内核结构
中间右边是两个头文件。OS_CFG.H跟系统的剪裁有关。配置此文件,可以对该系统进行剪裁,达到嵌入式系统所需求的样子。INCLUDES.H是包含了所有的头文件,在移植是只需要把要加的头文件加载这个文件中就可以了。
最后一个部分是更移植紧密相关的文件,这是移植时需要修改的关键的代码的所在,这里面主要是编写和处理器相关的代码,是移植工程中的重头戏。里面的内容和代码的编写将在后面的章节中重点的介绍。
1.3.2. STM32系列微处理器简单介绍
2007年意法半导体推出了stm32,以cortex-m3为内核的系列处理器[16-18]。它有优秀电源管理系统,耗电量低。并且片内还集成了多种外设ad转换,串口等等,片内集成了128kB flash和64kB的SRAM。根据外设扩展又分为STM32F101、STM32F103两种,其中STM32F101为基本型,STM32F103为扩展类型。本次试验用的是STM32F103型号的芯片,能够很好胜任搭载系统的任务。配合上多种外设,能够完美的完成各种任务设计。所以,我们选择这款芯片作为我们试验的主芯片。
1.3. 国内外在该方向的研究现状及分析
21世纪以来,国内外,嵌入式系统得到了很好的发展。随着对其研究的这件深入,嵌入式系统将向智能化、网络化、集成化、规范化的方向发展。并与各行各业有这不可分割的联系,嵌入式系统会应用到社会的方方面面,也一定会在我国的发展中占据着不可替代的作用。
现在技术在飞快的前进,我们将会发现嵌入式技术在一步步深入的改变着我们的生活。嵌入式技术已经深深扎根进了我们的生活,可以说我们已经离不开嵌入式的设备了。现在消费者这市场购买的电子产品基本上都和嵌入式技术有着紧密的联系。不仅如此,嵌入式产品军事、工业控制等重要领域起着重要的作用。
嵌入式产品的应用需要一套高效,低成本的方案。我们的选择也有一些,但是大的架构师类似的,如图1-2所示下。
图1-2 一般嵌入式系统结构
在硬件方面,由硬件厂商为我们解决了很多问题。现在的硬件,微处理器等硬件的性能强,效率越来越高,功耗还很低,这对完善嵌入式功能提供了有效的依靠。
软件方面,许多优秀的操作系统的出现也使之成为可能,所以软件方面也不需要担心。但是,怎么选择操作系统我们还是需要做一些选择的。例如VxWorks、WinCE好用是好用但是需要收取一定的费用,我们不能接受。而且不是开源的软件不好维护;uClinux十分复杂,移植技术要求高,时间久。综合各种优缺点我们选择了ucos,μC/OS-II开源。并且代码只有约5500行,而且已经在各个领域有了实际的应用,所以我们选择了这个系统作为我们的研究对象。
1.5. 本文主要研究的内容
先介绍了μC/OS-II内核的源代码结构[26-30],后介绍了STM32系列微处理器。描述了μC/OS-II在STM32F103微处理器上移植的完整移植过程和代码的编写,并且详细分析了移植中的部分关键代码,并且介绍了应用代码的编写及其硬件原理。最后将通过应用程序分别在stm32 cortex-m3开发板上验证移植的正确性。这些以用程序利用STM32的外设,在stm32 cortex-m3开发板上实现了红外线探测模块、电机驱动和LCD显示等多任务;在stm32 cortex-m3开发板上实现了基于ucos-ii的小车运动控制。本文给出了在这个开发板上的完整的代码编写过程。
1.6. 本论文结构
本论文结构如下:
第一章:本论文的绪论部分。介绍课题的来源、背景、目的和意义。然后分析了目前国内外在该领域的发展状况。
第二章:主要分析了μC/OS-II内核的结构。介绍实时操作系统的概念,简要分析了μC/OS-II的任务及其任务管理、调度,最后简要介绍了μC/OS-II的中断和多任务之间的通信。
第三章:详细介绍μC/OS-II在STM32F103系列处理器上的移植
第四章:简单介绍stm32开发板,工程简介,介绍红外发射模块,介绍电机驱动模块,介绍lcd驱动模块,主函数介绍,实现效果。
1.7. 本章小结
本章为整个论文的绪论,主要介绍了选题来源、目的意义,并分析了国内外在嵌入式系统μC/OS-II移植方面的现状。然后指出了本论文主要的研究内容。最后说明了整个论文的篇章结构。
2. RTOS概念和μC/OS-II内核结构简要分析
2.1. RTOS
RTOS (Real Time Operate System),实时操作系统。实时含有立即、及时之意。如果操作系统能使计算机系统及时响应外部事件的请求,并能及时控制所有实时设备与实时任务协调运行,且能在一个规定的时间内完成对事件的处理,那么这种操作系统就是一个实时操作系统。
2.1.1. 实时系统的基本要求
对实时操作系统有两个基本要求:第一,实时系统的计算必须产生正确的结果,称为逻辑或功能正确(Logical or Functional Correctness);第二,实时系统的计算必须在预订的周期内完成,称为时间正确。
2.2. 实时操作系统的特点
嵌入式系统主要是对设备和装置进行控制的,在这些场合,系统能否及时快速的响应外部事件,常常是对系统的第一要求,因此嵌入式系统使用的操作系统大多是实时操作系统。对于一个实时操作系统来说,就是要求他在现有的硬件条件下,在接收输入后要尽快的计算出输出结果,并应使应用程序设计者在应用程序设计时,就能预先准确地确定完成任务所需要的最长时间。
为了达到上述要求,实时操作系统应满足以下三个条件:
l 实时操作系统必须是多任务系统
l 任务的切换时间应该与系统中的任务数无关
l 中断延时的实践可预知并尽可能短
任务提高了设备(或者CPU)的利用率,这点事容易理解的。如果是单任务的话,当此任务所需要的条件没有被满足时,比如等待磁盘IO,此时CPU只能等待,无疑这极大的降低了硬件的利用率。任务必然存在任务间的切换。当然切换需要按照一定的规则,这个工作一般是由调度器完成的。调度器调度的过程当然需要一段时间。为了满足实时性的要求,这个延时要求尽可能小并且可预测,即在最坏的延时下是否能满足实时的要求。
2.3. 实时系统μC/OS-II的分析
μC/OS-II是一个优秀的操作系统。代码不长,在实时性也表现十分优秀这系统的服务是以任务的形式变现。每个任务有一个优先级,有内核进行调度。
任务是这个系统的核心,先看看任务的结构,然后在分析μC/OS-II对任务的管理和任务间的通信。
2.3.1. μC/OS-II的任务结构
μC/OS-II的任务 :
上面说了这个系统的核心就是它的任务,它也是通过任务来对不同事件进行响应和处理的。从代码上来看,μC/OS-II的任务大都为如下结构(C语言描述,后同):
void uCOSTask(void *p)
{
while(1)
{
任务具体的功能;
}
}
任务的存储结构和状态 :
系统中任务总共三个部分组成,分别是任务的代码部分、任务堆栈、任务控制块。其中任务控制块保存任务的属性;任务堆栈在任务进行切换时寄存器的数值和任务的运行状态;任务代码部分可以理解为一个完成一定任务的函数。任务存储结构如图2-1所示。
任务就是以下的块的形式存储在内存中的。所有的任务形成一个链表,每一个节点都由一个这样的结构组成。
嵌入式芯片一般是单核,所以一次只能处理一个任务。μC/OS-II的任务一共有5种状态:睡眠、就绪、运行、等待和中断服务,任务在这五中状态之间切换。并且cup切换的速度十分的迅速,在用户的角度看起来所有的任务近似是同时执行的,这也是多任务的操作系统比起裸机程序的一个巨大的优势和特点。
下图展现的是系统中任务的存储的结构。下文中会对这个结构做一个较为详细的介绍。
图2-1 任务的存储结构
现在介绍任务的每个状态的详细情况:
睡眠:任务仅仅以代码的形式驻留在程序存储器中,没有分配任务控制块或者任务控制块被删除。因此操作系统还没有管理这个任务,此时任务的状态叫做睡眠状态。
就绪状态:任务已经分配到了任务控制块并且具备了运行的条件,在就绪表中已经登记,等待运行的状态。
运行状态:就绪的任务获得了微处理器的使用权就立即进入运行状态,此时该任务占有微处理器的使用权。
等待状态:正在运行的任务,由于需要等待一段时间或者等待某个条件的满足,需要让出微处理器的使用权。此时任务处于等待状态。
中断服务状态:一个任务正在运行,当突然有一个中断产生时,微处理器会终止该任务的运行转而去处理中断,此时该任务为中断服务状态。
由下图可以看出,任务总是在五中状态之中来回切换,换句话讲任务在系统中必然会是下面五个状态中的一个。并且只有在中断中的服务程序或者是已经是就绪的任务有机会或者cpu,进而执行代码,其他状态的任务是不能执行的。
图2-2 任务各种转台之间的转换
任务控制块:
任务控制块储存了任务的关键参数,包括链表的指针,栈顶指针,等等。是任务组成的一个关键部分。
其具体的代码及分析如下:
typedef struct os_tcb {
OS_STK *OSTCBStkPtr; //当前TCB的栈顶指针
#if OS_TASK_CREATE_EXT_EN > 0 //允许生成OSTaskCreateExt()函数
void *OSTCBExtPtr; //指向用户定义的任务控制块
//(扩展指针)
OS_STK *OSTCBStkBottom; //指向指向栈底的指针
INT32U OSTCBStkSize; //设定堆栈的容量
INT16U OSTCBOpt; //保存OS_TCB的选择项
INT16U OSTCBId; //否则使用旧的参数
#endif
struct os_tcb *OSTCBNext; //定义指向TCB的双向
//链接的后链接
struct os_tcb *OSTCBPrev; //定义指向TCB的双向
//链接的前链接
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) //当以上各种事件允许时
|| (OS_MBOX_EN > 0) || (OS_SEM_EN > 0)
|| (OS_MUTEX_EN > 0)
OS_EVENT *OSTCBEventPtr; //定义指向事件控制块的指针
#endif
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0))
|| (OS_MBOX_EN > 0) //满足以上条件,定义传递给
void *OSTCBMsg; //任务的消息指针
#endif
#if (OS_VERSION >= 251)
&& (OS_FLAG_EN > 0)
&& (OS_MAX_FLAGS > 0)
#if OS_TASK_DEL_EN > 0
OS_FLAG_NODE *OSTCBFlagNode; //定义事件标志节点的指针
#endif
OS_FLAGS OSTCBFlagsRdy; //定义运行准备完毕的
//任务控制块中的任务
#endif
INT16U OSTCBDly; //定义允许任务等待时的最多节拍数
INT8U OSTCBStat; //定义任务的状态字
INT8U OSTCBPrio; //定义任务的优先级
INT8U OSTCBX; //定义指向任务优先级的低3位,
//即=priority&0x07
INT8U OSTCBY; //定义指向任务优先级的高3位,
//即=priority>>3
INT8U OSTCBBitX; //定义低3位就绪表对应值(0~7),
//即=OSMapTbl[priority&0x07]
INT8U OSTCBBitY; //定义高3位就绪表对应值(0~7),
//即=OSMapTbl[priority>>3]
#if OS_TASK_DEL_EN > 0 //允许生成 OSTaskDel() 函数代码函数
BOOLEAN OSTCBDelReq; //定义用于表示该任务是否须删除
#endif
} OS_TCB;
可以知道任务控制块存储了任务的多有重要信息,除了任务的地址,而任务的地址是存储在任务堆栈里面的,现在介绍任务的堆栈。
任务堆栈:
有任务创建,必须定义任务的堆栈。堆栈大小由编程人员根据实际情况自行定义。堆栈本质上是一个连续的内存块,任务在创建之初,由函数OSTaskCreate()将任务的代码和用户为任务定义的堆栈搭起联系。在不同的芯片中,堆栈的增长方向两种,所以在移植系统的时候,要根据芯片的堆栈的增长方向修改相应的代码,这些会在后面进行详细的描述。
系统任务:
在所有任务之前系统会先行创建两个系统任务,分别是空闲任务和统计任务。其中空闲任务是一定要有的。因为系统应该至少有一个任务可以去执行,否则系统会因为没有任务运行而崩溃。所以系统空闲任务是有必要的。在没有一个用户任务处于就绪状态的时候,空闲任务开始运行。空闲的任务总是最低的优先级,这样不会影响其他用户的任务的正常运行。
统计任务则统计了一些系统运行的信息,可以打开它也可以关闭。
临界区 :
所谓临界区,就是在执行一段特殊的代码是,不能允许别的任务来打断这段程序的运行,所以我们定义一个临界区,在这个临界区的开始关闭所有中断的响应,等执行完了代码的时候,在结尾打开中断。这个也是一直代码的一部分,在后面的章节会有详细的描述。
2.3.2. μC/OS-II任务的管理
对就绪任务的管理:
系统定义了一个就绪表的数据结构,类似于普通的数组,但是被赋予了特别的意义。就绪表中记录每个优先级的任务是不是在就绪的状态。下标则表示任务的优先级。这样的方式可以提高任务的管理效率。
任务的创建、挂起和其他操作:
OSTaskCreate()和OSTaskCreateExt()两个函数可以创建任务,它们的具体用法参考任哲《嵌入式实时操作系统μC/OS-II原理及应用》或者其他相关书籍。
任务有了后,可以在系统中管理这些任务:挂起或者恢复,挂起任务用函数OSTsakSuspend(),恢复任务用函数OSTaskResume()。
系统对任务的修改还有删除,优先级的修改,查询任务信息等函数。
2.3.3. μC/OS-II任务的调度
uc/os-II任务的调度是由调度器实现。调度器实际是一个函数,叫做OSSched();此函数通过搜索任务就绪表来获得最高优先级的就绪任务,在由该任务的优先级来获得任务的控制块再来实现任务的切换。任务的切换跟硬件有关,我们会在后面移植的部分详细再介绍。
任务的调度不是任何时刻都进行的,而是有时机的。任务当有以下情况发生时将产生一次任务调度:
● 创建了新任务,并在就绪表中进行了登记
● 有任务被删除
● 有处于等待的任务被唤醒
● 中断退出的时候
● 正在运行的任务等待某事件而进入等待状态
● 正在运行的任务自愿放弃微处理器占有权而等待一段时间
2.3.4. 任务的初始化和启动
系统中定义了大量的全局变量、数据结构。系统运行前会对这些变量和数据结构进行初始化。系统用初始化函数OSInit()来完成这项工作。μC/OS-II的启动也是通过系统提供的函数OSStart()来实现的。OSStart()在判断系统没有在运行后来获得就绪表中最高优先级的就绪任务,并调用函数OSStartHighRdy()来启动系统。OSStartHighRdy()也是一个与微处理器相关的函数,将在移植部分介绍。
2.3.5. 中断和时钟
实时系统通常用中断来响应异步事件。μC/OS-II也采用了中断来响应外部事件。μC/OS-II处理中断过程大致如下:当系统中断是开的时候,来了一个中断系统会自动查询这个中断服务程序的执行入口,进入执行完毕后退出中断。这里要提到的一点是,当要退出中断时,系统会查找就绪表是否有比处于中断服务状态任务的优先级更高的任务进入就绪状态。如果有将会一发一次调度,否则返回被中断的任务继续运行。关于中断也是移植相关的内容,在后面的章节我们还会再介绍。
2.3.6. 任务间的通信
通讯是个操作系统不可缺少的一部分。简单提一下uc/os-ii是怎么在系统中进行通讯的。μC/OS-II设计了一个与任务控制块类似的事件控制块的数据结构,并提供了信号量、消息邮箱和消息队列。通过这些机制来实现任务间的通信。
2.4. Cortex-M3内核简介
这小节我们简单介绍cortex-M3内核。Cortex-M3内核是ARM公司推出的最新的基于ARMv7构架的面向微控制领域的处理器内核,性能完全优于arm7。除了内核采用ARMv7构架外,Cortex-M3内核的优秀还体现在其卓越的中断管理能力。它提供的NVIC(嵌套向量中断控制器)能够更高效的中断管理。内部总线采用哈佛结构,这使得取指和数据访问的能够同时进行。除此之外还有用于内存保护的单元,这个很有意义,特别是对于操作系统。因为操作系统关键代码部分是不允许用户任务来访问的,以免造成误操作而引起系统的崩溃。
2.5. Cortex-M3内核编程模型
Cortex-M3内部有
展开阅读全文