当前位置:文档之家› 推荐-基于ARM9的μCOSⅡ嵌入式系统移植 精品

推荐-基于ARM9的μCOSⅡ嵌入式系统移植 精品

推荐-基于ARM9的μCOSⅡ嵌入式系统移植  精品
推荐-基于ARM9的μCOSⅡ嵌入式系统移植  精品

大庆师范学院

本科生毕业

基于ARM9的μC/OS-Ⅱ嵌入式系统移植

院(系)物理与电气信息工程

专业电子信息工程

研究方向嵌入式技术

学生姓名钮佳楠

学号20XX01071677

指导教师姓名成宝芝

指导教师职称讲师

20XX年5 月15 日

摘要

随着计算机和电子技术的发展,越来越多的嵌入式产品出现在人们的日常生活和工业生产之中。由于嵌入式设备的智能型,使得生活和生产变得极为方便,由此也带来了嵌入式操作系统的迅速发展。本文通过ADS1.2和JLink的软件平台,以及芯片为S3C2440的ARM9开发板,成功进行微型嵌入式操作系统μC/OS-Ⅱ在开发板上的移植。在此过程中对于μC/OS-Ⅱ进行了较为全面的学习,对于移植操作也有了深刻的认识。

关键词:μC/OS-Ⅱ;Arm9;移植

Abstract

With the development of puter and electronic technology, more and more embedded in people's daily life and industrial production. Intelligent embedded devices, making life extremely convenient and production, which also brought the rapid development of embedded operating system.This article by ADS1.2 and JLink, software platforms, and chip S3C2440 ARM9 development board, the success of micro embedded operating system OS-II development board transplantation. In this process, the OS-II for a more prehensive learning, have a deep understanding for the transplant operation.

Key words: u C/OS - Ⅱ; Arm9; transplant

目录

第一章嵌入式系统基础

1.1 嵌入式系统概述

与一般的计算机系统不同,嵌入式系统的功能性、可靠性和安全性以及成本、体积、功耗都有严格的要求,并且在以应用为中心的前提下,能够进行软硬件的裁剪。一般嵌入式系统的组成包括以下部分:

1.嵌入式的微处理器

2.硬件设备(外围)

3.嵌入式的操作系统

4.特定应用程序

嵌入式的系统特点如下:

1.特定且广泛的应用

2.密集的技术、知识、资金

3.高效性

4.较长生命周期

5.高可靠性

6.软硬件集于一体,以软件为主

嵌入式系统的应用领域十分广泛,主要包括交通管理、机器人、军事电子、通信设备、网络设备、医疗仪器、环境监测、汽车电子、工控设备等。

嵌入式系统从上世纪60年代中期开始,从无操作系统、简单操作系统、实时操作系统直至今日面向Intenet的阶段,历经50多年。嵌入式因为广泛应用性,巨大的创业型和广阔市场性,走进了千家万户。

1.2 嵌入式体系硬件基础

存储器、总线和输入输出设备以及作为硬件核心的微处理器共同组成了嵌入式系统的硬件体系。

1.微处理器:至少包含一个微处理器,采用的体系结构是冯诺依曼或哈佛结构。

2.存储器:由内存和外存构成。内存(即主存)存放一些数据和具体的代码;外存中存放各种信息,包括配置信息,调试信息等。

3.总线:种类随处理器的不同而不同,有些处理器总线32位,有些则是26位的。

4.输入/输出接口和设备:包含了串并口、中断处理器和DMA等设备。

1.3 嵌入式体系软件基础

同WINDOWS类似,嵌入式软件系统一般由操作系统(RTOS)、图形界面(GUI)、网络以及一些通用的模块组成。

随着科技和技术的发展,嵌入式产品的功能由单一化转向专业化,成功应用在了各行各业。在除了任务调度,同步机制的一些基本功能外,嵌入式系统还具备有以下优点:

1.可装载卸载性。开放性、可伸缩性体系结构。

2.极强的实时性。EOS实时性较强,可用于各种设备的控制当中。

3.统一的接口。提供了各种设备驱动接口。

4.方便操作、简单、提供图形GUI,图形的界面,追求的是易学易用性。

