基于M3的μCOS-II移植
Cortex-M3移植ucos总结
Cortex-M3移植总结Cortex-M3内核浅谈在移植之前需要稍微了解Cortex-M3内核,主要需要了解一下几个内容:1Cortex-M3中的上下文切换主要使用PendSV异常来实现a)为什么可以通过PendSV异常能实现任务切换?答:因为我们使用的是systick异常来提供系统时钟,假设现在正在响应一个中断,此时一个systick异常产生,那么当前正在进行的中断必须被停止,转而去执行systick异常,而执行systick异常会产生任务切换的动作,这样便会使原中断请求被延迟,这在实时操作系统中是不允许的,另一个原因是:如果OS在中断活跃期尝试切入线程模式,将会触犯用法fault异常(因为在处理中断服务程序时处于特权级处理者模式,而应用程序是处于用户级的线程模式,从特权级处理者模式切换到线程模式会产生用法fault异常)。
而通过引入PendSV异常便可避免上述两个问题的产生,其执行过程为:当执行任务切换时会挂起一个PendSV异常,并把PendSV异常优先级置为最低,也就是说,当一个系统正在处理一个异常服务程序时产生了systick异常,那么当前中断被抢断,转而执行systick异常,而systick会执行上下文切换,由于引入了PendSV异常,所以上下文切换就是产生一个PendSV异常,并且将其优先级置为最低(255),然后退出systick,返回到被中断的ISR继续执行,执行完ISR后,由于PendSV异常被挂起,便进入PendSV异常,在PendSV异常服务中执行任务切换,这样便解决了中断被延迟的状况,以及防止了从中断活跃期切入线程模式。
详细解释见《Cortex-M3权威指南》P123其执行过程如下图所示:2中断响应序列(见《Cortex-M3权威指南》P135)需要了解Cortex-M3响应中断的所执行的三个动作1.入栈:把8个寄存器的值压入栈2.取向量:从向量表中找出对应的中断服务程序入口地址3.选择堆栈指针MSP/PSP,更新堆栈指针SP,更新链接寄存器LR,更新程序计数器PC对于移植需要特别注意的是第一个过程:入栈。
μCOS-II-下-LwIP-协议栈的移植和测试
1、引言为了实现嵌入式系统终端连入互联网,而有必要为其引入了网络功能。
μC/OS II 是一个源代码开放的实时操作系统,但是它只是一个实时的任务调度及通信内核,并没有集成TCP/IP 通信协议,为了实现网络功能,需要在μC/OS II 移植一个轻量级的TCP/IP 通信协议LwIP。
本文主要论述μC/OS II 下通信协议LwIP 的移植以及测试。
2、LwIP 简介LwIP ( light weight IP)是瑞士计算机科学院的Adam Dunkels 等开发的一套开放TCP/IP 协议栈源代码。
LwIP 既可以移植到操作系统上,又可以在无操作系统的情况下独立运行。
LwIP 实现的重点是在保持TCP/IP 协议主要功能的基础上减少对RAM 的占用,这使LwIP 适合在低端嵌入式系统中使用。
其主要特点如下:(1)支持多网络接口下IP 转发;(2)支持ICMP 协议;(3)包括试验性扩展的UDP;(4)包括简单的拥塞控制,RTT 估算和快速恢复和快速转发的TCP;(5)提供专门的内部回调接口(Raw API)用于提高应用程序性能;(6)可选择的Berkeley 接口API;3、LwIP 协议栈移植到μC/OS II 操作系统的具体实现3.1 嵌入式系统结构和LwIP 接口整个嵌入式系统的结构如图 1 所示,由ARM 微处理器、网卡、网络设备驱动、μC/OSII 操作系统、LwIP 协议栈和应用程序组成。
图 1 嵌入式系统结构图LwIP 在设计时为了适应不同的操作系统,并没有在代码中使用和某个特定的操作系统相关的系统调用和数据结构,而是在LwIP 和操作系统之间提供了一个接口层(sys_arch interface),该接口主要实现的功能包括数据类型的定义、存储模式的选择、任务间的同步、时间和内存的管理等。
因此,完成LwIP 在μC/OS II 移植,我们就是要通过修改这个接口层来实现。
同时,还要根据自己所要实现的具体目的,可以对LwIP 协议栈进行一定的裁减。
基于ARM架构的μCOS-II移植及其实时同步交流采样.
基于ARM架构的μC/OS-II移植及其实时同步交流采样随着微处理器技术与信息技术的不断发展,嵌入式系统的应用也进入到国防、工业、能源、交通以及日常生活中的各个领域。
嵌入式系统的软件核心是嵌入式操作系统。
然而,国内在嵌入式系统软件开发上有很多困难,主要有:国外成熟的RTOS大都价格昂贵并且不公开源代码,用好这些操作系统需对计算机体系结构有深刻理解。
针对以上问题,免费公开源代码的嵌入式操作系统就倍受瞩目了,μC/OS-II就是其中之一。
μC/OS-II是面向中小型应用的、基于优先级的可剥夺嵌入式实时内核,其特点是小巧、性能稳定、可免费获得源代码。
本文在深入研究μC/OS-II内核基础上,将其运用于实际课题,完成了基于ARM架构的μC/OS-II移植及实时同步交流采样的误差补偿研究。
本文主要工作内容和研究成果如下:1.剖析了μC/OS-II操作系统内核,重点研究了μC/OS-II内核的任务管理与调度算法机理,得出了μC/OS-II内核优点:任务调度算法简洁、高效、实时性较好(与Linux相比)。
2.介绍了ARM9体系架构,重点讲叙了MMU(存储管理单元)功能。
为了提高交流采样系统的取指令和读数据速度,成功将MMU功能应用于本嵌入式系统中。
3.完成了μC/OS-II操作系统在目标板上的移植,主要用汇编语言编写了启动代码、开关中断、任务切换和首次任务切换等函数。
4.针对国内外提出的同步交流采样误差补偿算法的局限性,本文从理论上对同步交流采样的准确误差进行了研究,并尝试根据被测信号周期的首尾过零点的三角形相似法,求出误差参数并对误差进行补偿。
此外,考虑到采样周期ΔT不均匀,经多次采样后会产生累积误差,本文也给出了采样周期ΔT的优化算法。
5.完成了系统硬件设计,并根据补偿算法和ΔT优化法则,编写了相应采样驱动和串口驱动。
最后对实验数据进行了分析和比较,得出重要结论:该补偿算法实现简单,计算机工作量小,精度较高。
μC/OS—Ⅱ在Cortex—M3系列单片机上的移植
目标 板 以 建 立 交 叉 开 发 调 试 环 境 。 移植 过程 中,C O u / S— I 核 心 源 代 码 不 用 修 改 , I的 可
以直 接 放 在 u os—I S u c c/ I o r e文 件 夹 中 。u OS—I\ c/ I
器 结构 , 以低 成 本 、 功 耗 、 性 能 等 优 点 占据 了嵌 入 式 它 低 高
…
n
” 一 ’
关键词
⑤ 具 有 嵌 套 向量 中 断 控 制 器 ( NVI , 处 理 器 内核 C) 与
引 言
t/ t OS—I 是 一 种 简 单 高 效 、 代 码 公 开 的 实 时 嵌 入 C I 源
式 操 作 系 统 , 有 良好 的 扩 展 性 和 可 移 植 性 , 广 泛 应 用 具 被
三个 必 要 的 文 件 。Ta g t目 录 中 的 S a tp S文 件 是 单 re tru . 片机 的 启 动 代 码 和 中 断 向 量 表 , r e. Tag t C和 Tag t H 提 r e.
供 单 片 机 初 始 化 函 数 T reIi 和 其 他 简 单 的 外 设 控 ag t t n () 制 A I P 函数 。层 次 结 构 如 图 1 示 。 所
方 法 , L S 9 2单 片 机 为 例 给 出部 分 移植 函 数 的代 码 , 通 过 一 个 实例 的 应 用 验 证 移 植 的 正 确 性 。 以 M3 8 6 并
嵌 入 式 实 时 操 作 系 统 Co tx—M 3 u / re c os—I 移 植 I L 3 8 6 M S 92
系 统应 用 领域 的 领 先 地 位 。 当 前 ARM 系 列 的 处 理 器 有
μCOSⅡ在基于Cortex-M3核的ARM处理器上的移植
μCOSⅡ在基于Cortex-M3核的ARM处理器上的移植关海;冯大政
【期刊名称】《电子科技》
【年(卷),期】2009(22)1
【摘要】介绍了源代码公开的实时操作系统μCOSⅡ在ARM处理器
STM32F103VBT6上的移植过程.首先简要介绍了ARM核Cortex-M3的一些基本概念,然后结合其基本概念用C语言和汇编语言修改了移植过程中需要修改的所有源代码文件且给出了其详细解释.最后给出了一个基于μCOSⅡ嵌入式操作系统的简单应用,讨论了基于嵌入式操作系统的应用程序开发方法与传统应用程序开发方法的区别,说明前者方法的优越性并验证了移植的成功.
【总页数】6页(P69-74)
【作者】关海;冯大政
【作者单位】西安电子科技大学,电子工程学院,陕西,西安,710071;西安电子科技大学,电子工程学院,陕西,西安,710071
【正文语种】中文
【中图分类】TP316.2
【相关文献】
1.基于ARM处理器的μCOS-Ⅱ移植 [J], 许伦辉;修科鼎
2.基于Cortex-M3内核LM3S8962处理器上的μC/GUI移植研究 [J], 张璇;张英杰
3.基于Cortex-M3核的μCOS-Ⅱ移植与应用 [J], 潘丽蕊;袁保社
4.基于Cortex-M3嵌入式操作系统eCos移植 [J], 徐亮;姜波
5.uC/OS-Ⅱ与uC/GUI在Cortex-M3上的移植研究与实现 [J], 石亿;黄辉先;赵娟;徐建闽
因版权原因,仅展示原文概要,查看原文内容请购买。
uCOSII在cortexM3上的移植方法和步骤
void void
OS_CPU_SysTickInit(void); OS_CPU_SysTickClkFreq(void);
3. 修改 OS_CPU_C.C: 将以下代码注释掉:
4. 修改 OS_CPU_A.ASM: 由于编译器的原因,将“PUBLIC”关键词改为”EXPORT”. 并将原来的: RESG CODE: CODE:NOROOT(2) 修改为:
二、 建立存放目录:
在选定的逻辑盘上新建一个文件夹,如: LED,在 LED 文件夹下面新建下面 5 个文件夹, 如下图所示:
这些文件夹存放内容分配如下: 1. BSP: 主要用来存放板级支撑程序,如:功能模块初始化程序,端口初始化程序等。 2. Libraries: 用来存放 Stm32 官方库函数文件,这些库文件可以从官方网站下载得到, 本文中使用的版本是 3.5 版,进入 Ligraries 后可以看到下面两个文件夹:
3. Project: 存放工程文件,包括输出文件,列表文件等,具体存放内容再后面会有进 一步的介绍。 4. uCOS-II: 存放操作系统文件, 将前面讲到的文件夹 Ports 和 Sourec 连内容一起复制 到此文件下面,如下图所示:
2 / 12
5. User:存放用户源程序文件。
三、 创建工程:
1. 打开 Keil MDK,新建一个名为”LED”的工程,将工程文件存放在 LEDProject 文件下 面,控制器选 STM32F103RB。 2. 按下图建立 Project Target,Groups。
3 / 12
3. 在相应的 Groups 下面添加或者新建源程序文件和头文件:
4 / 12
ห้องสมุดไป่ตู้
嵌入式实时操作系统μCOS-Ⅱ的移植
嵌入式实时操作系统μCOS-Ⅱ的移植1、引言嵌入式系统由于它具有软件代码小、高度自动化、响应速度快等特点已经使它在许多领域得到广泛的应用[3]。
从家里的洗衣机、电冰箱,到作为交通工具的自行车、小汽车,到办公室里的远程会议系统等。
嵌入式系统通常由硬件环境和操作系统构成。
在嵌入式操作系统的统一调度管理下实现对所有系统资源的合理利用和分配,达到提高系统性能和有效利用有限资源的目的。
μCOS-Ⅱ作为一个源码开放的嵌入式实时操作系统,同时具有良好的可移植性、可裁剪性、可剥夺性、稳定性和可靠性等优点,使其成为许多嵌入式操作系统的首选。
本文将μCOS-Ⅱ在Freescale的8位处理器芯片HC9S08上移植实现。
2、μCOS-Ⅱ系统结构μCOS-Ⅱ是一个完整的可移植可固化可裁剪的抢占式实时多任务内核。
可以在不需要做很大修改的基础上方便的移植到多种处理器上。
条件是:该处理器要具有一定数量的堆栈,能够使用软件中断,产生定时器中断,此外,编译器要支持可重入代码,并且要能使用汇编实现对处理器内部寄存器的相关操作[2][4]。
通过μCOS-Ⅱ的管理,使多个任务之间相互协调,分时的占用CPU,实现充分利用资源和实时等相应的功能。
任务通常是一个死循环,用来完成某一特定的功能;一个任务相当于一个线程。
μCOS-Ⅱ可以管理多达64个任务,每个任务都具有一个唯一的合法优先级。
但是,优先级最低的那个任务已经被系统定义为空闲任务,用户不能使用。
用户可以通过函数OSTaskCreate()来创建任务,通过OSTaskDel()来删除任务。
任务可能有以下五种状态:睡眠态、就绪态、运行态、等待状态、中断服务态。
利用不同的系统函数可以实现任务在各状态之间的转换。
μCOS-Ⅱ通过对就绪表的操作总是选择在就绪任务中优。
μC-OS-Ⅱ移植
移植 µC/OS-Ⅱ Ⅱ这一章介绍如何将 µC/OS-Ⅱ移植到不同的处理器上。
所谓移植,就是使一个实时内核 能在某个微处理器或微控制器上运行。
为了方便移植,大部分的 µC/OS-Ⅱ代码是用 C 语言 写的;但仍需要用 C 和汇编语言写一些与处理器相关的代码,这是因为 µC/OS-Ⅱ在读写处 理器寄存器时只能通过汇编语言来实现。
由于 µC/OS-Ⅱ在设计时就已经充分考虑了可移植 性,所以 µC/OS-Ⅱ的移植相对来说是比较容易的。
如果已经有人在您使用的处理器上成功 地移植了 µC/OS-Ⅱ,您也得到了相关代码,就不必看本章了。
当然,本章介绍的内容将有 助于用户了解 µC/OS-Ⅱ中与处理器相关的代码。
要使 µC/OS-Ⅱ正常运行,处理器必须满足以下要求: 1. 处理器的 C 编译器能产生可重入代码。
2. 用 C 语言就可以打开和关闭中断。
3. 处理器支持中断,并且能产生定时中断(通常在 10 至 100Hz 之间)。
4. 处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。
5. 处理器有将堆栈指针和其它 CPU 寄存器读出和存储到堆栈或内存中的指令。
像 Motorola 6805 系列的处理器不能满足上面的第 4 条和第 5 条要求,所以 µC/OS-Ⅱ 不能在这类处理器上运行。
图 8.1 说明了 µC/OS-Ⅱ的结构以及它与硬件的关系。
由于 µC/OS-Ⅱ为自由软件,当用 户用到 µC/OS-Ⅱ时,有责任公开应用软件和 µC/OS-Ⅱ的配置代码。
这本书和磁盘包含了所 有与处理器无关的代码和 Intel 80x86 实模式下的与处理器相关的代码(C 编译器大模式下 编译) 。
如果用户打算在其它处理器上使用 µC/OS-Ⅱ,最好能找到一个现成的移植实例,如 果没有只好自己编写了。
μC/OS-II操作系统在各种处理器上的移植
μC/OS-II操作系统在各种处理器上的移植信息来源: 维库开发网发布时间:2009年12月29日μC/OS-II操作系统是一种抢占式多任务、单内存空间、微小内核的嵌入式操作系统,具有高效紧凑的特点。
它执行效率高,占用空间小,可移植性强,实时性能良好且可扩展性强。
采用μC/OS-II实时操作系统,可以有效地对任务进行调度;对各任务赋予不同的优先级可以保证任务及时响应;采用实时操作系统,降低了程序的复杂度,方便程序的开发和维护。
μC/OS-11非常适合应用在一些小型的嵌入式产品应用场合,在家用电器、机器人、工业控制、航空航天、军事科技等领域有着广泛的应用。
单片机、ARM、FPGA与μC/OS-II操作系统相结合,实现一些具体功能,是目前嵌入式应用中比较常见的。
在这些应用中,基础性的工作就是操作系统的移植。
本文选取使用较多的51单片机、LPC2210、NiosII三种处理器进行介绍。
1 μC/OS-II操作系统移植条件μC/OS-II操作系统的大部分源代码都是用C语言书写的,但仍需使用汇编语言来完成一些和处理器相关的操作,例如读写处理器、寄存器时只能使用汇编语言来实现。
因此,将μC/OS-II操作系统移植到目标处理器上,需要从硬件和软件两方面来考虑。
硬件方面,目标处理器需满足以下条件:①处理器的C编译器能产生可重入代码;②用C语言可以开/关中断;③处理器支持中断,并且能够产生定时中断(通常在10~1 000 Hz之间);④处理器能够支持容纳一定量数据的硬件堆栈;⑤处理器有将堆栈指针和其他寄存器读出和存储到堆栈或内存中的指令。
软件方面,主要关注的是一些与处理器相关的代码移植,其分布在OS_CPU.H、OS_CPU_C.C和OS_CPU_A.ASM这3个不同的文件中。
2 目标处理器硬件支持51单片机、LPC2210、NiosII三种处理器在硬件方面均能满足μC/OS-II操作系统的移植要求。
51单片机:选择Keil公司的集成开发环境作为开发工具,因为该集成开发环境的C51编译器能产生可重入型代码,且用C语言就可以开/关中断。
Cortex—M3的μC/OS—II任务调度硬件指令实现
5 0 1 0 2 0, , 3, 1, 2, 1, , , , , , 1 0, 0, 0, 0, 0, /*0 2  ̄ 0 2 x0 x F*/
7 6 5 4 3 2 1 O
4 0, , , , , , 3, 1 0, 0, 0, /*0 3 ~ 0 3 , 1 0 2 0 1 0, 0, , 2, 1, x0 x F*/ 6 0 1 0 2 0, , 3, 1, 2, 1, , , , , , 1 0, 0, 0, 0, 0, /*0 4  ̄ 0 4 x0 x F*/
的 . / s—I 任 务 调 度硬 件 指令 实现 co I
屈 召 贵 , 永 强 。 名 茂 周 龚
( 川 师 范大 学 成 都 学 院 , 都 6 14 ) 四 成 1 7 5
1  ̄/ c os—I的任 务 调 度 算 法 分 析 I
1 1  ̄ / s—l 务 就 绪 表 的 解 读 . co l 任
表 算 法 , 用 这 种 算 法 能 快 速 实 现 任 务 调 度 原 则 。如 何 从 利 任务就绪表中 , 找优 先级最 高 的那个 任务?归结 起来 : 查
两个 变 量 ( Rd Gr 、 Rd Tb[ ) 两 张 表 ( Ma Tb OS y p OS y l ̄ 和 - OS p l
OS y p位 置 1 Rd Gr 。
OS yGr Rd p
2 6个 单 元 的数 据 表 OS Ma ห้องสมุดไป่ตู้b口 , 中 按 一 定 规 律 有 5 Un p l 表
1 8个 0 6 2 ,4个 1 3 ,2个 2, 6个 3 8个 4 4个 5 2个 6 1 1 , , , ,
个 7, 有 1个 0 共 2 6字 节 。OS Ma Tb[ 的 定 义 如 还 , 5 Un p l ̄ -
μCOS-II在ARM Cortex-M3处理器上的移植
μCOS-II在ARM Cortex-M3处理器上的移植Cortex-M3是ARM公司最新推出的基于ARMv7-M架构的低功耗处理器。
在深入了解μCOS-II工作原理和Cortex-M3特性的基础上,给出了在STWl32F103ZE 处理器上的详细移植过程。
将移植后的μC/OS-Ⅱ操作系统应用于移动多媒体直放站CMMB项目中,验证了移植的成功。
这对于管理硬件资源,缩短开发周期和提高系统稳定性方面有着重要的意义。
0 引言嵌入式系统已经广泛渗透到了人们工作、生活中的各个领域,嵌入式处理器已占分散处理器市场份额的94%,其中ARM的应用最为广泛。
基于ARM内核的处理器以其诸多优异性能而成为各类产品中选用较多的处理器之一。
当系统越来越大,应用越来越多时,就出现了如何管理众多的硬件资源,以及如何满足系统的实时控制要求和如何提高系统软件开发效率等不可回避的问题。
这时,使用嵌入式操作系统很有必要。
操作系统的主要作用有:统一管理系统资源;为用户提供访问硬件的接口;调度多个应用程序和管理文件系统等。
1 概述μC/OS-II是著名的、源码公开的实时内核,是专为嵌入式应用设计的,可用于各类8位、16位和32位处理器。
μC/OS-II已经在世界范围内得到广泛使用,包括诸多领域,如手机、飞行器、医疗设备及工业控制等。
实际上,μC /OS-II已经通过了非常严格的测试,并且得到了美国航空管理局的认证,可以用在飞行器上。
这说明μC/OS-II是稳定可靠的。
Cortex-M3是一款低功耗处理器,具有门数目少,中断延迟短,调试成本低的特点,是为要求有快速中断响应能力的深度嵌入式应用而设计的。
该处理器采用最新的ARMv7-M架构。
还具有如下特性:(1)采用Thumb-2指令集。
在Thumb-2中,16位指令首次与32位指令并存,代码密度得到很大改善。
(2)Cortex-M3处理器可配置为具有SW-DP或JTAG-DP调试端口。
(3)使用可选的MPU对处理器提供存储器保护。
2023年Nexys3移植uCOS-II实验报告
Nexys3移植uCOS-II试验汇报试验组员及时间姚灿荣、贺文强、方圆 2023年2月28日试验准备(1)书籍《嵌入式操作系统原理及应用》(严海蓉著)(2)计算机(电脑)、Nexys™3 Spartan-6 FPGA Board、开发板随带旳USB连接线;(3)Micrium企业旳µCOS-II和Xilinx MicroBlaze Processor Application Note;(4)Micrium企业旳Micrium-uCOS-II-V290.zip,包括代码与文档;(5)Xilinx企业EDK开发套件,版本号为EDK 12.4;(6)Digilent企业生产旳Nexys3开发板对EDK12.4旳plugin文献。
(1)、(2)、(4)旳文献都可以在随书光盘上旳试验指导部分找到。
试验过程(1)安装EDK 12.4;(2)使用USB线连接开发板与计算机,打开开发板电源;(3)按照《嵌入式操作系统原理及应用》书后试验一进行软硬件配置;一.在开发环境加入NEXY3 旳板级支持包,以便开发套件对开发板旳识别1.把AN-1013\edk_user_repository\Micrium\bsp、uCOS-II_v2_90_a整个文献夹复制到EDK安装目录,如D:\Xilinx\12.4\EDK\sw\lib\bsp下,这样我们就可以在OS & Library Settings选项中选择µCOS-II了。
2.plugin文献中旳Digilent文献夹复制到ISE旳安装目录下,如D:\Xilinx12_4\ISE_DS\ISE\lib\nt\plugins,以保证最终文献从SDK中下载到开发板时可以对旳识别并连接。
二.操作系统硬件环境构建:分步创立过程执行成果如下:处理器构建:1.Bus Interfaces配置成果2.Address配置成果3.Port配置成果警告提醒:NGCBUILD done.--------->make: warning: Clock skew detected. Your build may be incomplete.Done!三.操作系统软件部分构建导出并启动SDK注意事项为使EDK能对Nexys3开发板给出相称旳硬件配置方案,需要将随书光盘中Digilent_boards\boards文献夹按照阐明复制到对应目录下。
ucosii移植实验报告
一、实验目的●了解uC/OS-II内核的主要结构。
●掌握将uC/OS-II内核移植到Cortex-M3处理器上的基本方法。
二、实验环境与设备●硬件:Cortex-M3嵌入式开发平台、用于Cortex-M3的JTAG仿真器或者内嵌的JTAG仿真器、PC机Pentium100以上。
●软件:PC机操作系统win98、Win2000或WinXP、Keil for ARM或IARfor ARM集成开发环境、仿真器驱动程序、超级终端通讯程序等。
三、预备知识●掌握在Keil for ARM或IAR for ARM集成开发环境中编写和调试程序的基本过程。
●了解Cortex-M3处理器的结构。
●理解uC/OS-II系统结构。
四、实验内容●将uC/OS-II内核移植到Cortex-M3微处理器上。
●编写两个简单任务,在超级终端上观察两个任务的切换。
五、流程图六、实验代码修改后的Os_cpu.h#ifndef OS_CPU_H#define OS_CPU_H#ifdef OS_CPU_GLOBALS#define OS_CPU_EXT#else#define OS_CPU_EXT extern#endiftypedef unsigned char BOOLEAN;typedef unsigned char INT8U; /* Unsigned 8 bit quantity*/typedef signed char INT8S; /* Signed 8 bit quantity */typedef unsigned short INT16U; /* Unsigned 16 bit quantity*/typedef signed short INT16S; /* Signed 16 bit quantity */typedef unsigned int INT32U; /* Unsigned 32 bit quantity */typedef signed int INT32S; /* Signed 32 bit quantity */typedef float FP32; /* Single precision floating point*/typedef double FP64; /* Double precision floating point */typedef unsigned int OS_STK; /* Each stack entry is 32-bit wide */typedef unsigned int OS_CPU_SR; /* Define size of CPU status register (PSR = 32 bits) */#define OS_CRITICAL_METHOD 3u#if OS_CRITICAL_METHOD == 3u#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}#endif#define OS_STK_GROWTH 1u /* Stack grows from HIGH to LOW memory on ARM */#define OS_TASK_SW() OSCtxSw()#if OS_CRITICAL_METHOD == 3u /* See OS_CPU_A.ASM */OS_CPU_SR OS_CPU_SR_Save(void);void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr);#endifvoid OSCtxSw(void);void OSIntCtxSw(void);void OSStartHighRdy(void);void OSPendSV(void);#endif修改后的Os_cpu_c.c#define OS_CPU_GLOBALS#include <ucos_ii.h>#include <includes.h>#if OS_TMR_EN > 0ustatic INT16U OSTmrCtr;#endif#if OS_CPU_HOOKS_EN > 0uvoid OSInitHookBegin (void){#if OS_TMR_EN > 0uOSTmrCtr = 0u;#endif}#endif#if OS_CPU_HOOKS_EN > 0uvoid OSInitHookEnd (void){}#endif#if OS_CPU_HOOKS_EN > 0uvoid OSTaskCreateHook (OS_TCB *ptcb){#if OS_APP_HOOKS_EN > 0uApp_TaskCreateHook(ptcb);#else(void)ptcb; /* Prevent compiler warning */#endif}#endif#if OS_CPU_HOOKS_EN > 0uvoid OSTaskDelHook (OS_TCB *ptcb){#if OS_APP_HOOKS_EN > 0uApp_TaskDelHook(ptcb);#else(void)ptcb; /* Prevent compiler warning */#endif}#endif#if OS_CPU_HOOKS_EN > 0uvoid OSTaskIdleHook (void){#if OS_APP_HOOKS_EN > 0uApp_TaskIdleHook();#endif}#endif#if OS_CPU_HOOKS_EN > 0uvoid OSTaskStatHook (void){#if OS_APP_HOOKS_EN > 0uApp_TaskStatHook();#endif}#endifOS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt){OS_STK *stk;(void)opt; /* 'opt' is not used, prevent warning*/stk = ptos; /* Load stack pointer *//* Registers stacked as if auto-saved on exception */*(stk) = (INT32U)0x01000000uL; /* xPSR */*(--stk)= (INT32U)task; /* Entry Point */*(--stk)= (INT32U)0xFFFFFFFEL; /* R14 (LR) (init value will *//* cause fault if ever used) */ *(--stk)= (INT32U)0x12121212uL;/* R12*/*(--stk)= (INT32U)0x03030303uL; /* R3 */*(--stk)= (INT32U)0x02020202uL /* R2 */*(--stk)=(INT32U)0x01010101uL; /* R1 */*(--stk)=(INT32U)p_arg; /* R0 : argument *//* Remaining registers saved on process stack */*(--stk)=(INT32U)0x11111111uL; /* R11 */*(--stk)=(INT32U)0x10101010uL; /* R10 */*(--stk)=(INT32U)0x09090909uL; /* R9 */*(--stk)=(INT32U)0x08080808uL; /* R8 */*(--stk)=(INT32U)0x07070707uL; /* R7 */*(--stk)=(INT32U)0x06060606uL; /* R6 */*(--stk)=(INT32U)0x05050505uL; /* R5 */*(--stk)=(INT32U)0x04040404uL; /* R4 */return (stk);}#if (OS_CPU_HOOKS_EN > 0u) && (OS_TASK_SW_HOOK_EN > 0u)void OSTaskSwHook (void){#if OS_APP_HOOKS_EN > 0uApp_TaskSwHook();#endif}#endif#if OS_CPU_HOOKS_EN > 0uvoid OSTCBInitHook (OS_TCB *ptcb){#if OS_APP_HOOKS_EN > 0uApp_TCBInitHook(ptcb);#else(void)ptcb; /* Prevent compiler warning */#endif}#endif#if (OS_CPU_HOOKS_EN > 0u) && (OS_TIME_TICK_HOOK_EN > 0u)void OSTimeTickHook (void){#if OS_APP_HOOKS_EN > 0uApp_TimeTickHook();#endif#if OS_TMR_EN > 0uOSTmrCtr++;if (OSTmrCtr >= (OS_TICKS_PER_SEC / OS_TMR_CFG_TICKS_PER_SEC)) { OSTmrCtr = 0;OSTmrSignal();}#endif}#endif修改后的Os_cpu_a.asmEXTERN OSRunningEXTERN OSPrioCurEXTERN OSPrioHighRdyEXTERN OSTCBCurEXTERN OSTCBHighRdyEXTERN OSIntExitEXTERN OSTaskSwHookEXPORT OS_CPU_SR_SaveEXPORT OS_CPU_SR_RestoreEXPORT OSStartHighRdyEXPORT OSCtxSwEXPORT OSIntCtxSwEXPORT OSPendSVNVIC_INT_CTRL EQU 0xE000ED04; Interrupt control state register.NVIC_SYSPRI14 EQU 0xE000ED22 System priority register (priority 14).NVIC_PENDSV_PRI EQU 0xFF; PendSV priority value (lowest).NVIC_PENDSVSET EQU 0x10000000; Value to trigger PendSV exception.PRESERVE8 ;The AAPCS requires that the stack-pointer be 8-byte aligned on entry to a conforming function.AREA UCOSII_ASM, CODE, READONLY THUMBOS_CPU_SR_SaveMRS R0, PRIMASK ; Set prio int mask to mask all (except faults)CPSID IBX LROS_CPU_SR_RestoreMSR PRIMASK, R0BX LROSStartHighRdyLDR R0, =NVIC_SYSPRI14; Set the PendSV exception priorityLDR R1, =NVIC_PENDSV_PRISTRB R1, [R0]MOV R0, #; Set the PSP to 0 for initial context switch callMSR PSP, R0LDR R0, =OSRunning ; OSRunning = TRUEMOV R1, #1STRB R1, [R0]LDR R0, =NVIC_INT_CTRL; Trigger the PendSV exception (causes context switch)LDR R1, =NVIC_PENDSVSETSTR R1, [R0]CPSIE I ; Enable interrupts at processor levelOSStartHangB OSStartHang; Should never get hereOSCtxSwLDR R0, =NVIC_INT_CTRL ; Trigger the PendSV exception (causes context switch)LDR R1, =NVIC_PENDSVSETSTR R1, [R0]BX LROSIntCtxSwLDR R0, =NVIC_INT_CTRL ; Trigger the PendSV exception (causes context switch)LDR R1, =NVIC_PENDSVSETSTR R1, [R0]BX LROSPendSVCPSID I ; Prevent interruption during context switchMRS R0, PSP ; PSP is process stack pointerCBZ R0, OSPendSV_nosave ; Skip register save the first timeSUB R0, R0, #0x20 ; Save remaining regs r4-11 on process stackSTM R0, {R4-R11}LDR R1, =OSTCBCur ; OSTCBCur->OSTCBStkPtr = SP;LDR R1, [R1]STR R0, [R1] ; R0 is SP of process being switched out; At this point, entire context of process has been savedOSPendSV_nosavePUSH {R14} ; Save LR exc_return valueLDR R0, =OSTaskSwHook; OSTaskSwHook();BLX R0POP {R14}LDR R0, =OSPrioCur ; OSPrioCur = OSPrioHighRdy;LDR R1, =OSPrioHighRdyLDRB R2, [R1]STRB R2, [R0]LDR R0, =OSTCBCur ; OSTCBCur = OSTCBHighRdy;LDR R1, =OSTCBHighRdyLDR R2, [R1]STR R2, [R0]LDR R0, [R2] ; R0 is new process SP; SP = OSTCBHighRdy->OSTCBStkPtr; LDM R0, {R4-R11}; Restore r4-11 from new process stackADDS R0, R0, #0x20MSR PSP, R0; Load PSP with new process SPORR LR, LR, #0x04 Ensure exception return uses process stackCPSIE IBX LR ; Exception return will restore remaining context ALIG主函数APP.C#include<includes.h>#include "utils/uartstdio.h"#include "lwip/sys.h"#define TASK1_PRIO 11#define TASK2_PRIO 3#define task1stck 1024#define task2stck 1024#include "systemInit.h"#define LED_PERIPH SYSCTL_PERIPH_GPIOF#define LED_PORT GPIO_PORTF_BASE#define LED_PIN GPIO_PIN_2#define LED_PINN GPIO_PIN_3void LED0_stack(void *p_arg){//jtagWait( );clockInit( );SysCtlPeriEnable(LED_PERIPH);GPIOPinTypeOut(LED_PORT, LED_PIN);for (;;){GPIOPinWrite(LED_PORT, LED_PIN, 0x00);OSTimeDly(OS_TICKS_PER_SEC / 4);GPIOPinWrite(LED_PORT, LED_PIN, 0xFF);OSTimeDly(OS_TICKS_PER_SEC / 4);}}void LED1_stack(void *p_arg){//jtagWait( );clockInit( );SysCtlPeriEnable(LED_PERIPH);GPIOPinTypeOut(LED_PORT, LED_PINN);for (;;){GPIOPinWrite(LED_PORT, LED_PINN, 0x00);OSTimeDly(OS_TICKS_PER_SEC / 4);zGPIOPinWrite(LED_PORT, LED_PINN, 0xFF);OSTimeDly(OS_TICKS_PER_SEC / 4);}}static void App_TaskStart (void *p_arg);int main (void){BSP_PreInit ();BSP_IntDisAll();OSInit();OSTaskCreateExt((void (*)(void *)) App_TaskStart,(void *) 0,(OS_STK *)&App_TaskStartStk[APP_CFG_TASK_START_STK_SIZE - 1], (INT8U ) APP_CFG_TASK_START_PRIO,(INT16U ) APP_CFG_TASK_START_PRIO,(OS_STK *)&App_TaskStartStk[0],(INT32U ) APP_CFG_TASK_START_STK_SIZE,(void *) 0,(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));OSTaskCreate(LED0_stack,(void *)0,&App_TaskStartStk1[ APP_CFG_TASK_START_STK_SIZE -1],0);OSTaskCreate(LED1_stack,(void *)0,&App_TaskStartStk2[ APP_CFG_TASK_START_STK_SIZE -1],1);OSStart(); //4 os start}static void App_TaskStart (void *p_arg){(void)p_arg;BSP_PostInit();Tmr_TickInit ();#if (OS_TASK_STAT_EN > 0)OSStatInit(); #endiffor(;;){OSTimeDlyHMSM(0, 0, 2, 0); UARTprintf("\033[2JI am task1\n");}}。
μcos_II之移植篇
/**Author:Callon Huang*Version:1.0*Time:2014/11/5*blog:/u/2451220761*/希望博客也能帮到你~第一步:μcosII源码下载/downloadcenter/STM32固件库stm32f10x_stdperiph_lib.zip的下载第二步:新建文件夹,并准备子目录:其中Software是μcosII源码下载完成后拷贝过来的,其它的都自己新建.App 用来存放应用程序文件,Bsp 用来存放版级驱动文件,Lib 用来存放 STM32 的标准外设库文件,Source 用来存放uCOS 文件第三步:把Software里的uCOS-II、uC-LIB和uC-CPU文件夹到Source里并把后两者拷贝到uCOS-II文件夹里,最后如下:第四步:找到Software\EvalBoards\ST\STM32F103ZE-SK\IAR下的BSP文件夹,复制到Source文件夹下第五步:找到Software\EvalBoards\ST\STM32F103ZE-SK\IAR下的OS-Probe-LCD文件夹,复制到Source文件夹下并改名为APP第六步:解压下载好的stm32f10x_stdperiph_lib.zip固件库:找到stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Librari es\STM32F10x_StdPeriph_Driver下的inc和src文件夹并复制到Lib 文件夹下第七步:复制stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Librari es\CMSIS下的CM3文件夹到Lib文件夹下第八步:删除一些不需要的文件:APP文件夹只需要:BSP文件夹只需要:在Software\CPU\ST\STM32里也有inc和src文件夹,但是比STM32固件库的要多两个文件stm32f10x_systick.c和stm32f10x_systick.h把这两个文件拷贝到SysTick文件夹下.第九步:建立工程my_ucosII,把所有的.c文件和.asm文件都加进来:‘第十步:对工程进行一些设置:Device就不用说了;Target不变;Output勾选上Create HEX File,并在里选择Obj文件夹;C/C++中添加头文件所在路径,否则会出现大量如下编译错误:头文件路径:Libraries文件夹是这三个最后这部分全部设置好后,如下:最后总体设置完如下:Debug里最后下载程序的时候,如果碰到MDK中出现“Error Flash download failed-Cortex-M3”错误,可以通过上面的添加On-chip-Flash来解决。
μCOSII在基于Cortex-M3核的ARM处理器上的移植.
μCOSII在基于Cortex-M3核的ARM处理器上的移植目前,嵌入式技术已被广泛应用到汽车电子、无线通信、数码产品等各个领域。
嵌入式操作系统及嵌入式处理器技术发展迅猛,嵌入式操作系统典型代表有μCOS—II、μClinux、Winclow CE、VxWorks等;嵌入式处理器包括ARM、MIPS、PowerPC等。
随着软硬件技术的发展,人们开始意识到基于嵌入式操作系统的程序开发模式的便利性及可靠性,并且在程序开发过程中开始倾向于从传统超循环开发模式转向基于嵌入式操作系统的开发模式。
1 软硬件开发环境及处理器介绍1.1 软件硬开发环境本移植过程使用的软件环境是RealView MDK开发套件,此产品是ARM 公司最新推出的针对各种嵌入式处理器的软件开发工具,该开发套件功能强大,包括了μVision3集成开发环境和RealView编译器。
使用的硬件平台是深圳英蓓特公司推出的全功能评估板STMl03V100,其上所采用的处理器是ST意法半导体公司生产的32位哈佛结构ARM处理器STM32F103VBT6,该处理器内置ARM公司最新的Cortex—M3核,并且具有非常丰富的片上资源。
1.2 关于基于Cortex-M3的ARM处理器的介绍基于Cortex—M3核的ARM处理器支持两种模式,分别称为线程模式和处理模式。
程序可以在系统复位时或中断返回时两种情况下进入线程模式,而处理模式只能通过中断或异常的方式来进入。
处于线程模式中代码可以分别运行在特权方式下和非特权方式下。
处于处理模式中的代码总是运行在特权方式下。
运行在特权方式下的代码对系统资源具有完全访问权,而运行在非特权方式下的代码对系统资源的访问权受到一定限制。
处理器可以运行在Thumb状态或Debug状态。
在指令流正常执行期间,处理器处于Thumb状态。
当进行程序调试时,指令流可以暂停执行,这时处理器处于Debug状态。
处理器有两个独立的堆栈指针,分别称为MSP和PSP。
_C_OS_在Cortex_M3处理器上的移植
新器件新技术 NEW PRODUCT&TECH42 Microcontrollers &Embedded Systems 2012年第4期www.mesnet.com.cn μC/OS-III在Cortex-M3处理器上的移植李承创,陈跃斌,房晓丽,王兵(云南民族大学电气信息工程学院,昆明650031)摘要:为了将μC/OS-III移植到Cortex-M3处理器上,选用RealView MDK作为软件开发平台,针对Cortex-M3处理器特性编写了移植所需的C语言和汇编语言源代码,并验证了移植的正确性。
移植后的μC/OS-III能够稳定运行于Cortex-M3处理器上。
该移植对大部分Cortex-M3处理器具有通用性,对其他架构处理器的μC/OS-III移植具有参考作用。
关键词:μC/OS-III;嵌入式操作系统;ARM;Cortex-M3;移植中图分类号:TP316.2 文献标识码:APortingμC/OS-III to Cortex-M3ProcessorLi Chengchuang,Chen Yuebin,Fang Xiaoli,Wang bing(School of Electrical and Information Technology,Yunnan University of Nationalities,Kunming 650031,China)Abstract:In order to portμC/OS-III to Cortex-M3processor,it uses RealView MDK as the software development platform.With Cor-tex-M3processor s features,it writes the required C and assembly source code for porting,and verifies the correctness of the porting.After porting,μC/OS-III can run on Cortex-M3processor stably.The porting is universal for most Cortex-M3processor,which is a ref-erence forμC/OS-III porting on processers of other architectures.Key words:μC/OS-III;embedded operating system;ARM;Cortex-M3;porting引 言μC/OS-III是一款基于优先级调度的抢占式实时内核,Micrium公司于2011年8月公开了μC/OS-III的源码,其源码遵循ANSI C标准,因而具有良好的移植性,相信其将会被移植到越来越多的处理器体系上。
μCOS-II嵌入式操作系统移植和实时性测量
μC/OS-II嵌入式操作系统移植和实时性测量一、实验目的●通过向Sitsang实验板移植μC/OS-II操作系统,学习它的结构和移植方法,体会操作系统移植与目标机体系结构和编译器的关系;●学习操作系统中的中断概念,分析μC/OS-II的中断处理过程,通过分析和测量μC/OS-II的中断处理时间,理解操作系统的实时性;●学习ARM指令集和汇编语言程序设计,理解ARM处理器的异常处理模式;●学习使用AXD和ARMulator仿真、调试系统程序;●培养查阅硬件手册、调试底层软件的能力。
二、实验内容I.μC/OS-II嵌入式操作系统移植1.μC/OS-II正常运行,需要处理器满足以下条件:●处理器的C编译器能产生可重入代码;●用C语言就可以打开和关闭中断;●处理器支持中断,并且能产生定时中断(通常在10至100Hz之间);●处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈;●处理器有将堆栈指针和其他CPU寄存器读出和存储到堆栈或内存中的指令。
Sitsang和ADS1.2开发环境均满足上面的要求,因此μC/OS-II可以正常运行。
2.需要修改的与处理器相关的三个文件说明:我们选择移植较新的uC/OS-II v2.80版,但移植步骤与v2.52版无别。
●OS_CPU.H在该头文件中定义了操作系统需要的数据类型和在内存中占用的位数、堆栈的增长方向以及开关中断的方法。
针对ARM编译器说明,定义了如下的数据类型和位数描述:typedef unsigned char BOOLEAN;typedef unsigned char INT8U;typedef signed char INT8S;typedef unsigned short INT16U;typedef signed short INT16S;typedef unsigned int INT32U;typedef signed int INT32S;typedef float FP32;typedef double FP64;对于ARM处理器,每一个堆栈的表项都是32位,因此需要将OS_STK定义如下:typedef unsigned int OS_STK;且堆栈的增长方向是高地址向低地址增长,因此定义#define OS_STK_GROWTH 1而ARM处理器上的状态寄存器(CPSR和SPSR)也都是32位,因此typedef unsigned int OS_CPU_SR;我们选择OS_CRITICAL_METHOD #3作为进出临界区的实现方法,即进入时保存CPSR、退出时恢复CPSR。
μCOS-II在Cortex-M3系列单片机上的移植
描述嵌入式操作系统μC/OSII在LM3S系列单片机上实现移植的过程。
介绍操作系统的移植原理和方法,以LM3S8962单片机为例给出部分移植函数的代码,并通过一个实例的应用验证移植的正确性。
引言μC/OSII是一种简单高效、源代码公开的实时嵌入式操作系统,具有良好的扩展性和可移植性,被广泛应用到各种嵌入式处理器上;对于提高产品的质量,减少开发周期和降低成本有着重要的意义。
本文以μC/OSII为移植对象,以ARM CortexM3内核微处理器为移植目标来讨论其移植过程及应用。
1 μC/OSII及ARM CortexM3简介实时操作系统μC/OSII是一个基于优先级的抢占式实时内核,程序可读性强,移植性好,代码固定,可裁剪,非常灵活。
至今,从8位到64位,μC/OSII 已在超过40种不同架构的微处理器上运行。
μC/OSII的主要特点有:是优先级可剥夺的实时多任务操作系统;可处理和调度56个用户任务,任务的优先级可以动态调整;提供任务间通信、同步使用的信号量、邮箱和消息队列;具有良好的可裁剪性,可尽量减小系统的ROM和RAM大小。
ARM是目前嵌入式领域应用最广泛的RISC微处理器结构,它以低成本、低功耗、高性能等优点占据了嵌入式系统应用领域的领先地位。
当前ARM系列的处理器有ARM7、ARM9、ARM9E、ARM10、ARM11等多个产品。
CortexM3内核是 ARM公司于2006年推出的一款高性能处理器内核,是ARM新型 V7指令集结构系列的微控制器版本,可用于企业应用、汽车系统、家庭网络和无线技术等领域。
其主要特点是:① 功耗低;② 内核的门数少,具有优异的性价比;③ 中断延时短;④ 调试成本低;⑤ 具有嵌套向量中断控制器(NVIC),与处理器内核紧密结合实现低延迟的中断处理;⑥ 具有可裁减的存储器保护单元(MPU),用于对存储器进行保护。
2 移植μC/OSIILuminary Micro公司的LM3S系列微控制器包含运行在 50 MHz频率下的ARM CortexM3MCU内核、嵌入式Flash和SRAM、1个低压降的稳压器、集成的掉电复位和上电复位功能、模拟比较器、10位ADC、SSI、GPIO、看门狗和通用定时器、UART、I2C、运动控制PWM以及正交编码器(quadratureencoder)输入,非常适合楼宇和家庭自动化、工厂自动化和控制、工控电源设备、步进电机、有刷和无刷DC马达、AC感应电动机等方面的应用。
基于Cortex-M3核的μCOS-II移植与应用
基于Cortex-M3核的μCOS-II移植与应用作者:潘丽蕊,袁保社来源:《电脑知识与技术》2010年第18期摘要:在研究了μCOS-II实时操作系统体系结构、运行环境及运行机制基础上,针对Cortex-M3内核的移植需求, 对μCOS-II实时操作系统在Cortex-M3核上的移植进行了实践。
同时分析了μCOS-II在Cortex-M3上的移植条件,编写及修改了移植环境的定制与配置,实现了μCOS-II 在Cortex-M3上的移植,最后给出了一个基于μCOS-II嵌入式实时操作系统的简单应用。
关键词:实时操作系统;μCOS-II;Cortex-M3;移植中图分类号:TP311文献标识码:A文章编号:1009-3044(2010)18-5111-04In the Cortex-M3 of the μCOS-II Transplantation and ApplicationPAN Li-rui, YUAN Bao-she(College of Information Science & Engineering, Xinjiang University, Urumqi 830046, China)Abstract:Based on the study of μCOS-II real time operating system structure、operating environment and operational mechanism,it against the demand for transplant Cortex-M3 kernel, real time operating system in the Cortex-M3 of the μCOS-II transplantation on the practice.It also analyzed the conditions of μCOS-II in the Cortex-M3 of the transplant, edited and modified the customization and configuration of the transplant environment,and achie ved the μCOS-II in the Cortex-M3 of the transplant. Finally, an embedded real time operating system based on μCOS-II simple application was given.Key words: real time operating system; μCOS-II;Cortex-M3; transplantation1 概述基于嵌入式操作系统平台的掌上设备将是未来各种信息设备的主力军。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于M3的μC/OS移植目前,嵌入式技术已被广泛应用到汽车电子、无线通信、数码产品等各个领域。
嵌入式操作系统及嵌入式处理器技术发展迅猛,嵌入式操作系统典型代表有μCOS—II、μClinux、Winclow CE、VxWorks等;嵌入式处理器包括ARM、MIPS、PowerPC等。
随着软硬件技术的发展,人们开始意识到基于嵌入式操作系统的程序开发模式的便利性及可靠性,并且在程序开发过程中开始倾向于从传统超循环开发模式转向基于嵌入式操作系统的开发模式。
1 软硬件开发环境及处理器介绍1.1 软件硬开发环境本移植过程使用的软件环境是RealView MDK开发套件,此产品是ARM公司最新推出的针对各种嵌入式处理器的软件开发工具,该开发套件功能强大,包括了μVision3集成开发环境和RealView编译器。
使用的硬件平台是深圳英蓓特公司推出的全功能评估板STMl03V100,其上所采用的处理器是ST意法半导体公司生产的32位哈佛结构ARM处理器STM32F103VBT6,该处理器内置ARM公司最新的Cortex—M3核,并且具有非常丰富的片上资源。
1.2 关于基于Cortex-M3的ARM处理器的介绍基于Cortex—M3核的ARM处理器支持两种模式,分别称为线程模式和处理模式。
程序可以在系统复位时或中断返回时两种情况下进入线程模式,而处理模式只能通过中断或异常的方式来进入。
处于线程模式中代码可以分别运行在特权方式下和非特权方式下。
处于处理模式中的代码总是运行在特权方式下。
运行在特权方式下的代码对系统资源具有完全访问权,而运行在非特权方式下的代码对系统资源的访问权受到一定限制。
处理器可以运行在Thumb状态或Debug状态。
在指令流正常执行期间,处理器处于Thumb状态。
当进行程序调试时,指令流可以暂停执行,这时处理器处于Debug状态。
处理器有两个独立的堆栈指针,分别称为MSP和PSP。
系统复位时总是处于线程模式的特权方式下,并且默认使用的堆栈指针是MSP。
本移植过程中假设任务总是运行在线程模式的特权方式下且总是使用堆栈指针PSP。
2 移植过程详解2.1 μCOS-II内核介绍μCOS—II是一个实时可剥夺型操作系统内核,该操作系统支持最多64个任务,但每个任务的优先级必须互不相同,优先级号小的任务比优先级号大的任务具有更高的优先级,并且该操作系统总是调度优先级最高的就绪态任务运行。
此内核的代码是美国人Jean J.Labrosse用C语言编写的,具有很好的可移植性,其2.52版本通过了美国航天航空管理局的安全认证,可靠性非常高。
文中所述的移植过程使用的就是该版本的源代码。
2.2 开始移植μCOS—II v2.52的源代码按照移植要求分为需要修改部分和不需要修改部分。
其中需要修改源代码的文件包括头文件OS_CPU.H、C语言文件OS_CPU.C以及汇编格式文件OS_CPU_A.ASM。
2.2.1 修改头文件OS_CPU.H头文件OS_CPU.H中需要修改的内容有与编译器相关的数据类型重定义部分和与处理器相关的少量代码。
由于本移植过程中使用的是RealView编译器,因此通过查阅此编译器的相关说明文档可以得到其所支持的基本数据类型,据此修改OS_CPU.H中与编译器相关的数据类型重定义部分。
修改后代码如下所示:其中定义的数据类型OS_STK指出了处理器堆栈中的数据是32位的,OS_CPU_SR指出了处理器状态寄存器字长也为32位。
头文件中与处理器相关部分代码包括临界区访问处理、处理器堆栈增长方向及任务切换宏定义。
临界区代码访问涉及到全局中断开关指令,由文献可以得知关中断和开中断可以分别由指令CPSID i和CPSIE i实现,文中临界段访问处理如下:其中INT_DIS()和INT_EN()分别对应关中断和开中断处理过程。
根据文献可知文中所使用的处理器支持的堆栈为满递减方式,即堆栈的增长方向是从内存高地址向低地址方向递减并且堆栈指针总是指向栈顶的数据。
在头文件OS_CPU.H 中相应代码只须修改一条,如下所示#define OS_STK_GROWTH1此定义中的1代表堆栈方向是向下递减的。
头文件OS_CPU.H中最后一个要修改的地方是任务切换宏定义,μCOS—II内核就是通过这个宏调用来触发任务级的任务切换。
任务切换一般是通过陷阱或软件中断来实现的,在基于Cortex—M3核的处理器中支持一条称为超级用户调用的指令SVC,此指令是ARM软件中断指令SWI的升级版。
此处的宏定义代码修改为如下形式#define OS_TASK_SW()OS_SVC()其中OS_SVC()之中包含了SVC指令,它可以由嵌入汇编的方式在C语言代码中进行定义,如下所示_asm void OS_SVC(void){SVCOx00}以上代码以嵌入汇编的方式定义了一个输入参数和返回值都为空的C语言函数,嵌入汇编的格式在RealView编译器的说明文档中有详细的说明。
2.2.2 修改C语言文件OS_CPU.C根据文献可知文件OS_CPU.C中有10个C语言函数需要编写,这些函数中唯一必要的函数是OSTaskStkInit,其他9个函数必须声明,但不一定要包含任何代码。
为了简洁起见,本移植过程只编写了OSTaskStkInit,此函数的作用是把任务堆栈初始化成好像刚发生过中断一样。
要初始化堆栈首先必须了解微处理器在中断发生前后的堆栈结构,根据文献易知微处理器在中断发生前后的堆栈结构,并且可知寄存器xPSR、PC、LR、R12、R3、R2、R1、RO是中断时由硬件自动保存的。
初始化时需要注意的地方是xPSR、PC和LR的初值,对于其他寄存器的初值没有特别的要求。
xPSR比特位是Thumb状态位,初始化时须置1,否则执行代码时会引起一个称为Invstate的异常,这是因为内置Cortex—M3核的微处理器只支持Thumb和Thumb2指令集。
堆栈中PC和LR须初始化为任务的入口地址值,这样才能在任务切换时跳转到正确的地方开始执行。
此函数可以用以下代码来实现2.2.3 修改汇编语言文件OS_CPU_A.ASM汇编文件OS_CPU_A.ASM中需要编写的函数分别为OSStartHighRdy、OSCtxSw、OSIntCtxSw和OSTickISR。
第一个函数的作用是启动多任务调度,此函数只在操作系统开始调度任务前执行一次,以后不再调用。
按照文献中所述须将堆栈中的寄存器依次弹出,然后执行一条中断返回指令来开始第一个用户任务的调度。
但基于Cortex—M3核的ARM处理器在执行中断返回指令时必须处于处理模式下,否则将会引起内存访问异常。
当系统上电启动时或程序重置后,处理器会进入线程模式,而要在函数OSStartHighRdy中执行中断返回指令就首先需要进行模式转换,进入处理模式,而进行同步可控制模式转换的途径是超级用户调用,即通过SVC指令产生软件中断可转换到处理模式。
实际上考虑到此函数只在启动多任务调度开始前被调用一次,并且第一次调度任务运行时任务堆栈中除了xPSR、PC和LR的初值以外,其他寄存器的初值无关紧要。
因此可以简化该函数的编写,只须从第一个任务的堆栈中取出该任务的首地址,然后修改堆栈指针使其指向任务堆栈中内存地址最高处,即相当于抛弃任务堆栈中所有数据,最后根据取出的地址直接跳转到任务入口地址处开始执行。
这样可以免去软件中断和模式切换,从而简化了对此函数的编写。
需要说明的是在抛弃任务堆栈中所用数据的同时也将xPSR的初值抛弃了,但这并不影响第一个任务投人运行,因为在跳转到第一个任务运行之前,指令流是在Thumb状态下正常执行的,xPSR已经有了确定的值。
此函数代码如下所示BX r0;直接跳转到第一个任务的入口地址第二个汇编语言函数OSCtxSw是任务级的任务切换函数。
若在任务执行过程中有一个比当前任务优先级更高的任务进入就绪态,μCOS—II内核就会启动OSCtxSw进行任务切换。
该函数会保存当前任务状态,然后恢复那个优先级更高的任务状态,使之投入运行。
前述的宏定义#defineOS_TASK_SW()OS_SVC()中的OS_SVC()包含了SVC软件中断指令,此中断的中断向量应该设为函数OSCtxSw的入口地址,即OSCtxSw是SVC指令产生中断的中断服务程序,其源代码如下由于微处理器在进入中断时按堆栈增长方向自动顺序保存了如下8个寄存器:xPSR、PC、LR、R12、R3、R2、R1、R0,因此在程序中只须保存另外8个寄存器,保存顺序可以随意,但注意弹栈时要按照先进后出的方式进行。
按照本文开头的假定,任务总是运行在线程模式的特权方式下且总是使用堆栈指针PSP。
而中断产生后,中断服务程序将处于处理模式下,并且默认使用的堆栈指针是MSP。
因此在保存堆栈指针的时候需要保存的是当前任务的PSP。
中断返回前新任务的堆栈指针需要恢复到PSP中。
中断返回使用如下指令MOVrO,#OxfffffffdBXr0其中立即数#0xfffffffd包含了返回信息,用这两条指令可以使中断返回时使用任务堆栈指针PSP,返回后任务处于线程模式且使用任务堆栈指针PSP。
第三个汇编语言函数OSIntCtxSw与OSCtxSw类似。
若任务执行过程中产生了中断,且中断服务程序使得一个比当前被中断的任务具有更高优先级的任务就绪时,μCOS —II内核就会在中断返回之前调用函数OSIntCtxSw。
在此函数中不需要像任务级任务切换函数那样保存当前任务状态,因为当前任务已经被中断,在进入中断服务程序的时候任务状态已被保存。
其源代码与函数OSctxSw中保存当前任务堆栈PSP指令以后部分相同,此处不再列出。
第4个汇编语言函数OSTickISR是系统时钟节拍的中断服务函数。
处理器STM32F103VBT6中有一个专用系统时钟节拍定时器SysTick,本移植过程使用此定时器产生每100 ms一次的时钟节拍中断。
此函数源代码如下3 程序开发模式讨论传统应用程序开发模式称为超循环模式,即通常主程序是由C语言中的for语句或while 语句构成的一个无限循环,程序在此循环中检测事件的发生,从而转向不同的任务。
这种程序开发模式有两个主要的不足之处。
首先从程序维护和可靠性的角度来看,所有任务都需要程序开发人员来进行全局性的维护,当系统变得庞大和复杂时,任务的维护会变得非常麻烦,同时程序的可靠性也受到影响。
其次,从任务级响应时间来看,这个时间是不确定的,因为程序在循环体中检测事件发生的位置是固定的,但事件的发生是随机的,因此从事件发生到程序检测到事件发生这段时间也是不确定的。
在基于嵌入式操作系统的应用程序开发过程中,应用程序开发人员只需关心各个任务本身,而任务调度由操作系统代劳。