ucos操作系统在ARM上的移植

合集下载

实操性最强:uCOS-II移植到STM32上的详细步骤;

实操性最强:uCOS-II移植到STM32上的详细步骤;

前言:说点废话,网上有很多关于uCOS-ii移植的文章,好多都是千篇一律,理论性很强,分析了一大堆虚头巴脑的东西,真想问他们,你确定你分析的这些东西是需要你做的工作吗?实操性严重欠缺。

这方面我也走了很多弯路,下面就将自己的移植过程一步步的记录下来,也给大家做做参考。

首先,简单总结一下移植的大概过程:(1)去uC/OS-ii官网下载你要移植芯片CPU的相关案例,不一定完全对应,那就找相应系列吧。

(2)编程环境一般有两种,分别是IAR和MDK,这个根据你自己的编程环境进行下载。

(3)本案例需要将uC/OS-II 移植到STM32F103ZET6上,而我使用的编程环境是MDK,很遗憾,官网上提供的案例是基于IAR的,所以要基于IAR的案例进行更改。

(4)使用MDK创建一个无操作系统的最简单程序,确保这个程序能够使用,这样做的目的是为了一步步的排查错误,假如无操作系统时,都有错误,移植过程中也肯定会有编译错误,那么在排查错误的时候也就增加了难度,不会写物操作系统的简单程序怎么办。

那就不要往下看了。

(5)移植的最大的改动主要有两部分,一个是一些头文件的增减,另外一个就是向量表中PendSV_Handler和SysTick_Handler的修改。

这里我要吐槽一下,网上说了一大堆关于什么OS_CPU.H的更改还有各种函数的的分析,这都是扯淡。

这些根本就不用移植者去修改,官网提供的案例都已经提供了,除非你选择移植的CPU是比较偏的,那么这些东西需要移植者自己去编写。

好了,下面就开始详细的记录怎么去移植。

一、创建一个无操作系统的简单裸板系统1.创建源文件工程文件夹,如下图所示:其中文件夹“CMSIS”为内核的接口,包含的文件如下图文件夹STM32_StdPeriph为固件驱动文件夹,这个把STM32的固件全都添加进去即可。

文件夹User为其他文件,如下图所示:文件夹Output和List主要是放那些编译产生的乱七八糟的文件,为了使工程代码更加简洁。

ucosiii移植原理

ucosiii移植原理

ucosiii移植原理
uCOSIII(MicroC/OS-III)是一款开源的实时操作系统(RTOS),适用于各种嵌入式系统和实时应用。

uCOSIII的移植原理主要包括以下几个方面:
1. 硬件抽象层(HAL):首先,需要针对特定硬件平台(如STM32、ARM、AVR等)编写硬件抽象层代码。

硬件抽象层的作用是将硬件平台的特性和接口抽象成统一的、易于操作的接口,以便于上层应用程序和实时操作系统进行调用。

2. 移植uCOSIII内核:将uCOSIII内核代码移植到目标硬件平台,主要包括以下几个步骤:
a. 配置uCOSIII内核:根据目标硬件平台的特性,配置uCOSIII内核的参数,如内存大小、任务数量等。

b. 修改内核代码:根据目标硬件平台的实际情况,修改内核代码,以适应不同硬件平台的需求。

这可能包括:修改内存管理代码、时钟管理代码、中断处理代码等。

c. 编写初始化代码:编写初始化代码,用于在系统启动时初始化
内核及其相关组件。

3. 移植uCOSIII的应用实例:根据项目需求,编写基于uCOSIII的应用实例。

这可能包括:编写驱动程序、编写通信协议、编写应用程序等。

4. 集成测试:将编写好的硬件抽象层、内核及应用实例集成到一起,进行系统测试和调试,确保整个系统的稳定性和可靠性。

5. 优化与调试:根据实际运行情况,对系统进行优化和调试,以提高系统的性能和资源利用率。

总之,uCOSIII的移植原理主要包括硬件抽象层的编写、uCOSIII内核的移植、应用实例的编写、集成测试以及优化与调试。

通过这些步骤,可以将uCOSIII成功移植到不同的硬件平台,并应用于各种实时系统。

Ucos移植方法一(详细篇)

Ucos移植方法一(详细篇)

Ucos移植方法一(详细篇)首先要有正确的硬件电路,包括:1.用9针串口线将PC机和9200底版连接好,注意串口线要插在标号为“P1”的串口上;2.插好9200核心板,“J2”插在靠近C18这边;3.其它跳线配置为:J13,J16要插好,JP1插在靠近C14这边,J12插在靠近C22这边;上电后超级终端的现象为:提醒:在测试状态下,上图中内核默认自动运行时间是3S,所以您要在板启动后按一下任意键,防止进入自动运行状态。

在Uboot>后输入:load 20000000后按回车现象如下:点击右键选择要下载的bin文件,过程如下图(文件目录:AT91RM9200-uCos/MainFun/basic.bin)然后点击“发送”,发送过程如下图发送完后入下图所示,在Uboot >后输入“go 20000000”后按回车,运行过程如下图这就是在超级终端上显示的效果,要说明的是,上图中红色框里的数字是连续输出的,直到关闭电源后就不连续输出。

而且在停止运行后一定要先复位在接着运行...................Ucos移植方法二其实上面是将源程序编译后的bin文件直接下载到RAM中运行的,现在利用JTAG/ICE来进行仿真,必备的条件如下:1.9针串口插在底版上标号为“P1”的串口插座上,25针并口线一头插在PC机并口,另一头插在JTAG/ICE转换器上,JTAG/ICE转换器的排线一头插在底版上标号为“J22”20Pins槽上,另一头插在JTAG/ICE转换器的的右边即靠近SN74HC244 10脚这边;2.将底版上标号为“J23”的跳线跳到靠近J5这边;3.核心板上标号“J2”的跳线跳到靠近“C18”的这边;4.底版上其它跳线配置为:J13,J16要插好,JP1插在靠近C14这边,J12插在靠近C22这边;5.9V电源线(最好用我公司提供的专用产品)插在标号为“JACK1”的DC插座上。

当您上电后ARM9调试代理软件9200超级终端的显示内容和电路板上的现象如下图所示的话就说明连接正确:⑴.底版核心板的现象为:电源指示灯(D8)核心板指示灯(LED1)亮着,网口指示灯(D5~D7)同时闪烁一下;⑵.ARM9调试代理软件9200超级终端的显示内容:利用ARM Developer Suite V 1.2软件将源程序汇编和编译(会生成一个bin 文件),如下图 文件目录为:AT91RM9200-uCos /MainFun / basic.mcp同时在超级终端里显示的内容如下图:这就是在超级终端上显示的效果,要说明的是,上图中红色框里的数字是连续输出的,直到关闭电源后就不连续输出。