5.网络协议的多元化,提供各种网络协议的接口。

6.强稳定性和弱交互性。

7.固化的代码,系统和应用软件固化在ROM中。

8.更好的适应硬件,具有良好的移植性。

第二章μC/OS-II介绍

嵌入式操作系统(RTOS)是一个实时操作系统,所说的实时,就是指在外界中断或事件产生的时候,能够快速进行该中断的接受和处理操作,同时在规定的时间内使之控制相应的过程并作出正确响应的性能。

20世纪90年代初期,美国人Jean https://www.doczj.com/doc/8a12598296.html,brosse在《嵌入式系统编程》杂志上发表了一个关于名为μC/OS 的实时操作系统的文章,从而为μC/OS系统掀开了崭新的篇章。微型内核的μC/OS源码开放,稳定性强,作为μC/OS升级版本的μC/OS-II,主要有ANSI C,以及少量的汇编代码构成,全部代码不超过5000行,正因为占用空间的小巧,结构的简洁,基于实时性强的优点,μC/OS-II能在多重不同位数的处理器上运行。大到航空航天,小至手持设备,μC/OS-II已经成功应用诸多领域,为人们的生活带来了极大的便利。μC/OS-II体系结构如图2.1所示

图2.1 μC/OS-II体系结构

第三章ARM9介绍

ARM9的低功耗和高性价比,使之在工业生产和日常生活中得到广泛应用。ARM9基于RISC(精简指令)的结构,使它较用微程序控制的复杂指令系统的计算机具有更高的中断响应和指令处理的能力。

ARM9的指令集共包含了11种基本类型:

1.桶式的移位器及乘法器和偏上算术的逻辑单元(两种);

2.指令控制数据传送:用在弹性地址,高速内容切换,和交换数据(三种);

3.控制流程和特权级执行的指令(三种);

4.专门用在能够扩展到片外的协处理器中(三种)。

ARM9的指令集比较适用不同的高级语言编译器,但需要临界代码段,汇编语言编程也比较简单,不像其它的需要复杂的编译器来管理指令。

ARM9的流水线技术使它可以在译码的同时进行下一条指令的取指操作,具有更高的速率和效率。

ARM9有32位地址总线,也可以配制成26位的地址线,使早期版本的处理器能够被它兼容。

全静态CMOS 的ARM9,允许时钟停止循环,并保存当前状态。

基于上述的优势,ARM9适用于一些需要紧凑且功能强大的RISC处理器系统,包括电子通讯、数据通信、信息存储、图像处理、JOEG控制器等,为人们的日常生活和工业生产带来了极大的便利。

第四章μC/OS-Ⅱ在S3C2440上的移植

4.1移植环境简介

保证一个系统的内核保证能够在多个微处理器或微控制器上,同时保持了它的实时性和稳定性操作过程,就是移植。本文硬件平台选择的是S3C2440芯片,软件开发环境应用ADS1.2,再通过JLink-H进行调试,基本满足了移植的需求。

ARM9的S3C2440,能够在ARM920T核心的基础上,对系统内存进行高效的管理;哈佛体系结构使其执行效率和速度得到了加强。

4.2 移植条件

由于CPU版本的不同,μC/OS-II 可能会出现不兼容的问题,这时需要对操作系统进行移植,使它能够在使用的CPU 上运行。μC/OS-II的移植必须满足下列要求:

1.处理器的C 编译器可产生可重入代码;

2.进入和退出临界区代码用C 进行调用;

3.处理器必须支持具有定时中断源的硬件中断处理器必须能够容纳一定的数据硬件堆栈;

4.处理器需要有交换数据的指令,使其能够在CPU 的寄存器和内核及堆栈间进行数据的交换。

4.3 移植内容

针对μC/OS-Ⅱ的移植操作看似复杂,其实过程并不困难,在理解处理器位数和操作系统位数的前提下,只需要改写几个与处理器硬件相关的函数就能够保证移植操作的成功。一般而言,在μC/OS-Ⅱ的移植过程中做到以下几点就基本可以使移植成功:

1.用#define设置一些常量的值(OS_CPU.H)

