基于stm32的ucosii系统移植

上传人:bin****86 文档编号:55166530 上传时间:2018-09-25 格式:DOC 页数:49 大小:5.47MB
返回 下载 相关 举报
基于stm32的ucosii系统移植_第1页
第1页 / 共49页
基于stm32的ucosii系统移植_第2页
第2页 / 共49页
基于stm32的ucosii系统移植_第3页
第3页 / 共49页
基于stm32的ucosii系统移植_第4页
第4页 / 共49页
基于stm32的ucosii系统移植_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《基于stm32的ucosii系统移植》由会员分享,可在线阅读,更多相关《基于stm32的ucosii系统移植(49页珍藏版)》请在金锄头文库上搜索。

1、基于基于 STM32 的的 u/COS-II 系统移植系统移植 【摘要】本文硬件平台采用 ARM 公司基于 ARMV7 架构的 Cortex-M3 系列处 理器 STM32F103,利用安富来公司现有的开发板,移植一个基于 u/COS-II 操作 系统的应用程序框架(系统移植) ;创建多个任务,并通过使用消息邮箱进行两 个任务之间的通信。本文重点是把 u/COS-II 系统移植到程序中来,进而把各个 基本功能模块化,并划分为几个主任务,以便实现嵌入式系统的操作。 【关键字】u/COS-II STM32 系统移植 消息邮箱 串口通信 【引言】随着人类社会经济的不断发展,科研领域不断的拓宽,嵌入式

2、系统产 品渐渐完善,并在全世界各行业得到广泛应用。通过移植嵌入式操作系统,计 算机可以更好地管理内存,并且在很大程度上提高系统的实时性。本设计通过 在 STM32 上移植 u/COS-II 操作系统,实现了流水灯闪烁,使用消息邮箱实现 多任务间的通信,并通过串口将信息打印到 PC 终端等功能。加深了笔者对嵌 入式操作系统的理解。 【正文】 1 U/COS-II 的简介的简介 U/COS-II 的前身是 UCOS,最早出自于 1992 年美国嵌入式系统专家 Jean J.Labrosse 在嵌入式系统编程杂志的 5 月和 6 月刊上刊登的文章连载,并把 UCOS 的源码发布在该杂志的 BBS 上

3、。目前最新的版本:U/COS-lll 已经出来, 但是现在使用最为广泛的还是 U/COS-II,本章我们主要针对 U/COS-II 进行介 绍。 U/COS-II 是一个可以基于 ROM 运行的、可裁减的、抢占式、实时多任务 内核,具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作 系统性能相当的实时操作系统(RTOS)。为了提供最好的移植性能,U/COS-II 最 大程度上使用 ANSI C 语言进行开发,并且已经移植到近 40 多种处理器体系上, 涵盖了从 8 位到 64 位各种 CPU(包括 DSP)。 U/COS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用 C

4、 语言 编写的。CPU 硬件相关部分是用汇编语言编写的,总量约 200 行的汇编语言部 分被压缩到最低限度,为的是便于移植到任何一种其它的 CPU 上。用户只要有 标准的 ANSI 的 C 交叉编译器,有汇编器、连接器等软件工具,就可以将 U/COS-II 嵌人到开发的产品中。U/COS-II 具有执行效率高、占用空间小、实 时性能优良和可扩展性强等特点,最小内核可编译至 2KB。U/COS-II 已经移植 到了几乎所有知名的 CPU 上。 U/COS-II 构思巧妙。结构简洁精练,可读性强,同时又具备了实时操作系 统的全部功能,虽然它只是一个内核,但非常适合初次接触嵌入式实时操作系 统者,可

5、以说是麻雀虽小,五脏俱全。U/COS-II(V2.91 版本)体系结构如图 1 所示: 图 1:U/COS-II 体系结构图 本设计使用的是 U/COS-II 的最新版本:V2.91 版本,该版本 U/COS-II 比 早期的 U/COS-II(如 V2.52)多了很多功能(比如多了软件定时器,支持任务 数最大达到 255 个等) ,而且修正了很多已知 BUG。 从上图可以看出,U/COS-II 的移植,只需要修改:os_cpu.h、os_cpu_a.asm 和 os_cpu.c 等三个文件即可,其中:os_cpu.h,进行数据类型的定义,以及处 理器相关代码和几个函数原型;os_cpu_a.