手把手教你移植uCOS-III到STM32

手把手教你移植uCOS-III到STM32

手把手教你移植uCOS-III到STM32作者:谭建裕时间:2015年8月27日1、建立工程文件夹1.1在uCOS-III中添加如下文件夹1.2在Libraries文件夹中放入STM32的库,这点不必多说了。

1.3在USER文件夹中放入2、复制文件2.1将Micrium(uCOS-IIIV3.03)\Software\uCOS-III\Cfg\Template里的os_app_hooks.c;os_app_hooks.h;os_cfg.h;os_cfg_app.h复制到Cfg文件夹。

2.2将Micrium(uCOS-IIIV3.03)\Software\uCOS-III\Ports\ARM-Cortex-M3\Generic\IAR里的os_cpu.h;os_cpu_a.s;os_cpu_c.c文件复制到Ports文件夹中。

2.3将Micrium(uCOS-IIIV3.03)\Software\uCOS-III\Source里面的所有文件复制到Source文件夹中。

2.4将Micrium(uCOS-IIIV3.03)\Software\uC-CPU里面的cpu_core.c;cpu_core.h;cpu_def.h复制到uC-CPU文件夹中。

2.5将Micrium(uCOS-IIIV3.03)\Software\uC-CPU\ARM-Cortex-M3\IAR文件夹中的cpu.h;cpu_a.s;cpu_c.c复制到uC-CPU文件夹中。

2.6将Micrium(uCOS-IIIV3.03)\Software\uC-CPU\Cfg\Template里的cpu_cfg.h复制到uC-CPU文件夹中。

2.7将Micrium(uCOS-IIIV3.03)\Software\uC-LIB里面的lib_ascii.c;lib_ascii.h;lib_def.h;lib_def.h;lib_math.c;lib_math.h;lib_mem.c;lib_mem.h;lib_str.c;lib_str.h复制到uC-LIB文件夹中。

北航ARM9实验报告:实验3uCOS-II实验

北航ARM9实验报告:实验3uCOS-II实验

北航ARM9实验报告:实验3uCOS-II实验北航 ARM9 实验报告:实验 3uCOSII 实验一、实验目的本次实验的主要目的是深入了解和掌握 uCOSII 实时操作系统在ARM9 平台上的移植和应用。

通过实际操作,熟悉 uCOSII 的任务管理、内存管理、中断处理等核心机制,提高对实时操作系统的理解和应用能力,为后续的嵌入式系统开发打下坚实的基础。

二、实验环境1、硬件环境:ARM9 开发板、PC 机。

2、软件环境:Keil MDK 集成开发环境、uCOSII 源代码。

三、实验原理uCOSII 是一个可裁剪、可剥夺型的多任务实时内核,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。

其基本原理包括任务管理、任务调度、时间管理、内存管理和中断管理等。

任务管理:uCOSII 中的任务是一个独立的执行流,每个任务都有自己的堆栈空间和任务控制块(TCB)。

任务可以处于就绪、运行、等待、挂起等状态。

任务调度:采用基于优先级的抢占式调度算法,始终让优先级最高的就绪任务运行。

时间管理:通过系统时钟节拍来实现任务的延时和定时功能。

内存管理:提供了简单的内存分区管理和内存块管理机制。

中断管理:支持中断嵌套,在中断服务程序中可以进行任务切换。

四、实验步骤1、建立工程在 Keil MDK 中创建一个新的工程,选择对应的 ARM9 芯片型号,并配置相关的编译选项。

2、导入 uCOSII 源代码将 uCOSII 的源代码导入到工程中,并对相关的文件进行配置,如设置任务堆栈大小、系统时钟节拍频率等。

3、编写任务函数根据实验要求,编写多个任务函数,每个任务实现不同的功能。

4、创建任务在主函数中使用 uCOSII 提供的 API 函数创建任务,并设置任务的优先级。

5、启动操作系统调用 uCOSII 的启动函数,使操作系统开始运行,进行任务调度。

6、调试与测试通过单步调试、查看变量值和输出信息等方式,对系统的运行情况进行调试和测试,确保任务的执行符合预期。

uCOS-Ⅱ在ARM7上的移植

uCOS-Ⅱ在ARM7上的移植
33寄 存 器 组 织 -
A M微处理器共有 3 R 7个 3 2位 的寄 存 器 ,其 中 3 个 为 通 用 1 寄 存 器 。 为 状 态 寄存 器 。但 是 这 些 寄 存 器 不 能 被 同时 访 问 , 6个 具 体 哪 些 寄 存 器 是 可 编程 访 问 的 . 决 于 微 处 理 器 的工 作 状 态及 具 取 体 的运 行 模 式 。但 在 任 何 时候 , 用 寄 存 器 R1~ 0 程 序 计 数 器 通 4R 、 P 一 个 或 两 个 状 态 寄 存 器都 是 可访 问 的 。 1 示 为 A M 状 态 C、 表 所 R 下 , 模式 可访 问 的寄 存 器 。 各
摘要 : 本文 介 绍 了 C - I oS I 的概 况 和 A M 体 系结 构 中 与移 植 工作 相 关 的一 些概 念 , 在 此基 础 上 分析 了基 于 A M 的移 植 工作 。 R 并 R 关 键 词 : oS I 嵌入 式 实 时操 作 系统  ̄ RM ; 植 C — I A . 移
(u y n a e o e e u y n 1 0 , hn ) L o agTec r C l g , o a g4 0 1 ia h s l L 7 C
Ab t c : i s a e r sn s r f eo COS I sr t a Th p rp ee t a p o l f p i —I ARM r h tcu e a d s me o e i e s s cae 山 t n p a t a d o h ai o ac i t r n o f h a s it d wi r s ln s n n t eb s f e t d ao a . s
2 u OS I概 述 C —I
19 92年 , 美 国人 Ja . Lbos enJ a rs e编 写 了 实 时 多 任 务 内 核 C S C S I是 基 于 C S的 , 者 的 内核 一 样 , 是 C S I 0 , 0 —I 0 二 只 0 —I 提供 了更 多 的 功 能 。经 过 1 0多 年 的 发展 , 0 C S已经 被 移 植 到 包 括 x 6 A M、o eP M P 8 、 R Pw rC、 IS等 4 0多种 处 理 器 架 构 上 。移 植 上 的 处理 器 还 在 不 断 增 加 。自 19 92年 以来 已经 有 数 百个 商业 应 用 。 另 外 ,0 0年 7月 , 0 —I 一 个 航 空 项 目中 得 到 了 美 国 联 邦 航 20 C S I在 空 管 理局 的认 证 , 该认 证 表 明 C S I具 有 足够 的安 全 性 和稳 定 0 —I

