基于Arm9的μCOS-Ⅱ嵌入式系统移植

大庆师范学院本科毕业论文(设计)

大庆师范学院
本科生毕业论文

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

院 专 研 究 学 生 学

(系) 物理与电气信息工程 业 方 向 姓 名 号 电子信息工程 嵌入式技术 钮佳楠 200901071677 成宝芝 讲师 2013 年 5 月 15 日

指导教师姓名 指导教师职称

大庆师范学院本科毕业论文(设计)





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

I

大庆师范学院本科毕业论文(设计)

Abstract With the development of computer 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 comprehensive learning, have a deep understanding for the transplant operation. Key words: u C/OS - Ⅱ; Arm9; transplant

II

大庆师范学院本科毕业论文(设计)

目 录
第一章 嵌入式系统基础 ............................................................................................ 1 1.1 嵌入式系统概述 ........................................................................................... 1 1.2 嵌入式体系硬件基础 ................................................................................... 1 1.3 嵌入式体系软件基础 ................................................................................... 2 第二章 μC/OS-II 介绍 ................................................................................................ 3 第三章 ARM9 介绍 ..................................................................................................... 4 第四章 μC/OS-Ⅱ在 S3C2440 上的移植 ................................................................... 5 4.1 移植环境简介 ................................................................................................ 5 4.2 移植条件 ....................................................................................................... 5 4.3 移植内容 ....................................................................................................... 5 4.3.1 INCLUDES.H ..................................................................................... 5 4.3.2 OS_CFG.H ........................................................................................... 6 4.3.3 OS_CPU.H .......................................................................................... 6 4.3.4 OS_CPU_C.C ...................................................................................... 6 4.3.5 OS_CPU_A.ASM................................................................................ 8 第五章 实例移植 ...................................................................................................... 10 5.1 函数配置 ..................................................................................................... 10 5.2 工程创建 ..................................................................................................... 12 5.3 工程设置 ..................................................................................................... 13 5.4 实例调试 ..................................................................................................... 17 第六章 结束语 .......................................................................................................... 19 [参考文献] ................................................................................................................. 20 附 录 1 ....................................................................................................................... 21 OS_CPU.H 文件函数: ................................................................................... 21 OS_CPU_A.ASM 文件函数.............................................................................. 21

III

大庆师范学院本科毕业论文(设计)

第一章 嵌入式系统基础 1.1 嵌入式系统概述
与一般的计算机系统不同,嵌入式系统的功能性、可靠性和安全性以及成本、 体积、功耗都有严格的要求,并且在以应用为中心的前提下,能够进行软硬件的裁 剪。一般嵌入式系统的组成包括以下部分: 1. 嵌入式的微处理器 2. 硬件设备(外围) 3. 嵌入式的操作系统 4. 特定应用程序 嵌入式系统包含以下的特点: 1. 特定且广泛的应用 2. 密集的技术、知识、资金 3. 高效性 4. 较长生命周期 5. 高可靠性 6. 软硬件集于一体,以软件为主 嵌入式系统的应用领域十分广泛,主要包括交通管理、机器人、军事电子、通 信设备、网络设备、医疗仪器、环境监测、汽车电子、工控设备等。 嵌入式系统从上世纪 60 年代中期开始,从无操作系统、简单操作系统、实时操 作系统直至今日面向 Intenet 的阶段,历经 50 多年。嵌入式因为广泛应用性,巨大的 创业型和广阔市场性,走进了千家万户。1.2 嵌入式体系硬件基础

1.2 嵌入式体系硬件基础
嵌入式系统的硬件核心是嵌入式微处理器,另外包括总线、存储器、输入/输出 接口和设备。 1. 微处理器: 至少包含一个微处理器, 采用的体系结构是冯诺依曼或哈佛结构。 2. 存储器:包括主存和外存。主存用于存数代码和数据;外存存放各种信息。 3. 总线:种类随处理器的不同而不同,有些处理器总线 32 位,有些则是 26 位 的。 4. 输入/输出接口和设备:包含了串并口、中断处理器和 DMA 等设备。

1

大庆师范学院本科毕业论文(设计)