2.声明10个指定的数据类型(OS_CPU.H)

3.用#define声明2个宏(OS_CPU.H)

4.用C 语言编写6个简单函数(OS_CPU_C.C)

5.根据硬件编写了4个函数(OS_CPU_ A.ASM)

4.3.1 INCLUDES.H

在移植初期,需要写入一个被包含在所有.C文件中的头文件,其中包含了可能用到的头文件和一些可能与实际应用不相关的头文件。由于头文件的增加,导致了

编译时间变长,但是避免了在编译过程中头文件丢失的风险,大大增强了移植性。当加入新的程序或代码的时,只需将所用头文件放到include.h文件中即可。需要增加的头文件必须需放在include.h头文件的最后,为了避免在编译过程中将已编译的内容再重新进行编译。

4.3.2 OS_CFG.H

内核是一个系统的核心,而OS_CFG.H就是用来配置内核的头文件,根据不同的需要和应用,我们可以对内核进行定制和裁剪,从而提高了实时性。

4.3.3 OS_CPU.H

OS_CPU.H:由#define重新定义的与处理器相关的宏,数据类型和常量存放在这个文件中。

众所周知,处理器有8位,16位,32位,64位甚至128位,对应到不同处理器的操作系统中位数是不一样的,否则会发生无法兼容的问题,μC/OS-Ⅱ中不使用C 中使用频繁的short(短整),int(整型)和long(长整)等数据类型。所以为了能够与处理器的字长相匹配,需要对μC/OS-Ⅱ中的数据类型进行重新的定义。

在任何的操作系统中,中断都是必不可少的,否则在更高优先级的任务发生时,无法对其进行处理,可能导致系统的崩溃。在类似这种情况下,需要对μC/OS-Ⅱ进行中断的禁止操作,且在访问代码结束重新将中断置为允许状态。所以在μC/OS-Ⅱ中有两个宏:OS_ENTER_CRITICAL()(中断禁止)和OS_EXIT_CRITICAL()(中断允许)。

结构常量OS_STK_GROWTH是在移植过程中专门为改变堆栈生长方式而定义的一个宏:将其置1时生长方式是从上往下,置0则相反。

在执行中断,或者任务优先级变化的时候,需要任务的切换(低任务优先级级到最高优先级任务)。任务切换简而言之就是将当前任务的寄存器和状态字保存到堆栈中并把更高优先级任务从堆栈中恢复出来。任务切换的时候需要OS_TASK_SW(),在移植过程中需要对这个宏重新定义。

4.3.4 OS_CPU_C.C

μC/OS-Ⅱ的移植中需要用C语言编写六个简单的函数:

1.OSTaskStkInit()

2.OSTaskCreateHook()

3.OSTaskDelHook()

4.OSTaskSwHook()

5.OSTaskStatHook()

6.OSTimeTickHook()

在移植过程中,OSTaskStkInit()是唯一需要进行改写的函数,其余的五个钩子函数(挂机函数),只需要对其声明,不需要详细的代码,且由于只是声明,所以在内核配置文件OS_CFG.H中需要将OS_CPU_HOOKS_EN的值设置为0。

4.3.4.1 OSTaskStkInt()

OSTaskStkInt():初始化堆栈欧诺个能函数。在早期任务创建时使用OSTaskCreate()和OSTaskCreateExt()调用OSTaskStkInt(),在这个过程中OSTaskStkInt()获得通过的pdata指针,任务堆栈栈顶和任务优先级和其它参数参数,以确保正确的初始化堆栈结构。

4.3.4.2 OSTaskCreateHook()

OSTaskCreateHook():μC/OS-Ⅱ的功能扩展的允许与否,在创建任务的时候通过这个函数进行功能设置。

建立任务之后会返回一个OS_TCB的指针,在选择扩展功能的时候,该指针会传给OSTaskCreateHook(),通过这个指针访问任务的附加数据(MMU 寄存器,浮点寄存器,以及调试的信息等)和结构成员。从而决定可允许扩展的成员。

4.3.4.3 OSTaskDelHook()

OSTaskDelHook():用于任务的删除。