6、asm,是移植过程中需要汇编完成的 一些函数,主要就是任务切换函数;os_cpu.c,定义一些用户 HOOK 函数。 图中定时器的作用是为 U/COS-II 提供系统时钟节拍,实现任务切换和任务 延时等功能。这个时钟节拍由 OS_TICKS_PER_SEC(os_cfg.h 中定义)设置, 一般设置 U/COS-II 的系统时钟节拍为 1ms100ms,具体根据所用处理器和使 用需要来设置。本设计中,我利用 STM32 的 SYSTICK 定时器来提供 U/COS-II 时钟节拍。 U/COS-II 早期版本只支持 64 个任务,但是从 2.80 版本开始,支持任务数 提高到 255 个,不过

7、对一般使用者来说一般 64 个任务都是足够多了,一般很难 用到这么多个任务。U/COS-II 保留了最高 4 个优先级和最低 4 个优先级的总共 8 个任务,用于拓展使用,但实际上,U/COS-II 一般只占用了最低 2 个优先级, 分别用于空闲任务(倒数第一)和统计任务(倒数第二) ,所以剩下给我们使用 的任务最多可达 255-2=253 个(V2.91) 。 所谓的任务,其实就是一个死循环函数,该函数实现一定的功能,一个工 程可以有很多这样的任务(最多 255 个) ,U/COS-II 对这些任务进行调度管理, 让这些任务可以并发工作(注意不是同时工作!并发只是各任务轮流占用 CPU,而不

8、是同时占用,任何时候还是只有 1 个任务能够占用 CPU) ,这就是 U/COS-II 最基本的功能。 U/COS-II 的任何任务都是通过一个叫任务控制块(TCB)的东西来控制的, 每个任务管理块有 3 个最重要的参数:1,任务函数指针;2,任务堆栈指针; 3,任务优先级;任务控制块就是任务在系统里面的身份证(U/COS-II 通过优 先级识别任务) 。 在 U/COS-II 中,使用 CPU 的时候,优先级高(数值小)的任务比优先级 低的任务具有优先使用权,即任务就绪表中总是优先级最高的任务获得 CPU 使 用权,只有高优先级的任务让出 CPU 使用权(比如延时)时,低优先级的任务 才能获

9、得 CPU 使用权。U/COS-II 不支持多个任务优先级相同,也就是每个任 务的优先级必须不一样。 任务的调度其实就是 CPU 运行环境的切换,即:PC 指针、SP 指针和寄存 器组等内容的存取过程。 U/COS-II 的每个任务都是一个死循环。每个任务都处在以下 5 种状态之一 的状态下,这 5 种状态是:睡眠状态、就绪状态、运行状态、等待状态(等待某 一事件发生)和中断服务状态。在 U/COS-II 中,与任务相关的几个重要函数: 1)创建任务函数 如果想让 U/COS-II 管理用户的任务,必须先建立任务。U/COS-II 提供了 2 个建立任务的函数:OSTaskCreat 和 OS

10、TaskCreatExt,我们一般用 OSTaskCreat 函数来创建人任务,该函数的原型为 OSTaskCreate(void(*task) (void*pd),void*pdata,OS_STK*ptos,INTU prio)。该函数包括 4 个参数:task:是 指向任务代码的指针;pdata:是任务开始执行时,传递给任务的参数的指针; ptos:是分配给任务的堆栈的栈顶指针;prio 是分配给任务的优先级。每个任务 都有自己的堆栈,堆栈必须申明为 OS_STK 类型,并且由连续的内存空间组成。 可以静态分配堆栈空间,也可以动态分配堆栈空间。OSTaskCreatExt 也可以用 来创

11、建任务。 2)改变任务的优先级函数 U/COS-II 在建立任务时,会分配给任务一个优先级,但是这个优先级并不 是一成不变的,而是可以通过调用 U/COS-II 提供的函数修改。U/COS-II 提供 的任务优先级修改函数原型为:INT8U OSTaskChangePrio(INT8U oldprio,INT8U newprio)。 3)任务挂起函数 任务挂起只是将被挂起任务的就绪标志删除,并做任务挂起记录,并没有 将任务控制块任务控制块链表里面删除,也不需要释放其资源。被挂起的任务, 在恢复(解挂)后可以继续运行。U/COS-II 提供的任务挂起函数原型为: INT8U OSTaskSusp