1.3 嵌入式体系软件基础
同 WINDOWS 类似, 嵌入式软件系统一般由操作系统 (RTOS) 图形界面 、 (GUI) 、 网络以及一些通用的模块组成。 随着科技和技术的发展,已经推出了嵌入式产品的成功应用,且从单功能向专 业化发展。在除了任务调度,同步机制的一些基本功能外,嵌入式系统还具备有以 下优点: 1. 可装载卸载性。开放性、可伸缩性体系结构。 2. 极强的实时性。EOS 实时性较强,可用于各种设备的控制当中。 3. 统一的接口。提供了各种设备驱动接口。 4. 方便操作、简单、提供图形 GUI,图形的界面,追求的是易学易用性。 5. 强大的网络支持功能,提供各种网络协议的接口。强稳定性和弱交互性。 6. 固化的代码,系统和应用软件固化在 ROM 中。 7. 更好的适应硬件,具有良好的移植性。

2

大庆师范学院本科毕业论文(设计)

第二章 μC/OS-II 介绍
Real Time Operating System,简称 RTOS,是实时操作系统的英文缩写。所谓实 时,就是在外界中断或事件发生的时候,能够快速接受并进行处理,同时在规定时 间内控制相应的过程作出响应。 20 世纪 90 年代初期,美国人 Jean J.Labrosse 在 Embedded SystemProgramming 杂志上最先发表了 RTOS,名为 μ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 体系结构

3

大庆师范学院本科毕业论文(设计)

第三章 ARM9 介绍
ARM9 是 32 位通用微处理器 ARM(Advanced RISC Machine)家族中的一员, 具有比较低的电源消耗和良好的性价比,由此广泛应用于工业生产和日常生活中。 基于 RISC(精简指令)的结构,较微程序的控制复杂指令系统的计算机相对简单, 使得它用有较高的中断响应和指令处理的能力。 ARM9 的指令集共包含了 11 种基本类型: 1. 桶式的移位器及乘法器和偏上算术的逻辑单元(两种) ; 2. 指令控制数据传送:用在弹性地址,高速内容切换,和交换数据(三种) ; 3. 控制流程和特权级执行的指令(三种) ; 4. 专门用在能够扩展到片外的协处理器中(三种) 。 ARM9 的指令集比较适用不同的高级语言编译器,但需要临界代码段,汇编语 言编程也比较简单,不像其它的需要复杂的编译器来管理指令。 ARM9 的流水线技术可以连续运行指令的处理和系统存储的各个部分。 在存储的系统中,ARM9 存储接口的设计能够以低代价发挥最大限度性能。 ARM9 有 32 位地址总线,也可以配制成 26 位的地址线,使早期版本的处理器 能够被它兼容。 全静态 CMOS 的 ARM9,允许时钟停止循环,并保存当前状态。 基于上述的优势,ARM9 适用于一些需要紧凑且功能强大的 RISC 处理器系统, 包括电子通讯、数据通信、信息存储、图像处理、JOEG 控制器等,为人们的日常生 活和工业生产带来了极大的便利。

4

大庆师范学院本科毕业论文(设计)

第四章 μC/OS-Ⅱ在 S3C2440 上的移植 4.1 移植环境简介
保证一个系统的内核保证能够在多个微处理器或微控制器上,同时保持了它的 实时性和稳定性操作过程,就是移植。本文硬件平台选择的是 S3C2440 芯片,软件 开发环境应用 ADS1.2,再通过 JLink-H 进行调试,基本满足了移植的需求。 ARM9 的 S3C2440,能够在 ARM920T 核心的基础上,对系统内存进行高效的 管理;基于 ARBA 总线和哈佛结构高速缓冲,使其具备了独立的 16KB 指令和数据 高速缓存的体系结构。

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 文件中的头文件,其中包含了可能 用到的头文件和一些可能与实际应用不相关的头文件。由于头文件的增加,导致了

5

大庆师范学院本科毕业论文(设计)

编译时间变长,但是避免了在编译过程中头文件丢失的风险,大大增强了移植性。 由于 includes.h 文件,我们在增加需要的头文件时,只需写入这个头文件中即可。为 了避免在编译过程中将已编译的内容重新编译,必须把需要增加 的头文件加在 includes.h 列表的最后。

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