在PROTEUS中使用ARM处理器及UCOS-II移植理解

在PROTEUS中使用ARM处理器及UCOS-II移植理解

嵌入式系统课程论文在PROTEUS中使用ARM处理器及uC/OS-II移植理解Rein Lee一.嵌入式系统概述通过本次嵌入式系统课程的学习,我了解了嵌入式系统的概念。

所谓嵌入式系统,是指用于执行独立功能的专用计算机系统,它由包括微处理器、定时器、微控制器、存储器、传感器等一系列微电子芯片与器件,和嵌入在存储器中的微型操作系统、控制应用软件组成,共同实时诸如实时控制、监视、管理、移动计算、数据处理等各种自动化处理任务。

嵌入式系统以应用为中心,以微电子技术、控制技术和通讯技术为基础,强调硬件软件的协同性与整合性,软件与硬件可裁减,以满足系统对功能、成本、体积和功耗等要求。

1.1 嵌入式系统的硬件特征嵌入式系统的硬件必须根据具体的应用任务,以功耗、成本、体积、可靠性、处理能力等为指标来选择。

嵌入式系统的核心是系统软件和应用软件。

由于存储空间有限,因而要求软件代码紧凑、可靠,大多对实时性有严格的要求。

早期的嵌入式系统设计方法,通常是采用“硬件优先”原则。

在粗略估计软件任务需求的情况下,首先进行硬件设计与实现。

然后在此硬件平台上,再进行软件设计。

因为很难充分利用硬件软件资源,取得最佳性能的效果。

同时,一旦在测试时发现问题,需求对设计进行修改时,整个设计流程将重新进行,对成本和设计周期的影响很大。

这种传统的设计方法只能改善硬件/软件各自的性能,在有限的设计空间不可能对系统做出较好的性能综合优化,在很大程度上依赖于设计者的经验和反复实验。

随着电子系统功能的日益强大和微型化,系统设计涉及的问题越来越多,难度也越来越大。

硬件和软件也不再是截然分开的两个概念。

因而出现了软硬件协同的设计方法。

在系统目标要求下,协同设计软硬件体系结构,以最大限度地挖掘系统软硬件能力,得到高性能低代价的优化设计方案。

1.2 嵌入式操作系统目前流行的嵌入式操作系统可以分为两类:一类是从运行在个人电脑上的操作系统向下移植到嵌入式系统中,形成的嵌入式系统,如微软公司的Windows CE,SUN公司的Java操作系统,嵌入式Linux等。

基于ARM7内核的UCoS—Ⅱ移植研究

