移植UCOS II到X86 PC上之图文版
转:一步一步教你使用uCOS-II
转:⼀步⼀步教你使⽤uCOS-II第⼀篇 UCOS介绍第⼀篇 UCOS介绍这个⼤家都知道。
呵呵。
考虑到咱们学习的完整性还是在这⾥唠叨⼀下。
让⼤家再熟悉⼀下。
⾼⼿们忍耐⼀下吧! uC/OS II(Micro Control Operation System Two)是⼀个可以基于ROM运⾏的、可裁减的、抢占式、实时多任务内核,具有⾼度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。
为了提供最好的移植性能,uC/OS II最⼤程度上使⽤ANSI C语⾔进⾏开发,并且已经移植到近40多种处理器体系上,涵盖了从8位到64位各种CPU(包括DSP)。
uC/OS II可以简单的视为⼀个多任务调度器,在这个任务调度器之上完善并添加了和多任务操作系统相关的系统服务,如信号量、邮箱等。
其主要特点有公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。
内核属于抢占式,最多可以管理60个任务。
µC/OS-II 的前⾝是µC/OS,最早出⾃于1992 年美国嵌⼊式系统专家Jean brosse 在《嵌⼊式系统编程》杂志的5 ⽉和6 ⽉刊上刊登的⽂章连载,并把µC/OS 的源码发布在该杂志的B B S 上。
µC/OS 和µC/OS-II 是专门为计算机的嵌⼊式应⽤设计的,绝⼤部分代码是⽤C语⾔编写的。
CPU 硬件相关部分是⽤汇编语⾔编写的、总量约200⾏的汇编语⾔部分被压缩到最低限度,为的是便于移植到任何⼀种其它的CPU 上。
⽤户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件⼯具,就可以将µC/OS-II嵌⼈到开发的产品中。
µC/OS-II 具有执⾏效率⾼、占⽤空间⼩、实时性能优良和可扩展性强等特点,最⼩内核可编译⾄ 2KB 。
µC/OS-II 已经移植到了⼏乎所有知名的CPU 上。
实操性最强: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主要是放那些编译产生的乱七八糟的文件,为了使工程代码更加简洁。
uUOS教程第1章
第一章: 第一章:范例在这一章里将提供三个范例来说明如何使用 µC/OS-II。
笔者之所以在本书一开始就写 这一章是为了让读者尽快开始使用 µC/OS-II。
在开始讲述这些例子之前,笔者想先说明一 些在这本书里的约定。
这些例子曾经用 Borland C/C++ 编译器(V3.1)编译过,用选择项产生 Intel/AMD80186 处理器(大模式下编译)的代码。
这些代码实际上是在 Intel Pentium II PC (300MHz)上 运行和测试过,Intel Pentium II PC 可以看成是特别快的 80186。
笔者选择 PC 做为目标系 统是由于以下几个原因:首先也是最为重要的,以 PC 做为目标系统比起以其他嵌入式环境, 如评估板,仿真器等,更容易进行代码的测试,不用不断地烧写 EPROM,不断地向 EPROM 仿 真器中下载程序等等。
用户只需要简单地编译、链接和执行。
其次,使用 Borland C/C++产 生的 80186 的目标代码(实模式,在大模式下编译)与所有 Intel、AMD、Cyrix 公司的 80x86 CPU 兼容。
1.00 安装 µC/OS-II C/OS本书附带一张软盘包括了所有我们讨论的源代码。
是假定读者在 80x86,Pentium,或者 Pentium-II 处理器上运行 DOS 或 Windows95。
至少需要 5Mb 硬盘空间来安装 uC/OS-II。
请按照以下步骤安装: 1.进入到 DOS(或在 Windows 95 下打开 DOS 窗口)并且指定 C:为默认驱动器。
2.将磁盘插入到 A:驱动器。
3.键入 A:INSTALL 【drive】 注意『drive』是读者想要将 µC/OS-II 安装的目标磁盘的盘符。
INSTALL.BAT 是一个 DOS 的批处理文件,位于磁盘的根目录下。
它会自动在读者指定的 目标驱动器中建立\SOFTWARE 目录并且将 uCOS-II.EXE 文件从 A: 驱动器复制到\SOFTWARE 并 且运行。
uC_OS-II实验指导书
µC_OS-II实验指导书电子科技大学嵌入式软件工程中心北京科银京成技术有限公司目录第一部分实验系统简介及入门 (5)1 实验系统的目的 (5)2 实验系统的构成 (5)3 操作系统简介 (5)3.1 µC/OS-II概述 (5)3.2 µC/OS-II的特点 (6)3.3 µC/OS-II主要源代码文件介绍 (7)4 LambdaTOOL集成开发环境简介 (7)5 µC/OS-II实验内容简介 (8)5.1 任务管理实验 (8)5.2 优先级反转实验 (8)5.3 优先级继承实验 (9)5.4 哲学家就餐实验 (9)5.5 内存管理实验 (9)5.6 时钟中断实验 (9)5.7 消息队列实验 (9)6 预备实验:嵌入式开发环境的建立 (9)6.1 目的 (9)6.2 实验步骤及说明 (10)第二部分µC/OS-II实验 (24)实验1 任务的基本管理 (24)1 实验目的 (24)2 实验原理及程序结构 (24)2.1 实验设计 (24)2.2 操作系统配置 (25)2.3 源程序说明 (27)3 运行及观察应用输出信息 (29)4 本实验中所用到的µC/OS-II相关函数 (31)4.1 OSTaskCreate() (31)4.2 OSTaskSuspend() (31)4.3 OSTaskResume() (32)实验2 优先级反转 (33)1 实验目的 (33)2 原理及程序结构 (33)2.1 实验设计 (33)2.2 操作系统配置 (35)2.3 源程序说明 (36)3 运行及观察应用输出信息 (39)4 本实验中所用到的µC/OS-II相关函数 (39)4.1 OSSemCreate() (39)4.2 OSSemPend() (40)4.3 OSemPost() (40)4.4 OSTimeDly() (41)实验3 优先级继承 (42)1 实验目的 (42)2 原理及程序结构 (42)2.1 实验设计 (42)2.2 操作系统配置 (45)3 运行及观察应用输出信息 (46)4 本实验中所用到的µC/OS-II相关函数 (47)4.1 OSMutexCreate() (47)4.2 OSMutexPend() (47)4.3 OSMutexPost() (48)5 应用调试过程 (49)实验4 信号量:哲学家就餐问题的实现 (51)1 实验目的 (51)2 原理及程序结构 (51)2.1 实验设计 (51)2.2 操作系统配置 (52)3运行及观察应用输出信息 (53)4 本实验中所用到的µC/OS-II相关函数 (55)实验5 µC/OS-II的内存管理 (56)1 实验目的 (56)2 原理及程序结构 (56)2.1实验设计 (56)2.2 操作系统配置 (62)3 本实验中所用到的µC/OS-II相关函数 (63)3.1 OSMemCreate() (63)3.2 OSMemGet() (64)3.3 OSMemPut() (64)3.4 OSMemQuery() (65)实验6 时钟中断 (66)1 实验目的 (66)2 原理及程序结构 (66)2.1 实验设计 (66)2.2 操作系统配置 (68)3 运行及观察应用输出信息 (70)4 本实验中所用到的µC/OS-II相关函数 (71)实验7 消息队列 (72)1 实验目的 (72)2 原理及程序结构 (72)2.1 实验设计 (72)2.2 源程序说明 (72)2.3 操作系统配置 (77)3 运行及观察应用输出信息 (78)4 本实验中所用到的µC/OS-II相关函数 (82)4.1 OSQCreate() (82)4.2 OSQPend() (82)4.3 OSQPostFront() (83)4.4 OSQPost() (83)4.5 OSQFlush () (84)4.6 OSQQuery() (84)4.7 OSQDel() (85)4.8 OSTimeDlyHMSM() (85)第一部分实验系统简介及入门1 实验系统的目的通过此实验系统,读者可以了解嵌入式实时操作系统µC_OS-II的内核机制和运行原理。
五、ucos-II的移植-智能嵌入技术开发与实践-佟国香-清华大学出版社
11
Intel/AMD 80186 Motorola 68HC11
\SOFTWARE\uCOS-II\Ix86S \OS_CPU.H \OS_CPU_A.ASM \OS_CPU_C.C \SOFTWARE\uCOS-II\Ix86L \OS_CPU.H \OS_CPU_A.ASM \OS_CPU_C.C \SOFTWARE\uCOS-II\68HC11 \OS_CPU.H \OS_CPU_A.ASM \OS_CPU_C.C
➢ uC/OS-II的全部源代码量大约是6000-7000行,一共有15 个文件。将 uC/OS-II 移植到ARM处理器上,需要完成的工 作也非常简单,只需要修改三个和ARM体系结构相关的文件 ,代码量大约是500行。
14
移植工作
如果处理器和编译器满足了μC/OS-Ⅱ的要求,并 且已经有了必要工具。移植工作包括以下几个内容: (1)用#define设置一些常量的值(OS_CPU.H) (2)声明10个数据类型(OS_CPU.H) (3)用#define声明三个宏(OS_CPU.H) (4)用C语言编写六个简单的函数(OS_CPU_C.C) (5)编写四个汇编语言函数(OS_CPU_A.ASM)
7
处理器支持硬件堆栈
COS-II进行任务调度的时候,会把当前任 务的CPU寄存器存放到此任务的堆栈中,然后, 再从另一个任务的堆栈中恢复原来的工作寄存器 ,继续运行另一个任务。所以,寄存器的入栈和 出栈是COS-II多任务调度的基础。
处理器中有专门的指令处理堆栈,可以灵活 的使用堆栈。
uCOS2中文手册第9章
µC/OS-II在80x86上的移植本章将介绍如何将µC/OS-II移植到Intel 80x86系列CPU上,本章所介绍的移植和代码都是针对80x86的实模式的,且编译器在大模式下编译和连接。
本章的内容同样适用于下述CPU:80186802868038680486PentiumPentium II实际上,将要介绍的移植过程适用于所有与80x86兼容的CPU,如AMD,Cyrix,NEC (V-系列)等等。
以Intel的为例只是一种更典型的情况。
80x86 CPU每年的产量有数百万,大部分用于个人计算机,但用于嵌入式系统的数量也在不断增加。
最快的处理器(Pentium系列)将在2000年达到1G的工作频率。
大部分支持80x86(实模式)的C编译器都提供了不同的内存使用模式,每一种都有不同的内存组织方式,适用于不同规模的应用程序。
在大模式下,应用程序和数据最大寻址空间为1Mb,程序指针为32位。
下一节将介绍为什么32位指针只用到了其中的20位来寻址(1Mb)。
本章所介绍的内容也适用于8086处理器,但由于8086没有PUSHA指令,移植的时候要用几条PUSH指令来代替。
图F9.1显示了工作在实模式下的80x86处理器的编程模式。
所有的寄存器都是16位,在任务切换时需要保存寄存器内容。
图F9.1 80x86 实模式内部寄存器图.80x86提供了一种特殊的机制,使得用16位寄存器可以寻址1Mb地址空间,这就是存储器分段的方法。
内存的物理地址用段地址寄存器和偏移量寄存器共同表示。
计算方法是:段地址寄存器的内容左移4位(乘以16),再加上偏移量寄存器(其他6个寄存器中的一个,AX,BP,SP,SI,DI或IP)的内容,产生可寻址1Mb的20位物理地址。
图F9.2表明了寄存器是如何组合的。
段寄存器可以指向一个内存块,称为一个段。
一个16位的段寄存器可以表示65,536个不同的段,因此可以寻址1,048,576字节。
UCOSII移植过程及心得
UCOSII V2.86在LPC2378上的移植(编译器ADS1.2)忙了几天,终于移植成功了。
移植UCOS需要准备一些东西,首先当然是OS源代码,再就是选定编译器,需要弄清一下几点:1、UCOS需要移植的内容2、编译器的特性(在这里主要是ATPCS)3、处理器的特性(这里主要注意ARM7的模式)以下先简要说一下这几点,为后面的程序说明做准备首先说说第一点,UCOS需要移植的内容。
1、数据类型的定义,这个根据平台来处理。
具体代码如下:2、任务切换函数,就是两个任务环境之间的切换。
3、处理临界代码前要关闭中断,之后再打开,这个实现的方法与平台关系很大。
4、栈的初始化,栈中保存的是任务的运行环境,不同的处理器中的寄存器自然是不一样的。
5、还有一个和任务切换差不多的,这个函数只运行一次,就是将第一个运行的任务的运行环境复制到CPU中。
再说说编译器的特性,ATPCS规定(想要详细一些的可以看看ADS 的帮助文档):R0-R3用来传递参数,R4-R12用来处理局部变量。
这个在处理汇编和C的接口时十分重要。
最后是CPU的特性。
ARM7有7种模式,但是有些模式对于UCOS在ARM7上的运行用处不大,经过综合考虑,可以只使用四种模式:SVC:运行OS代码和用户代码SYS:用于IRQ的嵌套处理,(暂时还未实现)IRQ:处理中断,处于OS的控制范围内FIQ:独立于操作系统,处理快速中断有了上面的说明,下面可以具体讨论了,因为网页中显示代码及注释不方便,所以把它们放在了附件中。
标题中前面是内容,括号内是涉及到的需要移植的函数1、任务栈(OSTaskStkInit)任务栈相当于CPU的一个备份,可以这样认为,当运行一个任务时,将栈中的数据复制到CPU中,由于某种原因停止运行一个任务时将CPU复制到任务栈中。
ARM7的CPU需要保存的寄存器如下:PC任务断点LRR12R11R10R9R8R7R6R5R4R3R2R1R0CPSR还有一个栈指针SP,这个保存在任务控制块中。
实验一 uCOS-II的移植
实验一uC/OS-II的移植1.实验目的(1)理解uCOS-II实时内核的工作原理;(2)熟悉uCOS-II在XS128上的移植过程;(3)掌握uCOS-II移植的细节。
2.实验任务(1)观察示例程序中的代码,体会实时操作系统与前后台程序的不同之处。
(2)完成由前后台程序编程到基于实时操作系统编程的思想转变。
3.预习要求(1)参考《嵌入式实时操作系统uCOS-II》(第2版),熟悉uCOS-II各模块的基本工作原理。
(2)参考《单片机与嵌入式系统开发方法》第9章内容以及《uCOS-II移植说明文档》。
熟悉uCOS-II在XS128上的移植过程。
4.实验步骤(1)打开示例程序,观察程序结构。
(2)识别出哪些是与硬件无关的文件,哪些是移植需要修改和添加的文件。
(3)打开OS_CPU.H文件,该文件定义CPU的数据类型,定义相关的宏。
打开OS_CPU_C文件,分析文件里各个函数的作用。
这两个文件是与CPU特性有关的文件。
(4)分别打开OS_CFG.H, INCLUDES.H. OS_CFG.H这三个文件,了解这三个文件的作用。
用户根据自己的应用系统来定制合适的内核服务功能.包括两个文件:OS_CFG.H, INCLUDES.H. OS_CFG.H是来配置内核, 用户根据需要对内核进行定制, 留下需要的部分, 去掉不需要的部分, 设置系统的基本情况. 比如系统可提供的最大任务数量, 是否定制邮箱服务, 是否需要系统提供任务挂起功能, 是否提供任务优先级动态改变功能等等;头文件INCLUDES.H为整个实时系统程序所需要的文件,包括了内核和用户的头文件。
(5)修改.prm文件中的中断向量,将其中的ROM_C000 = READ_ONLY DATA_NEAR IBCC_NEAR 0xC000 TO 0xFEFF;改为ROM_C000 = READ_ONLYDATA_NEAR IBCC_NEAR 0xC000 TO 0xEEFF;将结尾处原有的VECTOR 0 _Startup;改为VECTOR ADDRESS 0xEFFE _Startup;再添加上VECTOR ADDRESS 0xEFF6 OSCtxSw;VECTOR ADDRESS 0xEFF0 OSTickISR两个中断向量。
一步步移植uCOS-IIandLwIP(一)
一步步移植uCOS-IIandLwIP(一)STM32F103ZE下移植uCOS-II and LwIP 汇总本文主要记录嵌入式实时操作系统uCOS-II(Ver 2.85)和轻量型TCP/IP协议栈LwIP(Ver 1.4.1)在32bit单片机STM32F103ZE上的移植过程,并列举几个simple examples说明两者工作原理。
本文的叙述原则是“用到什么知识点,就查阅相关资料”,对于其它延伸知识点不再概述。
所需物资:- 硬件开发平台,本平台网卡为DM9000A- uCOS-II(Ver 2.85)源码,可直接从Micrium官网下载uCOS 在cortex-M3上的移植例程uCOSII-ST-STM32F103ZE-SK - LwIP(Ver 1.4.1)源码,下载链接LwIP1.4.1一、Lwip移植TCP/IP协议分为网络链路层、网络层、传输层和应用层四个部分,网络链路层主要涉及底层硬件驱动的编写,另外三个上次协议一般采用协议栈的方式软件实现。
要实现与其它网络设备通信,首当其冲的是要移植好底层网卡驱动。
LwIP协议栈已经为我们提供了网络链路底层接口,我们要做到主要工作涉及到以下几个方面:- 单片机与网卡DM9000芯片的通信;- 完善LwIP协议栈文件ethernetif.c接口函数,该部分的难点在于实现LwIP规定的struct pbuf类型的数据包与网卡数据之间相互转换;- 上层软件协议的simple explain;1、网卡DM9000底层驱动的编写首先查阅DM9000的Datasheet(建议直接从芯片官网上查找,一般会有该芯片的Application note or Demo)本文主要是运用DM9000的16-bit mode,其总线形式类似与intel 8080总线,涉及读写指令和数据的控制引脚为CS#、IOW#、IOR#、CMD,数据总线引脚SD0~SD15,中断引脚INT。
基于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文件结构示意图并以足够快的速度响应,其处理的结果又能够在规定的时间内输出,并控制所有实时任务协调、一致运行。
VC环境下UCOS-II移植
1VC下时钟的获得《嵌入式实时操作系统uC/OS-II》这本书已经安排了大量篇幅来专门讲解uC/OS-II的移植:第13章移植uC/OS-II,第14章uC/OS-II在80x86上的移植,第15章uC/OS-II在带有硬件浮点运算单元的80x86上的移植。
所以本文只是重点讲解移植到VC下和其他处理器上的不同地方,更详细的介绍读者可以参考《嵌入式实时操作系统uC/OS-II》这本书。
和所有其他的移植一样,本文所做的移植也只需要修改uC/OS-II处理器相关代码,一共包括3个文件:OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C。
考虑到VC可以嵌入汇编代码,并不需要专门的汇编代码文件,所以OS_CPU_A.ASM是多余的,最终只有OS_CPU.H和OS_CPU_C.C两个文件。
所以这两个文件成了移植的关键,首先要解决的问题就是时钟“滴答”的获得。
移植到BC下的uC/OS-II是通过修改DOS下的硬件时钟中断来得到时钟滴答的,VC下时钟滴答从哪里来呢?这是移植uC/OS-II到VC下第一个要考虑的问题。
在windows的保护模式下不能像DOS下面那么容易,直接通过一个函数调用就能够修改中断。
windows下要修改中断涉及到驱动程序,这样就加大了移植的困难度与复杂度,但好处是只有真正硬件时钟的“滴答”才能够保证uC/OS-II的实时性。
另外一种解决方法是采用windows下的软件定时器,通过定时器来产生模拟时钟“滴答”。
考虑到本移植只是为了教学和学习,并没有应用到对实时性要求高的产品,所以最终决定采用软件定时器来模拟时钟中断。
Windows下软件定时器种类很多,下面分别简要介绍一下这些定时器:1.SetTimer()函数有windows下编程经验的最先想到的应该是SetTimer这个API函数,但本文采用的移植程序是基于控制台的,也就是说最开始建立VC工程的时候选择的是创建win32 console application,控制台下的程序是没有消息循环的,所以要使用SetTimer函数则必须再创建一个线程来专门处理消息循环,这样一来事情就复杂了,而且这个函数定时精度非常不高。
一步步移植uCOS-IIandLwIP(四)
一步步移植uCOS-IIandLwIP(四)二、uCOS-II移植嵌入式实时操作系统uCOS-II移植的核心在于任务切换时上下文环境的保存及恢复,针对Cortex-M3内核的单片机,其采用了PendSVHandler中断处理的方式解决这一核心问题。
我们要做的就是在任务切换及中断任务切换过程中开启触发PendSV中断,并在PendSVHandler中实现上下文环境的切换,即保存CPU内部寄存器值和恢复切换任务的相关信息。
为什么要使用PendSV中断实现上下文切换呢?参阅Cortex-M3的一段话。
另一个相关的异常是PendSV(可悬起的系统调用),它和SVC 协同使用。
一方面,SVC异常是必须在执行SVC指令后立即得到响应的(对于SVC异常来说,若因优先级不比当前正处理的高,或是其它原因使之无法立即响应,将上访成硬fault——译者注),应用程序执行SVC时都是希望所需的请求立即得到响应。
另一方面,PendSV则不同,它是可以像普通的中断一样被悬起的(不像SVC那样会上访)。
OS可以利用它“缓期执行”一个异常——直到其它重要的任务完成后才执行动作。
悬起PendSV 的方法是:手工往NVIC的PendSV悬起寄存器中写1。
悬起后,如果优先级不够高,则将缓期等待执行。
PendSV的典型使用场合是在上下文切换时(在不同任务之间切换)。
例如,一个系统中有两个就绪的任务,上下文切换被触发的场合可以是:- 执行一个系统调用-系统滴答定时器(SYSTICK)中断,(轮转调度中需要)让我们举个简单的例子来辅助理解。
假设有这么一个系统,里面有两个就绪的任务,并且通过SysTick异常启动上下文切换。
如图所示。
上图是两个任务轮转调度的示意图。
但若在产生SysTick 异常时正在响应一个中断,则SysTick异常会抢占其ISR。
在这种情况下,OS 是不能执行上下文切换的,否则将使中断请求被延迟,而且在真实系统中延迟时间还往往不可预知——任何有一丁点实时要求的系统都决不能容忍这种事。
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
uCOS-II移植总结
u C/OS-II移植总结RTOS移植牵涉到软件平台—编译器、硬件平台—CPU,移植前需要了解CPU及编译器的一些基本特点。
1、编译器a、堆栈运行原理本次移植的软件平台为CodeVision编译器,它的堆栈由两部分组成:硬件堆栈(HardStack)用来保存中断及函数调用的返回地址,它的大小将影响函数调用嵌套的深度,实际大小应根据中断及函数嵌套的深度来决定,并留有一定的裕度。
硬件堆栈由CPU中的指针SP实现。
软件堆栈(SoftStack)用来分配局部变量及传递参数。
在此次移植中,由CPU中的Y指针模拟实现。
b、堆栈指针所指向的单元是否为可用单元大多数编译器生成的代码,其堆栈指针所指向的单元为可用单元,也就是说在将数据压入堆栈前不用再调整堆栈指针,堆栈指针在上一次使用完后已经调整好了。
前面所说的硬件堆栈(HardStack)即为这种类型。
还有一种堆栈,其指针所指向的单元为不可用单元,在向堆栈压入数据前需调整堆栈指针,软件堆栈(SoftStack)即为这种类型。
软件堆栈设计为这种形式完全是为了适应A VR指令和软件堆栈增长方向与硬件堆栈增长方向相同。
软件堆栈(SoftStack)由Y指针模拟实现,但在A VR的指令集中只有:LD Rd,Y+ LD Rd,–Y ST Y+,Rr ST –Y,Rr要实现向下增长的堆栈就只能使用ST –Y,Rr和LD Rd,Y+。
指针指向的单元已压入数据,因此使用前需调整指针,而ST –Y,Rr正好能完成这个动作。
c、多字节变量在宽度为单字节的存储器中的分配规则多字节变量指定义为int、long int、float、double等类型的变量。
在CodeVision编译器遵循的原则是:变量低字节部分分配在内存的低地址单元,变量高字节部分分配在内存高地址单元。
如:int a a为双字节变量,其低字节保存在内存的0x24H,则高字节保存在内存的0x25H。
了解这些变量在内存中存储形式是为了能够在在线汇编中正确操作它们。
Win7下μCOS II安装调试指南(带详细图解说明)
μC/OS II安装调试指南(带图解说明)使用的工具文中的开发工具及开发包如下:* 开发包:μC/OS 2.51,文件名为BC31.rar* 文中开发工具:Borland C 3.1,文件名为SOFTWARE.rar所有相关工具在此处下载/folder/fetcxypq#其中开发工具是专门为编译μC/OS Ⅱ精简的。
首先,解压开发包和BC31到某个盘的根目录,记得一定是磁盘根目录,不能解压到次级文件夹,否则需要改动很多的文件,此处不再详说。
此处以解压到E盘根目录下为例。
正确解压后,目录结构应该如下所示:Borand C 3.1精简版的目录结构如下:E:\BC31|-----\bin|-----\include|-----\libμC/OS目录结构如下:E:\SOFTWARE|-----BLOCKS|-----TO|-----uCOS-II所需修改的文件如下:BC3.1的修改E:\BC31\BIN下的TLINK.CFGE:\BC31\BIN下的TURBOC.CFGsoftware(即μC/OS源代码)的修改1 E:\SOFTWARE\uCOS-II\EX1_x86L\BC45\SOURCE下的TEST.LNK2 E:\SOFTWARE\uCOS-II\EX1_x86L\BC45\TEST下的MAKETEST.BAT3 E:\SOFTWARE\uCOS-II\EX1_x86L\BC45\TEST下的TEST.MAK注:E:\SOFTWARE\uCOS-II\下其它例程,同样按照上述3条修改。
具体修改内容如下:说明,以下文字中红色标记内容为需要修改的内容。
未提到的地方保持默认,请勿修改。
此处以解压到E盘目录为例,进行修改,其他用户按照自己的路径修改即可。
BC3.1的修改:1.TLINK.CFGTLINK.CFG文件内容如下:-L E:\BC31\LIB2.TURBOC.CFGTURBOC.CFG文件内容如下:-I E:\BC31\INCLUDE-L E:\BC31\LIBsoftware(即μC/OS源代码)的修改1.E:\SOFTWARE\uCOS-II\EX1_x86L\BC45\SOURCE下的TEST.LNK TEST.LNK文件内容如下:/v /s /c /P- +E:\BC31\LIB\C0L.OBJ +..\OBJ\TEST.OBJ +..\OBJ\OS_CPU_A.OBJ +..\OBJ\OS_CPU_C.OBJ +..\OBJ\PC.OBJ +..\OBJ\uCOS_II.OBJ..\OBJ\TEST,..\OBJ\TESTE:\BC31\LIB\EMU.LIB +E:\BC31\LIB\MATHL.LIB +E:\BC31\LIB\CL.LIB2.E:\SOFTWARE\uCOS-II\EX1_x86L\BC45\TEST下的MAKETEST.BATMAKETEST.BAT文件内容如下,因为MAKETEST.BAT内容较多,不一一列出,只列出需要修改部分的代码,其他代码保持默认。
uCOS平台下的LwIP移植(非常详细)
1 下载LwIP.................................................................................................................................................................22 建立一个最基本的工程 (2)3 把LwIP加入工程 (2)4 编写操作系统模拟层相关代码 (3)4.1 操作系统模拟层移植说明――中文翻译 (3)4.2 编写操作系统模拟层 (6)4.2.1 准备工作――建立文件、定义数据类型及其它 (6)4.2.2 信号量操作函数 (8)4.2.3 邮箱操作函数 (13)4.2.4 实现sys_thread_new()函数 (20)4.2.5 实现sys_arch_timeouts()函数 (22)4.2.6 实现临界保护函数 (25)4.2.7 扫尾――结束操作系统模拟层的编写 (26)5 LwIP接口――初始设置及网络驱动 (28)5.1 准备工作――建立LwIP入口函数文件 (28)5.2 ilvInitLwIP() (29)5.3 ilvSetLwIP() (30)5.4 ethernetif_init()――初始化底层界面 (35)5.4.1 ethernetif_init()函数分析 (35)5.4.2 low_level_output()――链路层发送函数 (36)5.4.3 low_level_init()――网卡初始化函数 (38)5.4.4 EMACInit()――网卡初始化工作的实际完成者 (40)5.4.5 ethernetif_input()――实现接收线程 (47)5.4.6 low_level_input()――得到一整帧数据 (49)5.4.7 GetInputPacketLen()――获得帧长 (50)5.4.8 EMACReadPacket()――复制,从接收缓冲区到pbuf (53)5.4.9 EMACSendPacket()――发送一帧资料 (55)5.4.10 编译――ethernetif.c及lib_emac.c (56)6 ping――结束LwIP的移植 (57)6.1 编译、链接整个工程 (57)6.2 ping测试 (59)后记 (62)本文将指导读者一步步完成LwIP 在ADS1.2 开发环境下的移植工作,包括底层驱动的编写。
TMS320F28335的uC-OSⅡ移植
TMS320F28335的uC-OSⅡ移植TMS320F28335的uC-OSⅡ移植1、 uC-OSII 的原理uC-OSII 包括任务调度、时间管理、内存管理、资源管理(信号量、邮箱、消息队列)四大部分,没有文件系统、网络接口、输入输出界面。
它的移植只与4 个文件相关:汇编文件(OS_CPU_A.ASM)、处理器相关C 文件(OS_CPU.H、OS_CPU_C.C)和配置文件(OS_C FG.H)。
有64 个优先级,系统占用8 个,用户可创建56 个任务,不支持时间片轮转。
它的基本思路就是“近似地每时每刻总是让优先级最高的就绪任务处于运行状态”。
为了保证这一点,它在调用系统API 函数、中断结束、定时中断结束时总是执行调度算法。
原作者通过事先计算好数据,简化了运算量,通过精心设计就绪表结构,使得延时可预知。
任务的切换是通过模拟一次中断实现的。
uC-OSII 工作核心原理是:近似地让最高优先级的就绪任务处于运行状态。
操作系统将在下面情况中进行任务调度:调用API 函数( 用户主动调用), 中断( 系统占用的时间片中断OsTimeTick(),用户使用的中断)。
其整体整体思路如下。
(1)、在调用API 函数时,有可能引起阻塞,如果系统API 函数察觉到运行条件不满足,需要切换就调用OSSched()调度函数,这个过程是系统自动完成的,用户没有参与。
OSSched()判断是否切换,如果需要切换,则此函数调用OS_TASK_SW()。
这个函数模拟一次中断,好象程序被中断打断了,其实是OS 故意制造的假象,目的是为了任务切换。
既然是中断,那么返回地址(即紧邻OS_TASK_SW()的下一条汇编指令的PC 地址)就被自动压入堆栈,接着在中断程序里保存CPU寄存器(PUSHALL)……。
堆栈结构不是任意的,而是严格按照uC-OSII 规范处理的。
OS 每次切换都会保存和恢复全部现场信息(POPALL),然后用RETI 回到任务断点继续执行。
使用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嵌入式操作系统介绍与移植
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
移植UCOS II到X86 PC上一、关于软件的安装及环境设置
安装编译软件BORLAND C++ 4.5:
1.打开borland c 4.5
2.
3.
5.C、D、E、F、G均可(建议C盘)——continue
6.什么都不用改继续往下,直到安装完毕
7.这两个文件夹
安装汇编编译软件TASM5.0,安装路径位于C:\TASM,此软件用于UCOS II中的汇编文件的编译:
1.install
3.ENTER
4.
5.光标处输入你的TASM5.0安装文件夹所在地磁盘盘符,比如我的在D盘,输入D,按ENTER
7.ENTER
8.将下图的D:\TASM改为C:\TASM(必须)
9.F9开始安装
在“我的电脑--->属性--->高级--->环境变量--->弹出“环境变量”--->在“用户变量”列表中找到path,在变量值末尾添加“;C:\TASM\BIN;”,软件的安装及环境的初步设置就已完成了。
二、移植过程
2.1 建立文件夹(利用文件夹里自带的那个UCOS_II就行:删掉里面的其他东东,只留下里面的三个文件夹,如下图)
注意备份一下这个东东,防止以后更改错了又不知道怎么改回去,可以把它复制到MY DOCUMENTS里面做学习之用
解释如下:
APP(存储应用相关的代码)
CORE(存储uC/OS II内核代码)
MGT(存储与硬件相关的移植代码)
2.2 在BORLAND C++ 4.5中建立工程
2.2.1 创建新工程
●在“Project path and name”中指定工程路径——点Browse选择(文件名可自定如TEST.IDE)●在“Target Type”下选择“Application[.exe]”;
●在“PlatForm”下选择“DOS[Standard];
●在“Target Modet”下选择“Large”;
●在Advanced里勾选第三个,不自动新建.CPP;
●OK。
2.2.2添加文件
1)将以下5个文件添加到工程中:
●TEST.C(在APP中)
●OS_CPU_C.C(在MGT中)
●OS_CPU_A.ASM(在MGT中)
●uCOS_II.C(在CORE中)
●PC.C(在APP中)
2.3 编译
2.3.1这些是老师写的,就是说在一些文件中的预编译指令中包含了一些头文件,编译器可能找不到而出现ERROR,但是老师都已经改过了,我们就不用再改了(直接用我写的2.3.2就行了)尝试编译,会提示错误。
因为重新建立了APP、CORE、MGT目录,编译器会找
不到一些文件。
修改代码中的文件引用即可解决。
例如:
修改为:
即应该能够让编译器找到头文件,上述app\os_cfg.h这种写法应该是工程文件与app在同一文件夹下,否则应改之
再编译就没有问题了,移植成功了。
如果还有错误还需要依次排除。
运行成功后的界面如下。
2.3.2 添加完后全选五个文件如下图:
1.
2. 单个编译会报错
3.会出现警告,不过不用理会
4.再点Build all
5.运行
6.大功告成!!!
三、更改test.c文件
用记事本打开APP里面的TEST.C文件,就可以随心所欲的编写自己的UCOS_II操作系统了。