4.3.3 OS_CPU.H
OS_CPU.H 文件中主要是用#define 重新定义一些与处理器相关的常量,宏和数 据类型。 众所周知,处理器有 8 位到 64 位甚至 128 之分,不同的处理器对应操作系统的 位数也是不尽相同,否则会发生无法兼容的问题,在 C 中使用频繁的 short(短整) , int(整型)和 long(长整)等数据类型,在 μC/OS-Ⅱ是不使用的。所以为了能够与 处理器的字长相匹配,需要对 μC/OS-Ⅱ中的数据类型进行重新的定义。 在任何的操作系统中,中断都是必不可少的,否则在更高优先级的任务发生时, 无法对其进行处理,可能导致系统的崩溃。μC/OS-Ⅱ在访问临界代码段的时候需要 将中断禁止,并且在代码段访问完毕之后重新置中断为允许状态,所以 μC/OS-Ⅱ中 有 两 个 宏 对 中 断 进 行 禁 止 和 允 许 : OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL()。 不同的处理器的堆栈生长方式不同,在移植过程中需要对堆栈生产方式进行改 变,μC/OS-Ⅱ定义了结构常量 OS_STK_GROWTH,将其置 1 时生长方式是从上往 下,置 0 则相反。 在执行中断,或者任务优先级变化的时候,需要任务的切换(低任务优先级级 到最高优先级任务) 。任务切换简而言之就是将当前任务的寄存器和状态字保存到堆 栈 中 并把 更高 优先 级任 务 从堆 栈中 恢复 出来 。 在任 务切 换的 时候 就 需要 调 用 OS_TASK_SW()宏,在移植过程中需要对这个宏进行定义。

4.3.4 OS_CPU_C.C
μC/OS-Ⅱ的移植中需要用 C 语言编写六个简单的函数: 1. OSTaskStkInit()
6

大庆师范学院本科毕业论文(设计)

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()过程中会得到任务传递地址,pdata 指针,任务堆栈栈顶和任务优先级 等参数, OSTaskStkInt()用上述的三个参数和一个附加在 OSTaskCreateExt()中得到的 选项确保了堆栈结构初始化的正确性。 在 初 始 化 堆 栈 开 始 时 , OSTaskStkInit() 返 回 堆 栈 指 向 的 地 址 传 递 给 OSTaskCreate()和 OSTaskCreateExt(),同时任务控制块(OS_TCB)也会保存该地址, 处理器文档会指明堆栈指针会是指向指向了还是数据的堆栈单元位置下个堆栈的空 闲位置。

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

4.3.4.3 OSTaskDelHook()
OSTaskDelHook():主要用在任务的删除时,同功能扩展函数的情形一样, OSTaskDelHook()也是通过 OS_TCB 指针访问成员,进行成员的检测和清除, OSTaskDelHook()无返回值。

7

大庆师范学院本科毕业论文(设计)

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() , 而 此 时 OSStart()可以调用 OSStartHighRdy(),执行优先级最高的任务。需要注意的是,在调 用 OSTaskSwHook()之后和恢复最高优先级任务之前需要将 OSStartHighRdy()中的 OSRunning 设置为 TRUE。

4.3.5.2 OSCtxSw()
OSCtxSw():执行最高优先级的任务是 μC/OS-Ⅱ的特点之一,而 OSCtxSw()就
8

大庆师范学院本科毕业论文(设计)

是 基 于 此 而 创 建 的 函 数 。 同 定 义 的 函 数 OSTaskSwHook() 的 执 行 过 程 类 似 , OSCtxSw()执行时中断的状态也是禁止的。

4.3.5.3 OSIntCtxSw()
OSIntCtxSw():在 μC/OS-Ⅱ中唯一与处理器相关的函数(代码需写在汇编文件 中 ) 当 μC/OS-Ⅱ 判 断 有 比 中 断 更 为 重 要 的 事 件 发 生 时 , OSIntExit() 会 调 用 。 OSIntCtxSw()从中断中切换出去。需要注意的是,由于无法从 C 直接访问 CPU 的寄 存器,所以在编译器能够插入汇编代码的前提下,可以将 OSIntCtxSw()代码可以放 到 OS_CPU_C.C 文件中,而不是 OS_CPU_A.ASM 文件中。因为 OSIntCtxSw()的 代 码 与 OSCtxSw() 的 函 数 代 码 基 本 上 是 相同 的 , 所 以 可 以 通 过 “BL” 指 令 减 少 OSIntCtxSw()代码量,这在移植实例中是常见的。

4.3.5.4 OSTickISR()
OSTickISR():通过调用,时钟节拍以每秒发生 10-100 次的频率从而满足时间 期满和延时的功能。

9

大庆师范学院本科毕业论文(设计)