基于ARM7内核的UCoS—Ⅱ移植研究
学 出 版社 。 0 . 2 4 0
登录的部署 , 企业业务系统更加安全 、 快捷 、 方便 。 ③增加灵活性 。 提供后期 的关键业务单 点登录集成 , 新业务系统 的单点登 录集成建议方案 和实施方 案服务 ,
3 亲密接触 A PN TM] 京: S .E [ . 北 清华 大学 出版社,0 2 20 . 保证企业 的信息化建设可持续 的发展 。并 且提供包括快 []杜亮 .
tp d f sg e n I y e e in d it NT3 S 2 ; 配置代码 主要包括 O — F . I C U E . 它们 主要用 SC GH、 L D SH, N 于剪裁和设置操作系统。以上文件名为 U O —I C S I 的默认 2 任 务与 函数 调 用 的封 装 . 2
关键 词 : 入 式 ; 作 系统 移 植 ; OS 嵌 操 UC
中 图分 类 号 : P 1 T36
文 献标 识 码 : A
文 章 编 号 :06 83 (02 0— 08 0 10 — 9 7 2 1) 5 0 6 — 1
由于基 于 A M R 7内核 的各 种 芯 片之 间有 着 很 大 的差 调用 O S r i R y 运行优先级最高的任务 。 Stt g dO aH h 第三 , 移植 异, 这些差异主要表现在存储 系统不 同 、 内外设不 同、 OS C UH。 O — P — . 片 P . 在 S C U CC文件 中, 需要编写 以下 1 个 0 中断源不同等 。这就造成 了嵌入式操作 系统移植的不可 c函数 ,名称分别为 O T sS li 、s ak r t 0k 、 Sakt n 0 0 T sce e o( k t aH ) 避免性 ,而嵌入式操作 系统移植 效果 的优劣直接影 响着 0S ak 1 0 (、 T sS Hok)0 T s IlH o (、 T sDe k)0S ak w o ( S akde 0k) Ho 、

基于STM32单片机的uCOS-II操作系统移植

基于STM32单片机的uCOS-II操作系统移植

第6期2020年12月机电元件ELECTROMECHANICALCOMPONENTSVol 40No 6Dec 2020收稿日期:2020-10-20基于STM32单片机的uC/OS-II操作系统移植张中前(贵州航天电器股份有限公司,贵州贵阳,550009) 摘要:网络技术和信息技术的发展,嵌入式系统应用越来越普及,嵌入式设备的应用也越来越多。

uC/OS-II广泛应用于路由器、飞行器及工业控制等。

uC/OS-II操作系统执行效率高,占用存储空间少,具有实时性及可扩展性等优点,在小型嵌入式设备中具有广泛应用。

本文介绍了基于ARMCORTEXM3系列单片机上的uC/OS-II移植,对电子控制组件的设计具有参考作用。

关键词:实时操作系统;uC/OS-II;内存管理;任务管理;STM32;移植Doi:10.3969/j.issn.1000-6133.2020.06.015中图分类号:TN784 文献标识码:A 文章编号:1000-6133(2020)06-0057-051 引言操作系统是裸机的第一层软件,操作系统直接运行在硬件上,上层软件通过提供应用程序接口(API函数),实现对底层硬件的访问,同时,通过操作系统实现对多个上层应用软件(任务)管理,实现对硬件CPU管理、存储管理、I/O接口管理及文件管理,如图1所示。

图1 操作系统功能组成示意图 STM32系列单片机以其优良的价格,大容量的FLASH及RAM存储空间,极易用于较为复杂的控制系统;在STM32单片机上进行uC/OS-II实时操作系统的移植,提高了产品的设计灵活性,实现较为复杂的系统功能;通过将开源的uC/OS-II移植在STM32单片机上,以其较为低廉的硬件成本获得较高的使用性能,具有良好的应用前景。

2 uC/OS-II操作系统2.1 uC/OS-II操作系统的基本特征uC/OS-II是一个完整的、可移植、可固化、可剪裁的基于优先级调度的抢占式实时多任务操作系统;它能够在外界事件或数据产生时,能够接收图2 uC/OS-II文件结构示意图并以足够快的速度响应,其处理的结果又能够在规定的时间内输出,并控制所有实时任务协调、一致运行。

uCOS-II操作系统在ARM处理器上的实现

uCOS-II操作系统在ARM处理器上的实现

中国矿业大学本科生毕业论文姓名:学号:学院:专业:论文题目:uCOS-II操作系统在ARM处理器上的实现指导教师:职称:2010 年6 月中国矿业大学毕业论文任务书学院专业年级学生姓名任务下达日期:|毕业论文日期:毕业论文题目:uCOS-II操作系统在ARM处理器上的实现毕业论文主要内容和要求:本文首先将介绍嵌入式系统的历史、现状、发展方向和一些基本概念。

接着对ARM核芯片的应用领域、ARM指令集、寄存器组织做详细介绍。

然后将详细分析uCOS-II的特点与相关系统结构、任务的状态与调度、系统的通信机制。

接下来将简单介绍硬件开发环境和uCOS-II硬件和软件体系结构,提出移植过程中存在的主要问题,并给出移植过程。

移植过程主要集中在三个文件的重新编写上:OS_CPU.H , OS_CPU_A.ASM和OS_CPU_C.C。

文章将给出相关函数的模型和源代码,并附上注释和详细说明。

在确保系统正常运行的情况下,本文还提出了一种任务堆栈的改进方法,并给出了流程图。

院长签字:指导教师签字:指导教师评语(①基础理论及基本技能的掌握;②独立解决实际问题的能力;③研究内容的理论依据和技术方法;④取得的主要成果及创新点;⑤工作态度及工作量;⑥总体评价及建议成绩;⑦存在问题;⑧是否同意答辩等):成绩:指导教师签字:年月日评阅教师评语(①选题的意义;②基础理论及基本技能的掌握;③综合运用所学知识解决实际问题的能力;④工作量的大小;⑤取得的主要成果及创新点;⑥写作的规范程度;⑦总体评价及建议成绩;⑧存在问题;⑨是否同意答辩等):成绩:评阅教师签字:年月日中国矿业大学毕业论文答辩及综合成绩摘要随着计算机和通信技术的快速发展,嵌入式系统以其简洁、高效等优点越来越多地受到人们的广泛关注。

嵌入式产品己经成为了信息产业的主流,被广泛应用于移动计算设备、网络设备、工控设备、信息家电、汽车电子、娱乐设施、仪器仪表等领域。

开发一个嵌入式应用系统需要嵌入式硬件、实时操作系统及相应的软件工具。

UCOS-II在51单片机上的移植

UCOS-II在51单片机上的移植

UCOS-II在51单片机上的移植做操作系统的移植首先明白什么是移植,操作系统是一种鱼硬件(处理器)相关的软件,根据某一种处理器来设计的操作系统通常不能运行在那其他处理器。

所谓的移植是指修改操作系统,然后加载到一个处理器上。

本文只讲解步骤,至于理论知识,需要大家自己学习。

步骤:1,在UCOS-II的官网上下载,操作系统。

2,在网上找到或者自己建三四个文件:OS_CPU_A.ASSMOS_CPU.HOS_CPU_C.COS_CFG.H以上文件需要修改3,移植源码的编写和修改❖OS_CPU.H1)定义与编译器有关的数据类型typedef unsigned char BOOLEAN; /* 不能使用bit定义,结构中无法使用*/typedef unsigned char INT8U; /* 无符号8位数*/typedef unsigned char INT8S; /* 有符号8位数*/typedef unsigned int INT16U; /* 无符号16位数*/typedef signed int INT16S; /* 有符号16位数*/typedef unsigned long INT32U; /* 无符号32位数*/typedef signed long INT32S; /* 有符号32位数*/typedef float FP32; /* 单精度浮点数*/typedef double FP64; /* 双精度浮点数*/typedef unsigned char OS_STK; /* 定义堆栈入口宽度为8位*/typedef unsigned char OS_CPU_SR; /* 定义CPU状态字的宽度为8位*/2)定义堆栈增长方向#define OS_STK_GROWTH 0 /* MCS-51堆栈从下往上增长,1=向下,0=向上*/3)定义任务级的任务切换宏#define OS_TASK_SW() OSCtxSw() /* 任务级的任务切换宏*/4)定义临界段宏:#define OS_ENTER_CRITICAL() EA=0#define OS_EXIT_CRITICAL() EA=1❖OS_CPU_C.C①初始化任务栈void *OSTaskStkInit(void(*task)(void *pd), void *ppdata, void *ptos, INT16U opt) REENTRANT{O S_STK *stk;p pdata=ppdata; //pata data 为52文件关键字o pt =opt; /* opt没被用到,保留此语句防止警告产生 */s tk =(OS_STK *)ptos; /* 任务堆栈最低有效地址*/*stk++=15; /* 任务堆栈长度*/ *stk++=(INT16U)task & 0xFF; /* 任务代码地址低8位*/*stk++=(INT16U)task >> 8; /* 任务代码地址高8位*//* 处理器是按特定的顺序将寄存器存入堆栈的,所以用户在将寄存器存入堆栈的时候也要依照这一顺序 */*stk++=0x00; /* PSW*/*stk++=0x0A; /* ACC*/*stk++=0x0B; /* B */ *stk++=0x00; /* DPL*/*stk++=0x00; /* DPH*/*stk++=0x00; /* R0 */ *stk++=0x01; /* R1 */ *stk++=0x02; /* R2 */ *stk++=0x03; /* R3 */ *stk++=0x04; /* R4 */ *stk++=0x05; /* R5 */ *stk++=0x06; /* R6 */ *stk++=0x07; /* R7 */ /* 不用保存SP,任务切换时根据用户堆栈长度计算得出*/*stk++=(INT16U)(ptos+MAX_STK_SIZE) >> 8; /* ?C_XBP 仿真堆栈指针高8位 */*stk++=(INT16U)(ptos+MAX_STK_SIZE) & 0xFF; /* ?C_XBP 仿真堆栈低8位*/r eturn ((void *)ptos); /* 返回最低地址,这里不用弹出栈顶指针是为了提高计算效率 */}②初始化定时器void InitTimer0(void) REENTRANT{TMOD=TMOD&0xF0; //屏蔽高四位TMOD=TMOD|0x01; /* 模式1(16位定时器),仅受TR0控制 */ TH0=TIMER_20MS_TH0;TL0=TIMER_20MS_TL0;E A=0; /* EA和ET0,51上电缺省值为0,EA将在OSStartHighRdy()中打开*/ET0=0; /* 满足在OSStart()前不产生时钟中断的要求,系统启动后第一时间开定时器T0中断 */TR0=1;}❖OS_CPU_A.ASM编写4个函数OSStartHighRdy()OSCtxSw()OSIntCtxSw()OSTickISR()❖OS_CFG.H主要为参数和使能的宏定义#define MAX_STK_SIZE 1024 /* 最大堆栈大小为1k*/#define OS_MAX_EVENTS 5 /* 应用程序中事件控制块的最大数量(必须大于零)*/#define OS_MAX_FLAGS 2 /* 应用程序中事件标志组的最大数目(必须大于零)*/#define OS_MAX_MEM_PART 5 /* 内存分区的最大数目(必须大于零)*/#define OS_MAX_QS 2 /* 应用程序中队列控制块的最大数目(必须大于零)*/#define OS_MAX_TASKS 11 /* 应用程序中任务的最大数目(必须大于2)*/#define TASK_START_PRIO 2 /* 应用程序开始优先级*/#define OS_LOWEST_PRIO 12 /* 定义可分配的最低优先级(必须大于63)*/#define TASK_STK_SIZE 512 /* 默认任务堆栈大小*/#define OS_TICKS_PER_SEC 50 /* 设置每秒节拍数*/#define TIMER_20MS_TH0 0x70 /* CPU=22.1184MHz, OS_TICKS_PER_SEC=50, TH0=0x70 */#define TIMER_20MS_TL0 0x00 /* CPU=22.1184MHz, OS_TICKS_PER_SEC=50, TL0=0x00 */晶振频率为22.1184MHz时才有OS_TICKS_PER_SEC=50,OS_TICKS_PER_SEC=50。