12、end(INT8U prio)。 4)任务恢复函数 有任务挂起函数,就有任务恢复函数,通过该函数将被挂起的任务恢复, 让调度器能够重新调度该函数。U/COS-II 提供的任务恢复函数原型为:INT8U OSTaskResume(INT8Uprio)。 2. U/COS-II 信号量和邮箱简介信号量和邮箱简介 系统中的多个任务在运行时,经常需要互相无冲突地访问同一个共享资源, 或者需要互相支持和依赖,甚至有时还要互相加以必要的限制和制约,才保证 任务的顺利运行。因此,操作系统必须具有对任务的运行进行协调的能力,从 而使任务之间可以无冲突、流畅地同步运行,而不致导致灾难性的后果。 例如,任务 A

13、和任务 B 共享一台打印机,如果系统已经把打印机分配给了 任务 A,则任务 B 因不能获得打印机的使用权而应该处于等待状态,只有当任 务 A 把打印机释放后,系统才能唤醒任务 B 使其获得打印机的使用权。如果这 两个任务不这样做,那么会造成极大的混乱。 任务间的同步依赖于任务间的通信。在 U/COS-II 中,是使用信号量、邮箱 (消息邮箱)和消息队列这些被称作事件的中间环节来实现任务之间的通信的。 两个任务通过事件进行通讯的示意图如图 2 所示: 图 2:两个任务使用事件进行通信的示意图 在图 2 中任务 1 是发信方,任务 2 是收信方。任务 1 负责把信息发送到时 间上,这项操作叫做发送

14、事件。任务 2 通过读取事件操作对事件进行查询:如 果有信息则读取,否则等待。读事件操作叫做请求事件。 为了把描述事件的数据结构统一起来,U/COS-II 使用叫做事件控制块(ECB)的 数据结构来描述诸如信号量、邮箱(消息邮箱)和消息队列这些事件。事件控 制块中包含包括等待任务表在内的所有有关事件的数据,事件控制块结构体定 义如下: typedef struct INT8U OSEventType; /事件的类型 INT16U OSEventCnt; /信号量计数器 void *OSEventPtr; /消息或消息队列的指针 INT8U OSEventGrp; /等待事件的任务组 INT8U

15、 OSEventTblOS_EVENT_TBL_SIZE;/任务等待表 #if OS_EVENT_NAME_EN 0u INT8U *OSEventName; /事件名 #endif OS_EVENT; 信号量是一类事件。使用信号量的最初目的,是为了给共享资源设立一个 标志,该标志表示该共享资源的占用情况。这样,当一个任务在访问共享资源 之前,就可以先对这个标志进行查询,从而在了解资源被占用的情况之后,再 来决定自己的行为。 信号量可以分为两种:一种是二值型信号量,另外一种是 N 值信号量。 U/COS-II 将二值型信号量称之为也叫互斥型信号量,将 N 值信号量称之 为计数型信号量,也就是普

16、通的信号量。在 U/COS-II 中,与信号量相关的几 个重要函数。 1)创建信号量函数 在使用信号量之前,我们必须用函数 OSSemCreate 来创建一个信号量, 该函数的原型为:OS_EVENT *OSSemCreate (INT16U cnt)。该函数返回值为已 创建的信号量的指针,而参数 cnt 则是信号量计数器(OSEventCnt)的初始值。 2)请求信号量函数 任务通过调用函数 OSSemPend 请求信号量,该函数原型如下:void OSSemPend ( OS_EVENT *pevent, INT16U timeout, INT8U *err)。其中,参数 pevent 是被请求信号量的指针,timeout 为等待时限,err 为错误信息。为防止 任务因得不到信号量而处于长期的等待状态,函数 OSSemPend 允许用参数 timeout 设置一个等待时间的限制,当任务等待的时间超过 timeout 时可以结 束等待状态而进入就绪状态。如果参数 timeout 被设置为 0,则表明任务的等 待时间为无限长。 3)发

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号