uCOS-II的移植及使用
- 格式:ppt
- 大小:4.72 MB
- 文档页数:150


转:⼀步⼀步教你使⽤uCOS-II
第⼀篇 UCOS介绍
第⼀篇 UCOS介绍
这个⼤家都知道。呵呵。考虑到咱们学习的完整性还是在这⾥唠叨⼀下。让⼤家再熟悉⼀下。⾼⼿们忍耐⼀下吧! uC/OS II(Micro ControlOperation System Two)是⼀个可以基于ROM运⾏的、可裁减的、抢占式、实时多任务内核,具有⾼度可移植性,特别适合于微处理器和控
制器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。为了提供最好的移植性能,uC/OS II最⼤程度上使⽤ANSI C语⾔进⾏开
发,并且已经移植到近40多种处理器体系上,涵盖了从8位到64位各种CPU(包括DSP)。
uC/OS II可以简单的视为⼀个多任务调度器,在这个任务调度器之上完善并添加了和多任务操作系统相关的系统服务,如信号量、邮箱等。
其主要特点有公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。内核属于抢占式,最多可以管理60个任务。
µ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只是⼀个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功
1 uC/OS-II是源码开放、可固化、可移植、可裁剪、可剥夺的实时多任务OS内核,适用于任务多、对实时性要求较高的场合。uC/OS-II适合小型系统,具有执行效率高、占用空间小、实时性优良和可扩展性等特点,最小内核可编译至2K。uC/OS-II内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能。 所谓RTOS移植,就是使一个实时内核能在某个微处理器或微控制器上运行。大部分的uC/OS-II代码试用C写的,但仍需要用C和ASM写一些与处理器相关的代码,这是因为uC/OS-II在读写处理器寄存器时只能通过ASM实现。 要是uC/OS-II正常运行,处理器必须满足一定的条件: 处理器的C编译器能产生可重入代码; 用C语言就可以打开和关闭中断; 处理器支持中断,并能产生定时中断; 处理器支持能够容纳一定量数据的硬件堆栈; 处理器有将SP和其他CPU reg读出和存储到堆栈或内存中的指令; 2 uC/OS-II移植工作主要包括以下三个方面的内容: (1) 修改与处理器核编译器相关的代码:主要在includes.h中,修改数据类型定义说明,OS_ENTER_CRITICAL()、OS_EXIT_CRITICAL()和堆栈增长方向定义OS_STK_GROWTH。 (2) 用C语言编写10个移植相关的函数:主要在OS_CPU_C.C中,包括堆栈初始化OSTaskStkInit()和各种回调函数。 (3) 编写4个汇编语言函数:主要在OS_CPU_A.ASM中,包括: _OSTickISR //时钟中断处理函数 _OSIntCtxSW //从ISR中调用的任务切换函数 _OSCtxSW //从任务中调用的任务切换函数 _OSStartHighRdy //启动最高优先级的任务 uC/OS-II移植的关键问题: (1) 临界区访问:uC/OS-II需要先禁止中断再访问代码临界段,并且在访问完毕后重新允许中断,这就使得uC/OS-II能够保护临界段代码免受多任务或ISR的破坏。uC/OS-II定义了OS_ENTER_CRITICAL()(禁止中断)和OS_EXIT_CRITICAL()(允许中断),有3种实现方法。 (2) 系统引导:uC/OS-II引导分为两部分:一是处理器相关的引导,包括初始化处理器状态、数据段、SP等,一是OS相关的引导,包括系统各个数据结构的初始化、初始任务的创建等,最终执行到_OSStartHighRdy开启多任务执行。 3 与uC/OS-II引导相关的几个移植函数是OSStartHighRdy、OSTaskStkInit和OSTickISR,其中OSTaskStkInit负责初始化任务堆栈,初始化的堆栈数据会在任务第一次被调用执行时装入相应的寄存器。 在OSStartHighRdy前执行的所有代码都是为多任务启动做准备,由OSStartHighRdy开始才真正的启动多任务环境,OSStartHighRdy执行后不会返回,而是直接切换到最高优先级任务运行。 (3) 堆栈切换和管理:堆栈切换伴随任务切换而发生,uC/OS-II中主要有三个地方发生堆栈切换: 在OSStartHighRdy启动多任务时,将任务堆栈初始内容弹出堆栈; 在OSIntCtxSW中切换,在中断返回时如果最高优先级的任务发生了改变,就需要调用这个函数切换任务; 在OSCtxSW中切换,这是主动调用OSSched等函数触发的任务切换,在任务中以软中断方式触发该调用; 影响堆栈切换的另一个因素是中断嵌套,uC/OS-II中的中断嵌套通过全局变量OSIntNesting控制。当进入中断时,只有最外层的中断(也就是第一次进入的中断)需要将当前的SP保存在TCB中;相应的,只有最外层的中断返回时才需要进行可能的堆栈切换。 4 uC/OS-II多NiosII软核扩展---uC/OS-MC 在多NiosII软核上扩展的uC/OS-II称为uC/OS-MC,uC/OS-MC期望能够实现其对于多核处理器的支持,实现传统的CMP架构,即运行一个RTOS动态的调度任务到各个CPU核上运行,保证任务的优先级和CPU核的负载平衡。 对uC/OS-MC,需要保证有最高优先级的N个任务始终运行,N代表系统中NiosII核的数量,这是对任务优先级的保证;还要保证处理器的负载均衡,任意一个处理器核如果运行空转任务,说明系统中不存在就绪运行的任务。 uC/OS-MC移植设计难点 一是多核处理器的引导,怎样将多核处理器启动,完成各个处理器核的初始化,同时还要保证各个处理器核间的同步,以使其能够在几乎同一时间进入任务调度;二是多核处理器的互斥和同步,仅仅禁止某个核的中断处理不能保证临界区的互斥访问,必须采用新的方式实现多核处理器对于临界区的互斥核同步访问;三是任务调度,必须在多核处理器上设计出一个性能良好的调度算法,一方面保证最高优先级任务的运行,另一方面要是各个处理器核上的任务切换次数尽可能的少;四是时钟中断处理,多核处理器上的每个处理器核都需要一个独立的时钟中断来提供“心跳”。 (1) 多核处理器的引导 在多核处理器的引导过程中,处理器内核间是不平等的,有主次之分。系统5 启动后,PM(Primary CPU)首先初始化自身,同时完成一些全局化的初始化过程,如数据段清零、MMU初始化等,然后跳转到C代码的函数中执行,此时才由PM逐个启动PE(Processor Element),各个PE在初始化自身后需要和PM同步,等待PM发出启动信号量后统一进入任务调度。 对于PM和各个PE,自身的初始化是每个处理器核都必须执行的,而全局和一些系统的初始化工作则只由PM在启动时执行一次。 (2) 多核上的任务调度 每个任务都能在任意的CPU上运行,这就需要在任务堆栈中保存足够的信息以使它能够在任意一个CPU上恢复运行。空转任务(IDLE TASK)作为一个特殊的任务不能够被调度到别的处理器上运行,实际上每个处理器上都运行了一个相同的空转任务。 RTOS在多核处理器上的任务调度实际上是一个处理器核和任务双向选择的过程:一方面要保证最高优先级任务的运行,另一方面要保证全局的任务切换次数最少,即原来运行在该处理器核上的任务尽可能不发生切换,这是任务调度算法需要考虑的两个关键问题。 uC/OS-MC按优先级排序,最高优先级的N个任务都有可能同时运行。 6 任务切换时机 在uC/OS-MC中,与任务调度相关的4个变量OSPrioCur、OSPrioHighRdy、OSTCBCur、OSTCBHighRdy都扩展为长度为N的数组。注意:“最高优先级任务”的含义发生了变化,在单一处理器核上运行的任务也许不是全局的最高优先级,但在所有处理器核上运行的N个任务一定是所有任务中具有最高优先级的N个任务。 每个处理器核在两个地方进行任务切换:一是时钟中断返回,通过调用OSIntExit检查是否需要进行任务切换;一是处理器间中断,这是任务主动触发的任务调度。在多核处理器环境下,某一个任务上运行的任务调度的效果可能是全局性的,也就是说PE1上运行的任务调度可能会影响到PE0、PE2、PE3上运行的任务,这就需要通过处理器间中断来处理。 调度算法 多核处理器上的任务调度算法有两个目标:一是保证最高优先级的N个任务运行,二是保证全局的任务切换次数最少,即使原来运行在该处理器上的任务尽可能的不发生切换。 uC/OS-MC任务调度分两个步骤:首先从当前就绪的任务队列中选择出优先级排在前N位的任务,然后把这N个任务调度到N个处理器核上。任务调度流程图如下图所示: 7 (3) 多核处理器间的通信 uC/OS-MC主要使用三种核间通信机制: 多核处理器间的中断; 多核处理器间的同步; 多核处理器间的互斥,主要通过硬件自旋锁实现; 在多核处理器中,禁止本处理器核的中断只能保证运行在该处理器核上的任务间的互斥,而运行在别的处理器核上的任务可能同时进入临界区访问。这样,不仅需要禁止本处理器核上的中断,还需要处理器核间的互斥机制来保证对于临界区的访问。 uC/OS-MC中,封装了对于多核处理器间的自旋锁操作:wait_cmp_lock()和release_cmp_lock()。在访问多核处理器间需要互斥访问的数据之前,需要先调用wait_cmp_lock()来获得处理器核间的互斥锁,访问完毕后再通过release_cmp_lock()释放互斥锁。 注意:需要同时调用OS_ENTER_CRITICAL()和wait_cmp_lock()时,要8 先调用OS_ENTER_CRITICAL()禁止中断,再调用wait_cmp_lock()获得处理器间的互斥锁。 (4) 时钟中断处理 对uC/OS-MC,外部中断的分配和处理大部分由硬件支持,而作为RTOS“心跳”的时钟中断则由每个处理器核内部提供。系统初始化时,每个处理器核都需要初始化其内部的定时器,配置成频率相同的时钟中断;另外,不同的处理器核必须使用不同的时钟中断源。 uC/OS-II中,时钟中断作为外部中断由外部时钟提供;而uC/OS-MC中,每个处理器核上都需要一个独立的时钟中断来驱动该处理器核上的任务切换,改由每个处理器核上的内部时钟提供时钟中断。 在SOPC Builder中,可为每个NiosII软核配置一个Internal Timer。
µC/OS-II在80x86上的移植
本章将介绍如何将µC/OS-II移植到Intel 80x86系列CPU上,本章所介绍的移植和代码都是
针对80x86的实模式的,且编译器在大模式下编译和连接。本章的内容同样适用于下述CPU:
80186
80286
80386
80486
Pentium
Pentium II
实际上,将要介绍的移植过程适用于所有与80x86兼容的CPU,如AMD,Cyrix,NEC (V-系列)
等等。以Intel的为例只是一种更典型的情况。80x86 CPU每年的产量有数百万,大部分用于个
人计算机,但用于嵌入式系统的数量也在不断增加。最快的处理器(Pentium系列)将在2000年
达到1G的工作频率。
大部分支持80x86(实模式)的C编译器都提供了不同的内存使用模式,每一种都有不同的内
存组织方式,适用于不同规模的应用程序。在大模式下,应用程序和数据最大寻址空间为1Mb,
程序指针为32位。下一节将介绍为什么32位指针只用到了其中的20位来寻址(1Mb)。
本章所介绍的内容也适用于8086处理器,但由于8086没有PUSHA指令,移植的时候要用几条
PUSH指令来代替。
图F9.1显示了工作在实模式下的80x86处理器的编程模式。所有的寄存器都是16位,在任务切换时
需要保存寄存器内容。
图F9.1 80x86 实模式内部寄存器图.
80x86提供了一种特殊的机制,使得用16位寄存器可以寻址1Mb地址空间,这就是存储器分段
的方法。内存的物理地址用段地址寄存器和偏移量寄存器共同表示。计算方法是:段地址寄存
器的内容左移4位(乘以16),再加上偏移量寄存器(其他6个寄存器中的一个,AX,BP,SP,
SI,DI或IP)的内容,产生可寻址1Mb的20位物理地址。图F9.2表明了寄存器是如何组合的。段
寄存器可以指向一个内存块,称为一个段。一个16位的段寄存器可以表示65,536个不同的段,因
stm32 UCGUI 完美移植
作者:Changing发表时间:09-16 04:13分类:电子相关1 Comment
前一篇:stm32 DA 数模转换
后一篇:Stm32 SWD 下载 调试配置
UCGUI是一种嵌入式应用中的图形支持系统。它设计用于为任何使用LCD图形显示的应用提供高效
的独立于处理器及LCD控制器的图形用户接口,它适用单任务或是多任务系统环境, 并适用于任意LCD控
制器和CPU下任何尺寸的真实显示或虚拟显示。
它的设计架构是模块化的,由不同的模块中的不同层组成,由一个LCD驱动层来包含所有对LCD的
具体图形操作。UCGUI可以在任何的CPU上运行,因为它是100%的标准C代码编写的。
类似程序还有国产的一个MINIGUI (/zhcn/),MiniGUI 是一个自由
软件项目。其目标是提供一个快速、稳定、跨操作系统的图形用户界面(GUI)支持系统,尤其是基于 Li
nux/uClinux、eCos 以及其他传统 RTOS(如 VxWorks、ThreadX、uC/OS-II、Nucleus 等)的实时
嵌入式操作系统。有机会尝试下,支持下国产,毕竟国内这样的公司不多。。
这里移植的UCGUI3.90a版本,虽然已经有更新的版本,比如UCGUI3.98、甚至4.04版本。但是
目前来说只有这个版本的代码是最全的,包括了JPEG , MULTILAYER , MEMDEV ,AntiAlias等模块。
一直想尝试做一个数码相册,JEPG模块自然少不了,所以移植了这个版本。
UCGUI390a 下载
整个移植过程,让LCD显示图案倒是没花多少时间,资料也比较多,但是在移植触摸屏的时候卡了
好几天,然后又是 UCGUI 指针图标 移动有重影(LCD读取像素颜色函数有问题)。。。总之移植是个累人
的活
首先需要保证你的LCD驱动和触摸屏驱动是有效的,如果你的LCD也是ili93xx 控制器 XPT2046