uCOS-II在51单片机上的移植

uCOS-II在51单片机上的移植

功能
处理临界段方式选择 堆栈增长方向 进入临界区 退出临界区 就绪态最高优先级任务运行 任务级任务切换 中断级任务切换 时钟节拍 任务堆栈初始化
表7-1 需要修改的关键函数和宏定义
6
7.1.6 INCLUDES.H

* * * * * * 文件名 : INCLUDES.H * 作者 : Jean J. Labrosse ****************************************************************************/
9
7.1.8 OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()
临界代码的概念。 uC/OS-II定义的两个宏。
{ OS_ENTER_CRITICAL(); /* µC/OS-II 临界代码段 */ OS_EXIT_CRITICAL(); }
#define OS_ENTER_CRITICAL() EA=0 #define OS_EXIT_CRITICAL() EA=1 #define OS_ENTER_CRITICAL() \
例如,任务A和任务B都要调用函数Swap(), 而该函数又使用了全局变量temp。于是当任 务A调用Swap()函数期间,系统发生了任务 切换而使任务B也调用了Swap(),那么任务B 将要改变全局变量temp的值,使任务A传递 给全局变量temp的值丢失而出现错误。
一般来说,一个可重入函数应该在函数中只 使用局部变量,因为函数的局部变量存储在 任务的堆栈中,所以可保证不同的任务在调 用同一个函数时不会发生冲突。
/ ******************* 与处理器相关的代码 ********************/ #define OS_CRITICAL_METHOD ?? #if OS_CRITICAL_METHOD = = 1 #define OS_ENTER_CRITICAL() ?? #define OS_EXIT_CRITICAL() ?? #endif

ucosIII移植教程

ucosIII移植教程