任务建立之后会返回一个OS_TCB指针,在删除任务的时候,该指针会传给OSTaskDelHook(),通过这个指针访问任务的附加数据和结构成员。从而决定删除的对象。

4.3.4.4 OSTaskSwHook()

OSTaskSwHook():优先级改变,或者中断发生,进行任务切换的时候调用的函数。调用OSTaskSwHook()期间中断应该处于禁止的状况,这是为了防止程序的崩溃。任务切换的时间越短,任务执行效率越高,所以在任务切换的时候尽量将代码简化,OSTaskSwHook()无参数,也没有返回值。

4.3.4.5 OSTaskStatHook()

OSTaskStatHook():进行扩展统计功能的函数。OSTaskStatHook()无参数,无返回值。

4.3.4.6 OSTimeTickHook()

OSTaskTimeHook():应用于每一个时钟节拍中。事实上,OSTaskTimeHook()是在节拍被μC/OS-Ⅱ真正处理,并通知实例或应用程序之前被调用。OSTaskTimeHook()无参数,无返回值。

4.3.5 OS_CPU_A.ASM

四个汇编函数的编写是μC/OS-Ⅱ移植的重点:

1.OSStartHighRdy()

2.OSCtxSw()

3.OSIntCtxSw()

4.OSTickISR()

为了节省空间和内存,将所有与处理器相关的函数、代码集中放到OS_CPU_C.C 文件中。

4.3.

5.1 OSStartHighRdy()

OSStartHighRdy():选择优先级最高的任务执行。OSStart是开始运行任务的函数,在运行开始之后可以调用OSStartHighRdy()选择优先级最高的任务执行。在任务切换之后和恢复先前任务之前需要将此函数的OSRunning设置为0。

4.3.

5.2 OSCtxSw()

OSCtxSw():执行最高优先级的任务是μC/OS-Ⅱ的特点之一,而OSCtxSw()就是基于此而创建的函数。调用任务切换函数的时候中断也必须处于禁止状态。

4.3.

5.3 OSIntCtxSw()

OSIntCtxSw():μC/OS-Ⅱ中唯一与微处理器相关的函数。

4.3.

5.4 OSTickISR()

OSTickISR():为了满足时间期满和延迟功能而编写的函数。

第五章实例移植

本章是在基于第四章内容的基础上,进行一个详细的代码实例移植。通过源码介绍、软件设置和仿真调试,实现ARM9开发板上LED灯的控制。

5.1 函数配置

实例移植是验证移植成功的关键。通过网络或其它途径获得μC/OS-Ⅱ的源代码,对于一些在第四章描述的变量、宏和函数进行重新定义和配置。

源代码如图5-1所示:

图5-1 源代码文件夹

在S3C2440文件夹下有两个子文件夹,分别是includes和source,如图5-2所示:

图5-2 S3C2440文件夹下的文件

在includes文件中包括config.h、lcd.h、mmu.h、Nand.h、Option.h、S3C2440addr.h、S3C2440lib.h、S3C24400slib.h、Timer.h,这些文件都是一些与芯片相关的头文件。如图5-3所示:

图5-3 includes文件夹

在source文件中包括Timer.c、2440init.s、2440lib.c、2440slib.s、Font_Libs.c、iphone.c、lcd.c、mmu.c"、nand.c、Target.c、main.c等,这些都是一些与芯片相关的

源文件,这里的main.c函数可以写入测试程序,执行测试操作,如图5-4:

图5-4 source文件夹

uCOS_II文件夹中包含了四个文件夹,分别是API、include、arm、SOURCE。

图5-5 uCOS_II文件夹

在API文件夹中只有一个应用配置相关的头文件:app_cfg.H,如图5-6所示:

图5-6 API文件夹

include中有三个文件:os_cfg.h、OS_CPU.H和ucos_ii.H,其中OS_CPU.H需要进行配置,如图5-7:

图5-7 include文件夹

arm文件夹中也是三个文件:IRQ.inc、Os_cpu_a.a、Os_cpu_c.C,其中后两个是需要进行配置的文件,如图5-8所示:

相关主题
文本预览
相关文档 最新文档