μCOS-II在Cortex-M3系列单片机上的移植

合集下载

μCOS-II在ARMCortex-M3处理器上的移植.

μCOS-II在ARMCortex-M3处理器上的移植.

μCOS-II在ARM Cortex-M3处理器上的移植摘要:实现了一种全集成可变带宽中频宽带低通滤波器,讨论分析了跨导放大器-电容(OTA—C)连续时间型滤波器的结构、设计和具体实现,使用外部可编程电路对所设计滤波器带宽进行控制,并利用ADS软件进行电路设计和仿真验证。

仿真结果表明,该滤波器带宽的可调范围为1~26 MHz,阻带抑制率大于35 dB,带内波纹小于0.5 dB,采用1.8 V电源,TSMC 0.18μm CMOS工艺库仿真,功耗小于21 mW,频响曲线接近理想状态。

关键词:Butte摘要:Cortex-M3是ARM公司最新推出的基于ARMv7-M架构的低功耗处理器。

在深入了解μCOS-II工作原理和Cortex-M3特性的基础上,给出了在STWl32F103ZE处理器上的详细移植过程。

将移植后的μC/OS-Ⅱ操作系统应用于移动多媒体直放站CMMB项目中,验证了移植的成功。

这对于管理硬件资源,缩短开发周期和提高系统稳定性方面有着重要的意义。

关键词:Cortex-M3;μCOS-Ⅱ;移植;嵌入式系统0 引言嵌入式系统已经广泛渗透到了人们工作、生活中的各个领域,嵌入式处理器已占分散处理器市场份额的94%,其中ARM的应用最为广泛。

基于ARM内核的处理器以其诸多优异性能而成为各类产品中选用较多的处理器之一。

当系统越来越大,应用越来越多时,就出现了如何管理众多的硬件资源,以及如何满足系统的实时控制要求和如何提高系统软件开发效率等不可回避的问题。

这时,使用嵌入式操作系统很有必要。

操作系统的主要作用有:统一管理系统资源;为用户提供访问硬件的接口;调度多个应用程序和管理文件系统等。

1 概述μC/OS-II是著名的、源码公开的实时内核,是专为嵌入式应用设计的,可用于各类8位、16位和32位处理器。

μC/OS-II已经在世界范围内得到广泛使用,包括诸多领域,如手机、飞行器、医疗设备及工业控制等。

实际上,μC/OS-II已经通过了非常严格的测试,并且得到了美国航空管理局的认证,可以用在飞行器上。

单片机上的移植

单片机上的移植

单片机:μC/OS-II在Cortex-M3系列单片机上的移植μ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 CortexM3 MCU内核、嵌入式Flash和SRAM、1个低压降的稳压器、集成的掉电复位和上电复位功能、模拟比较器、10位ADC、SSI、GPIO、看门狗和通用定时器、UART、I2C、运动控制PWM以及正交编码器(quadrature encoder)输入,非常适合楼宇和家庭自动化、工厂自动化和控制、工控电源设备、步进电机、有刷和无刷DC马达、AC感应电动机等方面的应用。

Cortex-M3移植ucos总结

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对于移植需要特别注意的是第一个过程:入栈。

μC/OS—Ⅱ在Cortex—M3系列单片机上的移植

μ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
器 结构 , 以低 成 本 、 功 耗 、 性 能 等 优 点 占据 了嵌 入 式 它 低 高