ucosIII移植教程作者:毕晨光QQ:448251593背景和环境 (2)一、获取源文件 (2)二、建立一个最简单的gpio工程 (2)三、移植ucosIII (9)四、测试OS (14)背景和环境工作很久了,一直在用ucosIII,以前移植过ucosII,也看过别人写的教程移植过ucosIII,但是一直想自己移植一下ucosIII,然后把自己的移植体会写出来.供大家一起学习.环境:iar6.0, stm32lib_v3.5, ucosIII.一、获取源文件获取stm32库文件v3.5.地址: /down_6273773.html获取ucosIII的源码. 地址: /down_6273751.html这是一个.exe的文件.需要运行解压到指定的目录.(我解压到C盘,默认),如下图:以上文件若你都有就不必下载二、建立一个最简单的gpio工程在D盘(可按需)建立一个stm32_ucosIII的目录,然后在其里面建立一个App目录,将STM32 v3.5固件库…\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\GPIO\IOTo ggle下面的文件都拷贝到App下面然后把stm32的库拷贝到stm32_ucosIII目录打开IAR软件Project->Create New Project然后按照下图建立分组然后添加源文件如下图些,iar的设置比较多下面开始了(我的是stm32107xC)然后切换到下图:选中箭头指示的Use CMSIS(告诉iar我们用stm32库)接着切换到下图:这里的Level是iar对代码的优化等级,你可以默认(我选择的最高优化等级优化大小)在切换到下图:图中”1”这里设置头文件的路径,把工程相关的文件夹只要包含.h的文件的文件夹的路径都添加上,$PROJ_DIR$这个符号的意思是你的工程保存的路径,你可以直接把英文翻译过来就是这个意思了PROJ 和DIR 分别是project、directory的前几个字母组合起来的,”\..\”表示是从工程目录的转到上一级目录$PROJ_DIR$\$PROJ_DIR$\App$PROJ_DIR$\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x$PROJ_DIR$\Libraries\STM32F10x_StdPeriph_Driver\inc图中“2”的地方预定义一个宏USE_STDPERIPH_DRIVER这个宏是stm32库的开关也可以在其它地方定义接着切换到下图:调试选择j-link/j-trace现在所有的设置都已完成现在打开main.c文件找到#include "stm32_eval.h"然后删除然后在点击main.c前面的加号”+”找到stm32f10.h双击进入文件65行选择一个芯片容量(行号可通过菜单Tools->option->Editor->show line numbers)在菜单选择project->rebuild all在或者用下图方法:弹窗保存窗口这里可能会出现错误, 这个错误说的是没有指定一款芯片双击错误定位到错误的位置,然后找到第65行.你会发现有芯片定义但是全部是注释状态根据你的芯片的容量打开一个注释.我的是STM32F10X_CL在编译一次OK.一个错误都没有.进入main.c文件主函数吧里面的内容都删除掉,只剩下一个while(1),以备后面移植ucosIII使用,如下图:此时其实我挺纠结是开始ucos移植还是先把stm32的systick中断配置好.想来想去还是先把systick这个内核定时器配置好吧.这个是ucos的心跳.我们在main函数里面加上两句程序用于初始化systick的.systick 定时具体的寄存器请参照stm32 的数据手册SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);SysTick_Config(9000);/*配置systick周期1ms*/打开stm32f10x_it.c文件的139行在里面添加几条空语句,设置一个断点.仿真运行看systick是否工作运行效果如下图三、移植ucosIII现在我们开始正式移植ucosIII,打开我们的工程目录,按照下图操作,然后把源码包里面的BSP目录下面的bsp.c和bsp.h两个文件copy到我们新建的Bsp目录下拷贝后现在源文件都搞定了.就差添加到工程里面了,回到IAR建立相应分组具体看下图然后添加文件添加完所有的文件,然后打开IAR工程选项设置路径,以下是新增加的文件夹路径$PROJ_DIR$\Bsp$PROJ_DIR$\uC-CPU$PROJ_DIR$\uC-CPU\Cfg\Template$PROJ_DIR$\uC-CPU\ARM-Cortex-M3\IAR$PROJ_DIR$\uC-LIB$PROJ_DIR$\uC-LIB\Cfg\Template$PROJ_DIR$\uCOS-III\Cfg\Template$PROJ_DIR$\uCOS-III\Ports\ARM-Cortex-M3\Generic\IAR$PROJ_DIR$\uCOS-III\Source现在开始修改文件,进入bsp.c文件163行,把BSP_Init()函数内容都删除掉然后在头文件的位置加入#include "stm32f10x.h"进入stm32f10x_it.c文件130行把PendSV_Handler()函数屏蔽掉139行把SysTick_Handler()函数也屏蔽掉,如下图接下来进入os_cpu_c.c文件355行把函数名修改掉→然后进入os_cpu.h文件133行两个函数名修改→接下来进入os_cpu_a.asm文件38行→133行→至此移植算是告一段落.编译一下.会出现错误提示不能打开这个头文件这个是app的所以我们双击错误定位到错误位置把这句删除即可这个错误时不能打开os_type.h 文件所以我们去ucosIII的源码目录下找到这个文件拷贝到我们的工程目录下的App下在次编译….还是有错误.提示处理方法同上下面这个错误提示一个使能开关没打开进入cpu_cfg.h文件99行.改为下图编译….这次只剩下一个错误.也是头文件出错.直接删除包含语句即可下面这个错误重复的定义了同意个函数名称解决方法直接双击下面的出现下图,在exclude from build 前打√,不在编译这个文件接下来再次编译此时只剩下2个警告.是2个函数声明为静态却没有被调用过.这个可以直接去掉函数前面的static (注意.函数的声明和原形都要去掉.否则会出现不一致的错误),当然你也可以不理会这个警告四、测试OS打开main.c文件在24行添加#include "os.h"37行添加CPU_STK AppTaskStk[128];OS_TCB AppTaskTCB;void AppTask(void *p_arg);main()函数添加OS_ERR err;CPU_IntDis();SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);/*配置systick的时钟源为hclk8分频*/SysTick_Config(9000); /*配置systick的时钟周期1ms*/OSInit(&err); /*初始化OS*/OSTaskCreate((OS_TCB *)&AppTaskTCB, /* Create the task */(CPU_CHAR *)"App Task",(OS_TASK_PTR )AppTask,(void *)0,(OS_PRIO )12,(CPU_STK *)&AppTaskS tk[0],(CPU_STK_SIZE)128/10,(CPU_STK_SIZE)128,(OS_MSG_QTY )0,(OS_TICK )0,(void *)0,(OS_OPT )OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR,(OS_ERR *)&err);OSStart(&err); /*启动OS*/然后在加入任务函数原形/*** @brief Main program.* @param None* @retval None*/void AppTask(void *p_arg){OS_ERR err;static char t = 0;while(1){if (t){t = 0;asm("nop");OSTimeDly(200, OS_OPT_TIME_DLY, &err);}else{t = 1;asm("nop");asm("nop");asm("nop");OSTimeDly(100, OS_OPT_TIME_DLY, &err);}}}具体截图:编译下载运行两个断点都可以运行到.说明ucos移植完成了.这里建立了一个简单的任务.测试了ucosIII的移植.移植过程中很多函数都没有用ucosIII的函数项系统的systick函数的初始化,还有把所有的中断函数重新映射一遍等等.具体请读者自己研究.12/21/2012 6:03 PM。

ucosii移植实验报告

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");}}。

嵌入式实时操作系统题库1

嵌入式实时操作系统题库1

嵌入式实时操作系统题库一、填空题1.uC/OS-II是一个简洁、易用的基于优先级的嵌入式(抢占式)多任务实时内核。

2.任务是一个无返回的无穷循环。

uc/os-ii总是运行进入就绪状态的(最高优先级)的任务。

3.因为uc/os-ii总是运行进入就绪状态的最高优先级的任务。

所以,确定哪个任务优先级最高,下面该哪个任务运行,这个工作就是由(调度器(scheduler))来完成的。

4.(任务级)的调度是由函数OSSched()完成的,而(中断级)的调度是由函数OSIntExt() 完成。

对于OSSched(),它内部调用的是(OS_TASK_SW())完成实际的调度;OSIntExt()内部调用的是(OSCtxSw())实现调度。

5.任务切换其实很简单,由如下2步完成:(1)将被挂起任务的处理器寄存器推入自己的(任务堆栈)。

(2)然后将进入就绪状态的最高优先级的任务的寄存器值从堆栈中恢复到(寄存器)中。

6.任务的5种状态。

(睡眠态(task dormat)):任务驻留于程序空间(rom或ram)中,暂时没交给ucos-ii处理。

(就绪态(task ready)):任务一旦建立,这个任务就进入了就绪态。

(运行态(task running)):调用OSStart()可以启动多任务。

OSStart()函数只能调用一次,一旦调用,系统将运行进入就绪态并且优先级最高的任务。

(等待状态(task waiting)):正在运行的任务,通过延迟函数或pend(挂起)相关函数后,将进入等待状态。

(中断状态(ISR running)):正在运行的任务是可以被中断的,除非该任务将中断关闭或者ucos-ii将中断关闭。

7.(不可剥夺型)内核要求每个任务自我放弃CPU的所有权。

不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。

8.当系统响应时间很重要时,要使用(可剥夺型)内核。

最高优先级的任务一旦就绪,总能得到CPU的控制权。

使用keilMDK为ARM9移植uCOSII

使用keilMDK为ARM9移植uCOSII

使用keilMDK为ARM9移植uCOSII作者:吴少风声明:文中内容仅为个人观点,欢迎讨论。

1. 前言ARM9是ARM推出较早的经典处理器,已经积累了大量的应用。

uCOS是流行的开源的实时操作系统(RTOS),可以从uCOS官网获取源码。

KeilMDK是ARM 官方的集成开发环境(IDE),用以支持ARM内核的不同制造商的芯片,其界面简单,功能强大,使用方便,而且持续更新,文档详尽。