第五章 实例移植
本章的主要内容是在对移植有了较为全面的了解和认识之后,将 μC/OS-Ⅱ操作 系统移植到 ARM9 的处理器上, 然后编写一个简单地应用程序, 实现 LED 灯的控制。

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

图 5-1 源代码文件夹

其中 S3C2440 文件夹中包含了两个子文件夹,分别是 includes 和 source,如图 5-2 所示:

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

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

图 5-3 includes 文件夹

在 source 文件中是 S3C2440 相关的源文件,包括 Timer.c、2440init.s、
10

大庆师范学院本科毕业论文(设计)

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 文件夹
11

大庆师范学院本科毕业论文(设计)

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

图 5-8 arm 文件夹

在 SOURCE 文件夹中有一个 API 文件夹(包含 os_api.h 和 os_api.c)和一些与 系统服务相关的函数文件,包括 os_core.c、os_dbg_r.c、os_flag.c、os_mbox.c、 os_mem.c、os_mutex.c、os_q.c、os_sem.c、os_task.c、os_time.c、os_tmr.c、 Printf.h、Printf.c 和 ucos_ii.c,如图 5-8 所示:

图 5-8 SOURCE 文件夹

在对源码结构了解之后,就是对所需文件进行相应的配置,具体配置代码见附 录 1。

5.2 工程创建
在 PC 机上安装 ADS1.2 和 JLink-H 仿真器 (软件和驱动)通过转换口将 JLink-H , 仿真器和 ARM9 的开发板以及 PC 机连接起来, ARM9 的蜂鸣器短接跳线 JP9。J-Link 与 ARM9 连接图如图 5-9 所示

12

大庆师范学院本科毕业论文(设计)

图 5-9 JLink 与 ARM9 的连接图

PC 机上启动 ADS 1.2,新建一个 ARM Executable Image 工程,在 Project name 中填写工程名称:uCOS.mcp,在 Location 中加入代码所在位置,工程建立完毕。

5.3 工程设置
在 ADS1.2 中的工程建立之后,还需要对于工程进行相应的设置 在【Edit】→【DebugRel Settings】下 在【Target】条目中选择【Target Settings】 ,将其中的【,Post-linker】设置为 ARM fromELF,如图 5-10 所示。

图 5-10 工程设置(1)
13

大庆师范学院本科毕业论文(设计)

