嵌入式操作系统μCoS-Ⅱ的移植
- 格式:pdf
- 大小:174.77 KB
- 文档页数:4
前言:说点废话,网上有很多关于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主要是放那些编译产生的乱七八糟的文件,为了使工程代码更加简洁。
uC/OS-II是源码开放、可固化、可移植、可裁剪、可剥夺的实时多任务OS 内核,适用于任务多、对实时性要求较高的场合。
uC/OS-II适合小型系统,具有执行效率高、占用空间小、实时性优良和可扩展性等特点,最小内核可编译至2K。
uC/OS-II内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能。
所谓RTOS移植,就是使一个实时内核能在某个微处理器或微控制器上运行。
大部分的uC/OS-II代码试用C写的,但仍需要用C和ASM写一些与处理器相关的代码,这是因为uC/OS-II在读写处理器寄存器时只能通过ASM实现。
要是uC/OS-II正常运行,处理器必须满足一定的条件:处理器的C编译器能产生可重入代码;用C语言就可以打开和关闭中断;处理器支持中断,并能产生定时中断;处理器支持能够容纳一定量数据的硬件堆栈;处理器有将SP和其他CPU reg读出和存储到堆栈或内存中的指令;uC/OS-II移植工作主要包括以下三个方面的内容:(1)修改与处理器核编译器相关的代码:主要在includes.h中,修改数据类型定义说明,OS_ENTER_CRITICAL()、OS_EXIT_CRITICAL()和堆栈增长方向定义OS_STK_GROWTH。
(2)用C语言编写10个移植相关的函数:主要在OS_CPU_C.C中,包括堆栈初始化OSTaskStkInit()和各种回调函数。
(3)编写4个汇编语言函数:主要在OS_CPU_A.ASM中,包括:_OSTickISR //时钟中断处理函数_OSIntCtxSW //从ISR中调用的任务切换函数_OSCtxSW //从任务中调用的任务切换函数_OSStartHighRdy //启动最高优先级的任务uC/OS-II移植的关键问题:(1)临界区访问:uC/OS-II需要先禁止中断再访问代码临界段,并且在访问完毕后重新允许中断,这就使得uC/OS-II能够保护临界段代码免受多任务或ISR的破坏。
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 协议栈进行一定的裁减。
实验一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-II(中文版)第一章:范例在这一章里将提供三个范例来说明如何使用µ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本书附带一张软盘包括了所有我们讨论的源代码。
是假定读者在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并且运行。
第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文件结构示意图并以足够快的速度响应,其处理的结果又能够在规定的时间内输出,并控制所有实时任务协调、一致运行。
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函数则必须再创建一个线程来专门处理消息循环,这样一来事情就复杂了,而且这个函数定时精度非常不高。
μCOS嵌入式操作系统实验指导书说明《嵌入式系统及应用实验指导书》包含:嵌入式开发板的硬件结构与u-boot基本命令、uClinux的多任务机制及其编程、uClinux的内存管理机制及其编程、在51单片机上移植μC/OS-II和在ARM7单片机上移植μC/OS-II 实验指导,适合电子与信息类专业的学生学习使用。
目录实验一嵌入式开发板的硬件结构与U-BOOT基本命令 (1)实验二UCLINUX的多任务机制及其编程 (6)实验三UCLINUX的内存管理机制及其编程 (9)实验四在51单片机上移植ΜC/OS-II (17)实验五在ARM7单片机上移植ΜC/OS-II (21)实验一嵌入式开发板的硬件结构与u-boot基本命令一、实验目的1、能够使用Embest IDE for ARM集成开发环境及ARM软件模拟器;2、通过实验掌握u-boot基本命令。
二、实验原理Bootloader代码是器件复位后进入操作系统前执行的一段代码,通过该代码初始化处理器各寄存器和片上外设,建立存储器映射图以及初始化堆栈,从而为操作系统提供基本的运行环境。
由于Bootloader与CPU和开发板配置有关,不可能有通用的Bootloader,因此需要根据具体情况进行移植。
嵌入式系统U-boot是当前流行、功能强大的Bootloader。
U-Boot用于多种嵌入式CPU的Bootloader程序,U-Boot支持ARM、PowerPC等多种架构的处理器,也支持Linux、NetBSD和Vx—Works等操作系统。
这里采用U—Boot 的版本为U-boot-1.1.6。
(1)U-Boot目录结构U-Boot目录结构如下:board是一些与现有开发板有关的文件,比如makefile和u-boot.1ds等都与具体开发板的硬件和地址分配有关;common 是与体系结构无关的文件,可实现各种命令的C文件;cpu是CPU相关文件,其子目录都是以U-boot支持的CPU命名,比如子目录arm920t,mips,s3e44bO 和nios等,每个特定的子目录都包括cpu.c,interrupt.C和start.s;doc是说明文档;drivers是通用设备驱动程序,比如:各种网卡、支持CFI的Flash 和USB总线等;fs是支持文件系统的文件,U—Boot可支持cramfs,fat,fdos,jffs2等文件;net是与网络有关的代码,比如:BOOTP协议、TFTP协议和NFS文件系统的实现;lib_arm是与ARM体系结构相关的代码;tools 是创建S-Record的格式文件和U-Boot images的工具。