ARM9可以运行linux操作系统,但开发相对复杂,且实时性较低。

为ARM9移植uCOS操作系统,提供了一种简单的、实时的操作系统方案。

目前,在keilMDK下,已经有大量ARM Cortex-M核心的uCOS移植案例。

而ARM9的嵌入式开发,包括bootloader和系统移植等,还有很多使用ADS开发环境。

但ADS支持和更新落后,使用相当不方便。

本文使用keilMDK替换落后的ADS,为项目带来了方便。

对业内更多其它的ARM9开发项目,也多一条方法借鉴。

uCOS的参考资料,是邵贝贝翻译的《嵌入式实时操作系统uC_OS-II》,以及uCOS官方文档号为AN1014的应用笔记。

因为要和CPU寄存器组打交道,移植前还需要找到:S3C2440芯片用户手册,ARM构架参考手册。

编译器所需帮助,可以在其帮助菜单中查看超文本文档,方便且详尽。

本文侧重于移植工作,读者在移植之前,应该已经熟悉keilMDK环境,这在网上有一大堆资料。

而且使用keilMDK在实际硬件上做过GPIO、中断、定时器的实验,因为移植时也需要做这些工作。

这些都很简单,建立一个工程,不用修改提示拷贝过来的对应汇编启动文件就可完成。

同时手头还有一些辅助调试的手段,比如串口工具、开发板上的屏幕显示,这些可以确保遇到问题有更多的调试手段。

移植uCOS的代码调试,只使用IDE的模拟器(project option->debug->using simulator)也可以完成调试。

uCOS-II嵌入式操作系统介绍与移植

uCOS-II嵌入式操作系统介绍与移植

OSStartHighRd
1、该函数是在OSStart函数中调用 2、负责从最高优先级任务的TCB中获得该任务的堆
栈指针sp,并依次将cpu现场恢复,这时系统就将 控制权交给用户创建的该任务进程,直到该任务被 阻塞或者被其他更高优先级的任务抢占cpu 3、该函数仅在多任务启动时被执行一次,用来启 动之前创建的第一个,也就是最高优先级的任务执 行
3、可从网站上获 得全部源码及其在各种体系结构平 台上的移植范例。
uC/OS-II特点
1、uC/OS-II内核具有可抢占的实时 多任务调度功能
2、提供了许多系统服务,如信号量、 消息队列、邮箱、内存管理、时间 函数等
3、这些功能可以根据不同的需求进 行裁减。
uC/OS-II的移植
ARM处理器相关宏定义
1、退出临界区
#defineOS_ENTER_CRITICAL() ARMDisableInt()
2、进入临界区
#defineOS_EXIT_CRITICAL() ARMEnableInt()
堆栈增长方向
1、堆栈由高地址向低地址增长,这个也 是和编译器有关的,当进行函数调用时, 入口参数和返回地址一般都会保存在当 前任务的堆栈中,编译器的编译选项和 由此生成的堆栈指令就会决定堆栈的增 长方向。
#define OS_STK_GROWTH 1
OS_CPU.c的移植
1、任务堆栈初始化 2、系统hook函数 3、中断级任务切换函数
任务堆栈初始化OSTaskStkInit
1、由OSTaskCreate或OSTaskCreateExt调用 2、用来初始化任务的堆栈并返回新的堆栈指针stk。
退出/进入临界区函数 ARMDisableInt/ARMEnableInt
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

UC/OS-II 嵌入式系统在ARM 上的移植UC/OS-II 操作系统是一款完全公开的源代码,它非常精简,整个操作系统的代码只有几千行,是专门针对于嵌入式开发而产生的一款代码。

它有几个特点,分别是可移植性(Portable )、可固化(ROMable )、可裁剪(Scalable )、多任务、可确定性、任务栈、系统服务、中断管理、稳定性可靠性。

UC/OS-II 主要就是一个内核,由ANSIC 语言编写而成。

负责任务管理和任务调度,没有文件系统和界面系统。

它的代码是公开的,系统的实时性强、移植性好、可多任务。

UC/OS-II 作为基于优先级的抢占式多任务的实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步和内存管理的功能。

它使得任务的独立性,不相互干涉,非常的准时和高效,且易于设计和扩展。

UO/OS-II 共有16个内核文件,11个与CPU 类型无关,就是说可以直接使用不需要修改。

还有3个内核文件与CPU 有关系,要根据需要作出相应的改动。

剩下的两个内核文件和具体的应用有关。

如图所示UC/OS-II 的16个内核文件的层次。

μC/OS -II 内核文件软件 硬件多任务操作的核心是系统调度器,利用TCB来管理任务调度功能。

它的主要功能是保存任务的当前态、优先级、等待事件、代码起始地址、初始堆栈指针等。

程序的设计关键就是确定划分多任务的问题,以及任务优先级和任务通信。

优先级的意思是每个任务都是无限循环的,有运行态度、就绪态、休眠态、挂起态和中断五种状态。

当有高一级优先级的任务就绪后,低优先级立即停止运行,转为挂起态或就绪态。

这就是可剥夺型的内核。

当中断一个高优先级任务,中断时挂起,中断结束后任务继续运行,并立即剥夺低优先级的任务。

对于这种可剥夺型内核,CPU的使用时可以确定的,可优化任务级响应。

在很多单片机或ARM板上很容易就可以移植UC/OS-II。

当然本次设计使用的TQ2440,也可以完美的移植它。

移植程序在网上都可以找得到,所以设计中就不做解释了。

本次设计实现的是串口协议和网口协议组合成的一个数据网关。

其主要的流程图如下所示:如图所示可以很清楚的看出内核操作系统对于整个系统的控制过程,下面我们要介绍一下UC/OS-II里面的一些程序。

用户应用程序任务定义代码如下:void MyTask( void *pdata) //开始定义用户任务{for(;;){...}}void main(){TargetInit(); //完成初始化目标开发板。

OSInit (); //完成初始化UCOS-II。

OSTimeSet(0); //完成初始化系统时基。

OSTaskCreate (MainTask,(void *)0, &MainTaskStk[MainTaskStkLengh - 1], MainTaskPrio); //开始创建系统初始任务。

OSStart (); //整个任务开始。

return 0;}void Task0(void *pdata) //主任务建立:taks0 和task1{#if OS_CRITICAL_METHOD == 3 /* 分配CPU状态寄存器*/ OS_CPU_SR cpu_sr;#endifOS_ENTER_CRITICAL();Timer0Init(); //初始化报时信号ISRInit(); //初始化中断优先级OS_EXIT_CRITICAL();OSPrintfInit(); //用户任务给串口DM9000_init();OSStatInit();while(1){OSPrintf("\nEnter Main Task\n");//测试Dm9000//打印DM9000寄存器OSTimeDly(OS_TICKS_PER_SEC);}}需要注意的是,μC/OS-II的应用程序要使用空闲任务OSTaskldle(),而它是不可删除的系统文件。