在【Target】条目中选择【Access Paths】 ,将【Always Search User Paths】选中(因 为 ucos_ii 部分文件采用#include <>包涵,不修改这里找不到文件) ,如图 5.2.2 所示。

图 5-10 工程设置(2)

在 【Language Settings】 条目下依次选择 【ARM Assembler】 、 【ARM C Compliler】 、 【ARM C++ Complier】 ,将它们的处理器都设置成 ARM920T,如图 5-11 所示。

图 5-11 工程设置(3)

在【Language Settings】条目下选择【ARM C Compliler】 ,在【Errors】中勾销 掉 【Implicit pointer c】 然后选择 , 【ARM C Compliler】 在 , 【Warnings】 中购销掉 【Unused declaration】 (-O1 -g+ -cpu ARM920T -Wx -Ec) ,如图 5-12 所示

14

大庆师范学院本科毕业论文(设计)

图 5-12 工程设置(4)

在【ARM Linker】条目下选择【Output】 ,将【RO Base】设置成 0x30000000, 【Options】 【Image entry point】 下 设置成 0x30000000, 【Layout】 【Place at beginning 下 of image】下的【Object/Symbol】设置成 2440init.o, 【Section】设置成 Init, 【Listings】 下选勾 Image map、 【List file】设置 list.txt,勾上 Sizes、Totals、Unused、Veneers。 如图 5-13 所示。

图 5-13 工程设置(5)

【ARM fromELF】条目下选择【Output file name】 ,填写“输出的二进制”,如图 5-14 所示

15

大庆师范学院本科毕业论文(设计)

图 5-14 工程设置(6)

在 ADS1.2 工程配置过后,同样对 JLink-H 进行相应的设置。 打开 JFlashARM,点击 Options 下拉菜单,找到 Project settings 选项,点击,在 【General】中对连接 USB 端口进行设置(不确定的情况下去系统设备管理器中查 找),如图 5-15 所示:

图 5-15 JLink 设置(1)

在【Target Interface】条目中的【Core】选择设备:ARM9,如图 5-16 所示:

16

大庆师范学院本科毕业论文(设计)

图 5-16 JLink 设置(2)

JLink 设置完毕。

5.4 实例调试
在工程和 JLink 全部设置完毕,将测试程序写入到 main.c 函数中,测试程序见 附录。设置之后,选用 DebugRel 生成目标,然后点击 Make 编译工程。编译成功显 示如图 5-17 所示:

图 5-17 编译界面

在这里显示出现 0 个错误,7 个警告,由下面的窗口可知,警告是因为 LCD 日 期打印,导致的原因可能是下载的源码中 LCD 源码部分不完整或者混淆,但是这不
17

大庆师范学院本科毕业论文(设计)

影响移植的测试,所以未加以修改。 将 ARM9 开发板上的蜂鸣器跳线 JP9 短接,将启动方式选择跳线 JP8 短接,然 后按 RST 键复位系统。 选择【Project】->【Debug】 ,启动 AXD 进行 JTAG 仿真调试。 在这里声明一下, 因为 JLink 是一个在线修改下载的仿真器,所以在代码不正确 都得情况下,可以直接在线修改,不需要像 DNW 和超级终端一样重复下载。 在 main.c 中默认设置几个断点,程序会在断点处停止,然后进行分步执行操作 同 VB 类似, ADS1.2 中可以通过观察窗口观察程序中的全局变量和局部变量 在 的值的变化情况, 具体操作是点击 【Context Variable】 按钮(或者选择 【Processor Views】 条目下的【Variables】)。

18

大庆师范学院本科毕业论文(设计)

第六章 结束语
本文对嵌入式实时操作系统 μC/OS-Ⅱ移植到 ARM9 开发板上的过程进行了较为 详尽的分析和操作,通过简单的任务例程,在 ADS1.2、EasyJTAG-H 仿真器及开发 板的组合情况下进行了测试,从而验证了移植的准确性,成功的为 μC/OS-Ⅱ嵌入式 实时系统的复杂应用,提供了基本条件。 随着科技的发展,工业生产和日常生活的需要,作为一个具有明显优势的实时 操作系统,μC/OS-Ⅱ具有广泛的应用前景和市场价值,必定会在嵌入式中占据一席 之地。

19

大庆师范学院本科毕业论文(设计)

[参考文献]
[1] 王振宇. uC/OS 操作系统在 ARM 系统中的应用[D]. 长春:吉林大学硕士学位论文, 2003:1-16. [2] 李承创, 陈跃斌, 房晓丽, 等. uC/OS-III 在 Cortex-M3 处理器上的移植[J]. 单片机与嵌入式系统应用, 2012(4):42-44. [3] 孙顺远,秦会斌,崔佳冬,等. μC/OS-Ⅱ在 Cortex-M3 内核上的移植及优化[J]. 计算机系统应用, 2010(4): 208-211. [4] 唐其伟. 基于 ARM 与 μC/OS-II 的嵌入式系统研究[D].广州:广东工业大学硕士学位论文, 2005:32-52. [5] 罗西门. UCOS_II 的移植,ADS1.2+ARM9(S3C2440)[EB/OL]. [2013-5-15]. http://blog.163.com/muren2006 2094@yeah/blog/static/161844416201172595510470/. [6] Jean J.Labrosse.嵌入式实时操作系统 uCOS-II[M]. 邵贝贝,等译.北京:北京航空航天大学出版社, 2 003 年 :97-145. [7] 李玉刚. 嵌入式操作系统 μC/OS-Ⅱ在 ARM 上的移植研究[J]. 微计算机信息, 2010,23:97-98. [8] 王帅. 基于 SOPC 的多路温度检测系统设计[D].成都:成都理工大学硕士学位论文, 2012:35-38. [9] 张雪峰. 基于实时内核 μC/OS-II 的应用研究[D].成都:西南交通大学硕士学位论文, 2004 年 4 月:1-23. [10] 陶保壮. 基于 ARM7 的嵌入式操作系统 μC/OS-II 平台的剖析与实现[J].安徽工程科技学院学报, 2009(2):55-57.

20

大庆师范学院本科毕业论文(设计)

附 录 OS_CPU.H 文件函数:
#ifdef OS_CPU_GLOBALS #define OS_CPU_EXT #else #define OS_CPU_EXT extern #endif 数据类型(与编译器有关) typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef signed char INT8S; /* 无符号布尔类型*/ /*无符号 8 位整数*/ /*有符号 8 位整数*/ /*无符号 16 位整数*/ /*有符号 16 位整数*/ /*无符号 32 位整数*/ /*有符号 32 位整数*/ /*单精度浮点数*/ /*双精度浮点数*/

typedef unsigned char INT16U; typedef signed char INT16S;

typedef unsigned char INT32U; typedef signed typedef float typedef double char INT32S; FP32; FP64;

typedef unsigned int OS_STK;

/*堆栈入口宽度为 16 位*/

与处理器相关的代码 define OS_ENTER_CRITCAL() define OS_EXIT_CRITICAL() /*禁止中断*/ /*允许中断*/

define OS_STK_GROWTH 1

/*定义堆栈的增长方向:1=向下,0=向上*/

#define OS_TASK_SW

OS_CPU_A.ASM 文件函数
OSStartHighRdy()的原型如程序清单 : void OSStartHighRdy (void)
21

大庆师范学院本科毕业论文(设计)

{ Call user definable OSTaskSwHook(); Get the stack pointer of the task to resume: Stack pointer = OSTCBHighRdy->OSTCBStkPtr; OSRunning = TRUE; Restore all processor registers from the new task's stack; Execute a return from interrupt instruction; }

OSCtxSw()的原型程序清单: void OSCtxSw(void) { 保存处理器寄存器; 将当前任务的堆栈指针保存到当前任务的 OS_TCB 中: OSTCBCur->OSTCBStkPtr = Stack pointer; 调用用户定义的 OSTaskSwHook(); OSTCBCur = OSTCBHighRdy; OSPrioCur = OSPrioHighRdy; 得到需要恢复的任务的堆栈指针: Stack pointer = OSTCBHighRdy->OSTCBStkPtr; 将所有处理器寄存器从新任务的堆栈中恢复出来; 执行中断返回指令; }

OSIntCtxSw()的原型程序清单: void OSIntCtxSw(void) { 调整堆栈指针来去掉在调用: OSIntExit(), OSIntCtxSw()过程中压入堆栈的多余内容; 将当前任务堆栈指针保存到当前任务的 OS_TCB 中:
22

大庆师范学院本科毕业论文(设计)

OSTCBCur->OSTCBStkPtr = 堆栈指针; 调用用户定义的 OSTaskSwHook(); OSTCBCur = OSTCBHighRdy; OSPrioCur = OSPrioHighRdy; 得到需要恢复的任务的堆栈指针: 堆栈指针 = OSTCBHighRdy->OSTCBStkPtr; 将所有处理器寄存器从新任务的堆栈中恢复出来; 执行中断返回指令; } OSTickISR() 程序清单 L 4.4 在不正确的位置启动时钟节拍中断 void main(void) { OSInit(); /* 初始化 μC/OS-II */

/* 应用程序初始化代码 ... */ /* 调用 OSTaskCreate()建立至少一个任务 */ 允许时钟节拍中断; /* 千万不要在这里允许!!! */ OSStart(); /* 开始多任务调度 */ } 程序清单 L 4.5 时钟节拍 ISR 的原型 void OSTickISR(void) { 保存处理器寄存器; 调用 OSIntEnter()或者直接将 OSIntNesting 加 1; 调用 OSTimeTick(); 调用 OSIntExit(); 恢复处理器寄存器; 执行中断返回指令; }

23

大庆师范学院本科毕业论文(设计)

移植测试程序: void OSTaskIdleHook (void) { static i = 0 ; if (i %20000 = = 0) /*每 20000 次点亮一个 LED 灯*/ { sysUtilsLightLed (LED_ ALL,FALSE) ; sysUtilsLightLed (i %3+1,TRUE) ; } i++; ret urn ; } /*关闭所有的 LED 灯*/ /*循环点亮一个 LED 灯*/

24


相关文档

基于ARM9的嵌入式linux系统移植
第4章 基于ARM9和μCOS-II嵌入式系统设计
μCOS-II嵌入式操作系统在ARM系统中移植与实现
基于ARM9的嵌入式Linux操作系统的移植
基于ARM9的嵌入式的linux操作系统的移植
嵌入式实时操作系统μCOSⅡ的移植
基于ARM9的嵌入式Linux移植
ARM9上的嵌入式Linux系统移植
第八章 μCOS-Ⅱ嵌入式操作系统的移植
基于ARM9平台的嵌入式Linux系统的编译和移植
电脑版