” 一 ’
关键词
⑤ 具 有 嵌 套 向量 中 断 控 制 器 ( 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处理器上的移植

μ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上的移植方法和步骤

uCOSII在cortexM3上的移植方法和步骤
8 / 12
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
ห้องสมุดไป่ตู้

Cortex-M3的μCoS-Ⅱ任务调度硬件指令实现

Cortex-M3的μCoS-Ⅱ任务调度硬件指令实现
屈召贵;周永强;龚名茂
【期刊名称】《单片机与嵌入式系统应用》
【年(卷),期】2011(11)2
【摘要】@@ 1 μC/OS-Ⅱ的任务调度算法分析rn1.1 μC/OS-Ⅱ任务就绪表的解读rn μC/OS操作系统采用优先级至上的任务调度原则,让进入就绪态任务中优先级最高的那个任务,一进入就绪态就能立即运行.μC/OS操作系统实现了一种巧妙的查表算法,利用这种算法能快速实现任务调度原则.如何从任务就绪表中,查找优先级最高的那个任务?归结起来:两个变量(OSRdyGrp、OSRdyTbl[])和两张表(OSMapTbl []、OSUnMaTbl[]).
【总页数】2页(P70-71)
【作者】屈召贵;周永强;龚名茂
【作者单位】四川师范大学成都学院,成都611745;四川师范大学成都学院,成都611745;四川师范大学成都学院,成都611745
【正文语种】中文
【相关文献】
1.浅谈μC/OS任务调度算法的硬件实现 [J], 邵贝贝
2.WCET可预测的Java指令集硬件实现 [J], 杨帆;高振华;柴志雷
3.实时操作系统任务调度算法的硬件实现 [J], 李岩;王显山
4.基于硬件的动态指令集随机化框架的设计与实现 [J], 杜三;舒辉;康绯
5.基于硬件的动态指令集随机化框架的设计与实现 [J], 杜三;舒辉;康绯;
因版权原因,仅展示原文概要,查看原文内容请购买。

μCOS-II移植


图标按钮(或者选择 (6)单击 )单击Context Variable图标按钮 或者选择 图标按钮 【Processor Views】->【Variables】)打开变量观 】 【 】 打开变量观 察窗口, 察窗口,通过此窗口可以观察局部变量和全局变 量。 取消断点, (7)可以单步运行程序,可以设置 取消断点, )可以单步运行程序,可以设置/取消断点 或者全速运行程序,停止程序运行, 或者全速运行程序,停止程序运行,观察变量的 判断蜂鸣器及LED1~LED4的控制是否正 值,判断蜂鸣器及 ~ 的控制是否正 确。
步骤 仿真器和MagicARM2410 (1)连接 )连接EasyJTAG-H仿真器和 仿真器和 实验箱,然后安装EasyJTAG-H仿真器 若已经安 实验箱,然后安装 仿真器(若已经安 仿真器 装过,此步省略),短接蜂鸣器跳线JP9。 装过,此步省略 ,短接蜂鸣器跳线 。 (2)启动 )启动ADS 1.2,打开实验工程文件 , Demo_uCOSII。(本范例在ADS文件夹中操作 Demo_uCOSII。(本范例在ADS文件夹中操作) 。(本范例在 文件夹中操作) (3)Make ug (4)Debug (5)全速运行程序,程序将会在 )全速运行程序,程序将会在main.c的主函 的主函 数中停止(因为 因为main函数起始处默认设置有断点。 函数起始处默认设置有断点。 数中停止 因为 函数起始处默认设置有断点

/************************************ ** Function name: DelayNS *************************************/ void DelayNS(uint32 dly) { uint32 i; for(; dly>0; dly--) for(i=0; i<50000; i++); }

μC/OS—Ⅲ在Cortex—M3处理器上的移植

O S a t ihRdy St r H g LDR R 0, NV I SYSPRI 一 C 1 4
_
2 2 3 编 写 O ~ p C .c .. Sc u
OS

c u C C文 件 包 含 了 OS s S k nt ) p —. Ta k t I i 函数 和若 干 (
钩 子 函数 。OS s S k nt ) Ta k t l i 函数 的 作 用 是 在 创 建 任 务 时 ( 初 始 化 任 务 栈 , 返 回 新 的 栈 顶 位 置 。 C OS—II 于 并 / I基 C re o tx—M3的 任 务 栈 结 构 如 图 1所 示 。 其 中 P R、 C、 S P L R1 R R、 、 0五 个 寄 存 器 应 赋 予 正 确 的 初 值 , 其 他 1 而 1个 寄 存 器 的 初 值 无关 重 要 。
_薯t
。 囊 囊
a / c os—II C re I 在 o tx—M3处 理 器 上 的 移 植
李承创 。 陈跃 斌 , 晓丽 , 兵 房 王
( 南 民族 大学 电 气 信 息工 程 学 院 , 明 6 0 3 ) 云 昆 5 0 1
摘 要 :为 了将 u / S—I 移 植 到 C re CO I I otx—M3处 理 器上 , 用 R aViw MDK作 为软件 开发 平 台 , 对 C re —M3处 理 器 选 el e 针 otx 特 性 编 写 了移植 所 需的 C语 言和 汇 编语 言 源代码 , 验 证 了移 植 的 正确 性 。移植 后 的 u / s—II 够稳 定 运行 于 C r x 并 co I能 ot e
控 制 器 作 为 硬 件 实 验 平 台 , 编 译 环 境 采 用 Re l e 而 aViw

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 ̄ -
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

μC/OS-II在Cortex-M3系列单片机上的移植描述嵌入式操作系统μC/OSII在LM3S系列单片机上实现移植的过程。

介绍操作系统的移植原理和方法,以LM3S8962单片机为例给出部分移植函数的代码,并通过一个实例的应用验证移植的正确性。

0.引言μC/OS-II是一种简单高效、源代码公开的实时嵌入式操作系统,具有良好的扩展性和可移植性,被广泛应用到各种嵌入式处理器上;对于提高产品的质量,减少开发周期和降低成本有着重要的意义。

本文以μC/OS-II为移植对象,以ARM Cortex-M3内核微处理器为移植目标来讨论其移植过程及应用。

1. μC/OS-II及ARM Cortex-M3简介实时操作系统μC/OS-II是一个基于优先级的抢占式实时内核,程序可读性强,移植性好,代码固定,可裁剪,非常灵活。

至今,从8位到64位,μC/OS-II已在超过40种不同架构的微处理器上运行。

μC/OS-II 的主要特点有:是优先级可剥夺的实时多任务操作系统;可处理和调度56个用户任务,任务的优先级可以动态调整;提供任务间通信、同步使用的信号量、邮箱和消息队列;具有良好的可裁剪性,可尽量减小系统的ROM和RAM大小。

ARM是目前嵌入式领域应用最广泛的RISC微处理器结构,它以低成本、低功耗、高性能等优点占据了嵌入式系统应用领域的领先地位。

当前ARM系列的处理器有ARM7、ARM9、ARM9E、ARM10、ARM11等多个产品。

Cortex-M3内核是ARM公司于2006年推出的一款高性能处理器内核,是ARM新型V7版本,可用于企业应用、汽车系统、家庭网络和无线技术等领域。

其主要特点是:①功耗低;②内核的门数少,具有优异的性价比;③中断延时短;④调试成本低;⑤具有嵌套向量中断控制器(NVIC),与处理器内核紧密结合实现低延迟的中断处理;⑥具有可裁减的存储器保护单元(MPU),用于对存储器进行保护。

2. 移植μC/OS-IILuminary Micro公司的LM3S系列微控制器包含运行在50 MHz频率下的ARM Cortex-M3 MCU内核、嵌入式Flash和SRAM、1个低压降的稳压器、集成的掉电复位和上电复位功能、模拟比较器、10位ADC、SSI、GPIO、看门狗和通用定时器、UART、I2C、运动控制PWM以及正交编码器(quadrature encoder)输入,非常适合楼宇和家庭自动化、工厂自动化和控制、工控电源设备、步进电机、有刷和无刷DC马达、AC感应电动机等方面的应用。

本移植在如下环境中完成:编译工具采用IAR FOR ARM,目标板采用周立功公司的LM3S8962微控制器EasyARM8962开发板。

主机通过LMLINK JTAG连接目标板以建立交叉开发调试环境。

移植过程中,μC/OSII的核心源代码不用修改,可以直接放在μC/OSIISource文件夹中。

μC/OSII\\Ports目录存放μC/OSII基于LM3S单片机的移植代码,包括OS_CPU_C.C、OS_CPU_A.ASM、OS_CPU.H三个必要的文件。

Target目录中的Startup.S文件是单片机的启动代码和中断向量表,Target.C和Target.H提供单片机初始化函数TargetInit(…)和其他简单的外设控制API函数。

层次结构如图1所示。

将μC/OSII移植到ARM处理器上需要修改3个与ARM体系结构相关的文件:OS_CPU.H、OS_CPU_A.ASM、OS_CPU_C.C。

下面分别介绍这3个文件的移植工作。

(1)OS_CPU.H文件包含μC/OSII所需要的常量、宏和自定义类型等。

①OS_CPU.H定义的数据类型。

在这次移植中μC/OSII重新定义了数据类型,如下所示: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;typedef unsigned int OS_STK;typedef unsigned int OS_CPU_SR;②修改与ARM处理器相关的内容。

不同处理器的堆栈增长方向是不一样的,ARM Cortex-M3的堆栈是从高地址往低地址增长的,OS_STK_GROWTH设为1,程序如下:#define OS_STK_GROWTH 1(2)OS_CPU_C.C文件在OS_CPU_C.C定义的C函数中,OSTaskStkInit()函数与CPU相关,所以移植代码需要修改该函数。

其程序如下(初始化任务时调用此函数初始化任务使用的堆栈):OS_STK * OSTaskStkInit(void (*task)(void *p_arg),void *p_arg,OS_STK*ptos,INT16U opt){OS_STK *stk;(void)opt; //防止编译警告stk=ptos; //装载栈顶指针,即堆栈数组最后的地址模拟中断发生的堆栈情况*(stk)=(INT32U)0x01000000L; //xPSR*(stk) =(INT32U)task; //PC,任务入口*(stk) =(INT32U)0xFFFFFFFEL; //R14(LR)*(stk) =(INT32U)0x12121212L; //R12*(stk) =(INT32U)0x03030303L; //R3*(stk) =(INT32U)0x02020202L; //R2*(stk) =(INT32U)0x01010101L; //R1*(stk) =(INT32U)p_arg; //R0,输入参数p_arg模拟任务进程,保存其他寄存器到堆栈*(stk) =(INT32U)0x11111111L; //R11*(stk) =(INT32U)0x10101010L; //R10*(stk) =(INT32U)0x09090909L; //R9*(stk) =(INT32U)0x08080808L; //R8*(stk) =(INT32U)0x07070707L; //R7*(stk) =(INT32U)0x06060606L; //R6*(stk) =(INT32U)0x05050505L; //R5*(stk) =(INT32U)0x04040404L; //R4return(stk);}(3)OS_CPU_A.ASM文件μC/OSII的移植需要编写5个简单的汇编语言函数。

①OS_ENTER _CRITICAL( ):关闭中断源。

②OS_EXIT_CRITICAL( ):重开中断源。

③OSStartHighRdy( ):运行当前优先级最高的任务。

④OSCtxSw( ):一个任务放弃CPU使用权时调用。

⑤OSIntCtxSw():在退出中断服务函数OSIntExit( )中被调用,实现中断级任务切换。

因为LM3S单片机目前只支持8位中断优先级中的高3位,所以这里把1左移5位即是00100000B,其宏定义为OS_CRITICAL_INT_PRIOEQU(1<<5)。

ARM CortexM3使用OSPendSV( )函数快捷地进行上下文切换。

OSPendSV( )的C语言表述程序如下:OSPendSV:关中断;if(PSP !=NULL) {保存R4~R11到任务堆栈SP_process;OSTCBCur>OSTCBStkPtr = SP_process;}OSTaskSwHook( );SPrioCur = OSPrioHighRdy;STCBCur = OSTCBHighRdy;PSP = OSTCBHighRdy>OSTCBStkPtr;从新任务堆栈中恢复R4~R11;恢复中断;异常返回;完成上述工作后,只要再根据目标板的实际情况编写Target目录中的3个文件,μC/OSII就可以运行在LM3S8962单片机上了。

3. 实际应用移植工作完成后,编写了一段程序,可以进行CAN通信,按键控制LED灯,通过RS232串口与主机相连实现对SD卡的读写等操作。

下面是程序的部分代码:staticOS_STKTask_CardStk[TASK_CARD_STK_SIZE]; /*卡操作任务堆栈*/staticOS_STKGstkStart[TASK_START_STK_SIZE];/*启动任务的堆栈*/static OS_STKGstkLed[TASK_LED_STK_SIZE];/*LED任务的堆栈*/static OS_STKGstkKey[TASK_KEY_STK_SIZE];/*按键任务的堆栈*/static OS_STKGstkCan[TASK_CAN_STK_SIZE];/*CAN通信任务的堆栈*/OS_EVENT *Uart0ReviceMbox;/*串口接收数据邮箱*/OS_EVENT *DispSem;/*按键信号量*/OS_EVENT *DispSem1;/*CAN接收信号量*/在Main.H中定义任务优先级为:#defineTASK_START_PRIO0#defineTASK_CARD_PRIO1#defineTASK_LED_PRIO2#defineTASK_KEY_PRIO3#defineTASK_CAN_PRIO4其中创建任务的任务代码为:static void taskStart (void*parg){(void)parg;DispSem = OSSemCreate(1);DispSem1 = OSSemCreate(0);targetInit();/*初始化目标单片机*/#if OS_TASK_STAT_EN > 0OSStatInit();/*使能统计功能*/#endif/*在这里创建其他任务*/OSTaskCreate (taskLed, (void *)0,&GstkLed[TASK_LED_STK_SIZE 1],TASK_LED_PRIO);/*初始化taskLed任务*/OSTaskCreate ( Task_Card,/*创建SD卡操作任务*/(void *)0,&Task_CardStk[TASK_CARD_STK_SIZE 1],TASK_CARD_PRIO );OSTaskCreate (taskKey, (void *)0,/*创建按键操作任务*/&GstkKey[TASK_KEY_STK_SIZE 1],TASK_KEY_PRIO);OSTaskCreate (taskCan, (void *)0,/*创建CAN操作任务*/&GstkCan[TASK_CAN_STK_SIZE 1],TASK_CAN_PRIO);while (1) {OSTaskSuspend(OS_PRIO_SELF);/*启动任务可在这里挂起*/}}SDExample为方便观察SD卡操作任务编写的GUI界面,选好与程序对应的串口波特率,连接好硬件。

相关文档
最新文档