下面开始对应用程序进行移植了。

本次设计是在ARM开发板上实现串口、网口数据转换的的功能。

在TQ2440上有串口和网口。

通信过程简单的描述就是PC串口发送数据给ARM板,ARM接到串口数据后,从网口再传给PC。

相反也是同样的道理,由网口发送数据,有ARM 控制由串口发回数据。

首先是TCP/IP协议的移植。

在编写移植程序前,有必要解释一下基本的协议栈作用和意义。

`就常见的网络通信方式一般来说有两种:1、UART-RS232,此时只需要pc上有串口调试助手即可。

2、TCP/IP,这时候和普通pc与pc通信一样可以用socket套接字编程也可用别人写好的软件侦听。

而现在我们要实现的是串口控制单片机与PC机的通信,在这里用PC来代替以太网。

接下来还要介绍一下以太网接口。

以太网技术如今已经相当的成熟了,其相应的网络产品价格低廉、技术完善。

而数据总线如今越来越难以满足人们日益提升的需要,这时以太网控制网络技术得到了快速的发展,并形成了现场总线的新标准。

加上国内大部分局域网是以太网,给予以太网实现现场总线有了雄厚的物质基础。

以太网的接口就是以太网同信的基础,是通信介质通信的中间处理部件,实现报文的发送与接收功能,位于TCP/IP协议栈的数据链路层。

每一个以太网接口(有时候也叫网卡),在连通后就可以随时的发送和接收网络上的数据,执行EEE802.3标准。

TCP/IP对应的ISO结构如图所示:TCP/IP协议栈而单片机与计算机的TCP/IP协议的实现也有很大的不同,原本在计算机里编写的程序可以不考虑代码的大小和效率,但在嵌入式开发板上都要考虑到这些问题。

在操作系统、内存分配、指针、参数传递、协议支持以及硬件接口的设计方面有些不同。

首先就是操系统,嵌入式的特点之一就是简洁高效,有很强的专业功能。

相对而言计算机上的操作系统的侧重点就是兼容性,所以资源要求全面支持,所以很复杂。

其次就是内存上的分配,计算机像windows系统它的内存分配是动态的,而在单片机上却不能同样如此,应为RAM的容量所限,所以其中存放以太网的数据包是固态的。

由于ARM相对于单片机的能力而言有了很大的提升,所以可以突破单片机的一些约束。

如下图所示,TCP/IP协议栈中的内容,从上往下分别对应应用层、传输层、网络层和网络接口层。

TCP/IP协议栈在本次设计中采用Lwip协议栈来实现ARM与以太网的连接。

完成移植后,需要介绍一下以太网的初始化过程和数据收发过程。

LWIP的初始化要在UC/OS-II之后,在其它任务创建之前。

因为LWIP要对以太网协议栈初始化以及新线程的建立,LWIP初始化如图所示。

(3)以太网初始化流程LWIP程序可以实现很多功能,在本设计中没有实现他的全部功能。

而简单的PING通需要DM9000来实现。

以太网的接收是通过中断方式,如果有数据进入以太网中断函数。

其主要任务就是读取和分析数据包。

如果数据有效则在Tcpip_input()函数把数据发送出去,并在LWIP初始化创建的线程中就可以得到此消息。

然后通过ip_input()函数进入传输层后,再把把数据传到应用层。

具体流程如下图所示:以太网数据接收流程以太网数据发送流程为什么要选择DM9000网络驱动器呢?如今嵌入式中大量使用10/100M的以太网卡,实际上并不实用。

因为它不能既满足快速传输速率又满足成本控制。

这时,DM9000作为一种综合低成本的单一快速以太网控制芯片就有了很高的实用价值。

它具有通用的接口,设计简单,可满足不同系统的软件驱动。

DM9000程序的体系结构可以分为网络协议接口、设备接口层、功能层及媒介层。

下面是DM9000的部分驱动程序的编写。

定义DM9000:#include "config.h"#define DM_ADD (*((volatile unsigned short *) 0x20000300))#define DM_CMD (*((volatile unsigned short *) 0x20000304))#define Printf OSPrintfuint8 Buffer[1000]; //定义了一个1000字节的接收发送缓冲区uint8 host_mac_addr[6]= { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; //主机的MAC地址uint8 mac_addr[6] = { 0x0a, 0x1b, 0x2c, 0x3d, 0x4e, 0x5f }; //开发板{ 0a,1b,2c,3d,4e,5f },这实际上是一个软地址,在本设计中不需要特指。

uint8 ip_addr[4] = { 192, 168, 1, 6};uint8 host_ip_addr[4] = { 192, 168, 1, 100 };uint16 packet_len; //接收、发送数据包的长度,单位为字节uint8 arpsendbuf[60]={0xff,0xff,0xff,0xff,0xff,0xff, //以太网目标地址0x0a,0x1b,0x2c,0x3d,0x4e,0x5f, //以太网源地址0x08,0x06, //帧类型: ARP帧0x00,0x01, //硬件类型:以太网0x08,0x00, //协议类型:IP协议0x06, //硬件地址长度:6字节0x04, //协议地址长度:4字节0x00,0x00, //操作:ARP请求0x0a,0x1b,0x2c,0x3d,0x4e,0x5f, //发送端硬件地址192, 168, 1, 6, //发送端协议地址0x00,0x00,0x00,0x00,0x00,0x00, //接收端硬件地址192, 168, 1, 100 //接收端协议地址};#define DM9KS_ID 0x90000A46#define DM9KS_VID_L 0x28#define DM9KS_VID_H 0x29#define DM9KS_PID_L 0x2A#define DM9KS_PID_H 0x2B#define DM9KS_BASE_ADDR_ETH0 0x20000000//nGCS4#define DM9KS_Index (*((volatile unsigned short *)(DM9KS_BASE_ADDR_ETH0 + 0x300)))#define DM9KS_Data (*((volatile unsigned short *)(DM9KS_BASE_ADDR_ETH0 + 0x304)))接下是来对DM9000进行初始化的程序部分:void DM9000_init(void){uint32 i;//Test_DM9000AE();IOSetInit(); //设置中断EINIT7//初始化设置步骤: 1dm9000_reg_write(DM9000_GPCR, 0x01); //设置GPCR(1EH) bit[0]=1,使DM9000的GPIO3为输出。

相关文档
最新文档