基于STM32的uCOS-II系统移植
- 格式:doc
- 大小:5.34 MB
- 文档页数:17
一、资料下载1、下载uC/OS-II V2.91。
下载页:/page/downloads/source_code2、下载Micrium官方移植版本Micrium-ST-uCOS-II-LCD-STM32.exe。
该官方移植版使用的是uC/OS-II v2.86和STM32 v2.0版标准外设驱动,下载他的目的是提取其中已移植好的部分代码。
(自己google)3、下载STM32标准外设驱动库stm32f10x_stdperiph_lib3.5.zip。
下载地址:/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE /stm32f10x_stdperiph_lib.zip二、准备工作1、建立如下目录结构2、准备文件1)复制STM32F10x_StdPeriph_Lib_V3.5.0 文件夹中的Libraries文件夹。
2)复制Micrium-ST-uCOS-II-LCD-STM32\Micrium\Software\uCOS-II\Ports\ARM-Cortex-M3\Generi c\RealView 中的os_cpu.h、os_cpu_a.asm、os_cpu_c.c到ucos-ii(v2.91_for_STM32)\Port 中。
在os_cpu_c.c中添加:void OSTaskReturnHook (OS_TCB *ptcb){}并注释掉void OS_CPU_SysTickHandler (void)和OS_CPU_SysTickInit() 函数。
修改os_cpu_a.asm文件:41行:EXPORT PendSV_Handler203行:PendSV_Handler3)复制Micrium-uCOS-II-V290\Micrium\Software\uCOS-II\Source 中的os_dbg_r.c到ucos-ii(v2.91_for_STM32)\Port 中,并重命名为os_dbg.c。
stm32f103 ucos ii移植目录stm32f103 ucos ii移植 (1)1.1 ucOS源码获得 (1)1.2 移植步骤 (5)1.2.1 裸机工程准备 (5)1.2.2 复制相关ucos 移植文件 (5)1.2.3 添加ucos源码和移植cpu相关源码。
(6)1.2.4 添加ucos源码和移植cpu相关头文件路径 (14)1.2.5 编译纠错 (15)1.2.6 修改裸机的main()函数,实现ucos编程模板。
(22)1.2.7测试系统是否能正常工作。
(30)1.3附录相关源码工程 (31)1.1ucOS源码获得登陆ucos官方网站/,如下所示:点击网站上方的Login/Registration ,进行登陆或注册一个新帐号。
如果没有帐号要先注册一个,注册过程不再描述。
我已经有帐号,直接登陆。
Xin Ying Da Electronics Co., Ltd. 1 / 32ZHIFA CHENXin Ying Da Electronics Co., Ltd.2 / 32 ZHIFA CHEN点击后转入登陆界面,网址是/wp-login.php , 直接输入这个进行登陆也可以,界面如下:在这个界面中输入用户名和密码,点击Log In,即可以进入,登陆后可以下载网站上的免费资源。
Xin Ying Da Electronics Co., Ltd. 3 / 32ZHIFA CHEN点击上面的“Downloads Center ”,进入下载页面。
点击” STMicroelectronics ” ,进入ST 公司芯片的ucos 工程下载页面。
点击上面的下载图标后,可以下载到ucos 工程代码,名字是Micrium_STM32xxx_uCOS-II.exe ,这是一个自解Xin Ying Da Electronics Co., Ltd.4 / 32 ZHIFA CHEN压的文件,双击解压。
a COSII在STM32处理器上的移植目前,嵌入式技术已被广泛应用到汽车电子、无线通信、数码产品等各个领域。
嵌入式操作系统及嵌入式处理器技术发展迅猛,嵌入式操作系统典型代表有aCOS—II 、aClinux 、Winclow CE、VxWorks 等;嵌入式处理器包括ARM、MIPS PowerPC等。
随着软硬件技术的发展,人们开始意识到基于嵌入式操作系统的程序开发模式的便利性及可靠性,并且在程序开发过程中开始倾向于从传统超循环开发模式转向基于嵌入式操作系统的开发模式。
1软硬件开发环境及处理器介绍1.1 软件硬开发环境本移植过程使用的软件环境是RealView MDK开发套件,此产品是ARM公司最新推出的针对各种嵌入式处理器的软件开发工具,该开发套件功能强大,包括了aVision3 集成开发环境和RealView 编译器。
使用的硬件平台是深圳英蓓特公司推出的全功能评估板STMI03V100,其上所采用的处理器是ST意法半导体公司生产的32位哈佛结构ARM处理器STM32F1O3VBT0该处理器内置ARM公司最新的Cortex —M3核,并且具有非常丰富的片上资源。
1.2关于基于Cortex-M3的ARM处理器的介绍基于Cortex —M3核的ARM处理器支持两种模式,分别称为线程模式和处理模式。
程序可以在系统复位时或中断返回时两种情况下进入线程模式,而处理模式只能通过中断或异常的方式来进入。
处于线程模式中代码可以分别运行在特权方式下和非特权方式下。
处于处理模式中的代码总是运行在特权方式下。
运行在特权方式下的代码对系统资源具有完全访问权,而运行在非特权方式下的代码对系统资源的访问权受到一定限制。
处理器可以运行在Thumb 状态或Debug状态。
在指令流正常执行期间,处理器处于Thumb状态。
当进行程序调试时,指令流可以暂停执行,这时处理器处于Debug状态。
处理器有两个独立的堆栈指针,分别称为MSF和PSP系统复位时总是处于线程模式的特权方式下,并且默认使用的堆栈指针是MSP本移植过程中假设任务总是运行在线程模式的特权方式下且总是使用堆栈指针PSP 2移植过程详解2.1 aCOS-II 内核介绍aCOS—II 是一个实时可剥夺型操作系统内核,该操作系统支持最多64 个任务,但每个任务的优先级必须互不相同,优先级号小的任务比优先级号大的任务具有更高的优先级,并且该操作系统总是调度优先级最高的就绪态任务运行。
第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文件结构示意图并以足够快的速度响应,其处理的结果又能够在规定的时间内输出,并控制所有实时任务协调、一致运行。
STM32上⾯运⾏UCOSII的步骤1、移植 UCOSII要想 UCOSII 在 STM32 正常运⾏,当然⾸先是需要移植 UCOSII。
ALIENTEK 提供的 SYSTEM ⽂件夹⾥⾯的系统函数直接⽀持 UCOSII,只需要在 sys.h ⽂件⾥⾯将: SYSTEM_SUPPORT_UCOS 宏定义改为 1,即可通过 delay_init 函数初始化 UCOSII 的系统时钟节拍,为 UCOSII 提供时钟节拍。
2、编写任务函数并设置其堆栈⼤⼩和优先级等参数。
编写任务函数,以便 UCOSII 调⽤;设置函数堆栈⼤⼩,这个需要根据函数的需求来设置;堆栈字节对齐的问题,如果任务运⾏出现莫名其妙的错误(⽐如⽤到 sprintf 出错),请考虑是不是字节对齐的问题。
设置任务优先级,这个需要⼤家根据任务的重要性和实时性设置,记住⾼优先级的任务有优先使⽤ CPU 的权利。
3、初始化 UCOSII,并在 UCOSII 中创建任务调⽤ OSInit,初始化 UCOSII,通过调⽤ OSTaskCreate 函数创建我们的任务。
4、启动 UCOSII调⽤ OSStart,启动 UCOSII。
通过以上 4 个步骤, UCOSII 就开始在 STM32 上⾯运⾏了,这⾥还需要注意我们必须对os_cfg.h 进⾏部分配置,以满⾜我们⾃⼰的需要。
软件设计1、在⼯程源码下⾯加⼊ UCOSII ⽂件夹,存放 UCOSII源码(我们已经将 UCOSII源码分为三个⽂件夹:CORE、PORT和 CONFIG)。
打开⼯程,新建 UCOSII-CORE、 UCOSII-PORT 和 UCOSII-CONFIG 三个分组,分别添加UCOSII 三个⽂件夹下的源码,并将这三个⽂件夹加⼊头⽂件包含路径:UCOSII-CORE 分组下⾯是 UCOSII 的核⼼源码,我们不需要做任何变动。
UCOSII-PORT 分组下⾯是我们移植 UCOSII 要修改的 3 个代码,这个在移植的时候完成。
移植详解1和2中主要讲了移植需要用到的基础知识,本文则对具体的移植过程进行介绍。
首先从micrium网站上下载官方移植版本(编译器使用ARM/Keil 的,V2.86版本,V2.85有问题)。
下载地址:/page/downloads/ports/st/stm32解压缩后得到如下文件夹和文件:Micrium\AppNotesLicensingSoftwareReadMe.pdfAppNotes包含ucosii移植说明文件。
这两个文件中我们仅需关心Micrium\AppNotes\AN1xxx-RTOS\AN1018-uCOS-II-Cortex-M3\AN-1018 .pdf。
因为这个文件对ucosii在CM3内核移植过程中需要修改的代码进行了说明。
Licensing包含ucosii使用许可证。
Software下有好几个文件夹,在本文的移植中仅需关心uCOS-II即可。
CPU: stm32标准外设库EvalBoards: micrium官方评估板相关代码uc-CPU: 基于micrium官方评估板的ucosii移植代码uC-LCD:micrium官方评估板LCD驱动代码uc-LIB: micrium官方的一个库代码uCOS-II: ucosii源代码uC-Probe: 和uC-Probe相关代码ReadMe.pdf就不说了。
好了,官方的东西介绍完了,该我们自己建立工程着手移植了。
关于建立工程,并使用stm32标准外设库在我之前的文章《stm32标准外设库使用详解》已有介绍,这里请大家下载其中模板代码(/source/3448543),本文的移植是基于这个工程的。
建立文件夹template\src\ucosii, template\src\ucosii\src, template\src\ucosii\port;把Micrium\Software\uCOS-II\Source下的文件拷贝至template\src\ucosii\src;把Micrium\Software\uCOS-II\Ports\ARM-Cortex-M3\Generic\RealView 下的文件拷贝至template\src\ucosii\port;ucosii\src下的代码是ucosii中无需修改部分,ucosii\port下的代码是移植时需要修改的。
基于STM32的u/COS-II系统移植【摘要】本文硬件平台采用ARM公司基于ARMV7架构的Cortex-M3系列处理器STM32F103,利用安富来公司现有的开发板,移植一个基于u/COS-II操作系统的应用程序框架(系统移植);创建多个任务,并通过使用消息邮箱进行两个任务之间的通信。
本文重点是把u/COS-II系统移植到程序中来,进而把各个基本功能模块化,并划分为几个主任务,以便实现嵌入式系统的操作。
【关键字】u/COS-II STM32 系统移植消息邮箱串口通信【引言】随着人类社会经济的不断发展,科研领域不断的拓宽,嵌入式系统产品渐渐完善,并在全世界各行业得到广泛应用。
通过移植嵌入式操作系统,计算机可以更好地管理内存,并且在很大程度上提高系统的实时性。
本设计通过在STM32上移植u/COS-II操作系统,实现了流水灯闪烁,使用消息邮箱实现多任务间的通信,并通过串口将信息打印到PC终端等功能。
加深了笔者对嵌入式操作系统的理解。
【正文】1 U/COS-II的简介U/COS-II的前身是UCOS,最早出自于1992年美国嵌入式系统专家Jean brosse在《嵌入式系统编程》杂志的5月和6月刊上刊登的文章连载,并把UCOS的源码发布在该杂志的BBS上。
目前最新的版本:U/COS-lll已经出来,但是现在使用最为广泛的还是U/COS-II,本章我们主要针对U/COS-II进行介绍。
U/COS-II是一个可以基于ROM运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。
为了提供最好的移植性能,U/COS-II最大程度上使用ANSI C语言进行开发,并且已经移植到近40多种处理器体系上,涵盖了从8位到64位各种CPU(包括DSP)。
U/COS-II是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。
CPU硬件相关部分是用汇编语言编写的,总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU上。
用户只要有标准的ANSI的C交叉编译器,有汇编器、连接器等软件工具,就可以将U/COS-II 嵌人到开发的产品中。
U/COS-II具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB。
U/COS-II已经移植到了几乎所有知名的CPU上。
U/COS-II构思巧妙。
结构简洁精练,可读性强,同时又具备了实时操作系统的全部功能,虽然它只是一个内核,但非常适合初次接触嵌入式实时操作系统者,可以说是麻雀虽小,五脏俱全。
U/COS-II(V2.91版本)体系结构如图1所示:图1:U/COS-II体系结构图本设计使用的是U/COS-II的最新版本:V2.91版本,该版本U/COS-II比早期的U/COS-II(如V2.52)多了很多功能(比如多了软件定时器,支持任务数最大达到255个等),而且修正了很多已知BUG。
从上图可以看出,U/COS-II的移植,只需要修改:os_cpu.h、os_cpu_a.asm 和os_cpu.c等三个文件即可,其中:os_cpu.h,进行数据类型的定义,以及处理器相关代码和几个函数原型;os_cpu_a.asm,是移植过程中需要汇编完成的一些函数,主要就是任务切换函数;os_cpu.c,定义一些用户HOOK函数。
图中定时器的作用是为U/COS-II提供系统时钟节拍,实现任务切换和任务延时等功能。
这个时钟节拍由OS_TICKS_PER_SEC(os_cfg.h中定义)设置,一般设置U/COS-II 的系统时钟节拍为1ms~100ms,具体根据所用处理器和使用需要来设置。
本设计中,我利用STM32的SYSTICK定时器来提供U/COS-II 时钟节拍。
U/COS-II早期版本只支持64个任务,但是从2.80版本开始,支持任务数提高到255个,不过对一般使用者来说一般64个任务都是足够多了,一般很难用到这么多个任务。
U/COS-II保留了最高4个优先级和最低4个优先级的总共8个任务,用于拓展使用,但实际上,U/COS-II一般只占用了最低2个优先级,分别用于空闲任务(倒数第一)和统计任务(倒数第二),所以剩下给我们使用的任务最多可达255-2=253个(V2.91)。
所谓的任务,其实就是一个死循环函数,该函数实现一定的功能,一个工程可以有很多这样的任务(最多255个),U/COS-II对这些任务进行调度管理,让这些任务可以并发工作(注意不是同时工作!并发只是各任务轮流占用CPU,而不是同时占用,任何时候还是只有1个任务能够占用CPU),这就是U/COS-II 最基本的功能。
U/COS-II的任何任务都是通过一个叫任务控制块(TCB)的东西来控制的,每个任务管理块有3个最重要的参数:1,任务函数指针;2,任务堆栈指针;3,任务优先级;任务控制块就是任务在系统里面的身份证(U/COS-II通过优先级识别任务)。
在U/COS-II中,使用CPU的时候,优先级高(数值小)的任务比优先级低的任务具有优先使用权,即任务就绪表中总是优先级最高的任务获得CPU使用权,只有高优先级的任务让出CPU使用权(比如延时)时,低优先级的任务才能获得CPU使用权。
U/COS-II不支持多个任务优先级相同,也就是每个任务的优先级必须不一样。
任务的调度其实就是CPU运行环境的切换,即:PC指针、SP指针和寄存器组等内容的存取过程。
U/COS-II的每个任务都是一个死循环。
每个任务都处在以下5种状态之一的状态下,这5种状态是:睡眠状态、就绪状态、运行状态、等待状态(等待某一事件发生)和中断服务状态。
在U/COS-II中,与任务相关的几个重要函数:1)创建任务函数如果想让U/COS-II管理用户的任务,必须先建立任务。
U/COS-II提供了2个建立任务的函数:OSTaskCreat和OSTaskCreatExt,我们一般用OSTaskCreat 函数来创建人任务,该函数的原型为OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio)。
该函数包括4个参数:task:是指向任务代码的指针;pdata:是任务开始执行时,传递给任务的参数的指针;ptos:是分配给任务的堆栈的栈顶指针;prio是分配给任务的优先级。
每个任务都有自己的堆栈,堆栈必须申明为OS_STK类型,并且由连续的内存空间组成。
可以静态分配堆栈空间,也可以动态分配堆栈空间。
OSTaskCreatExt也可以用来创建任务。
2)改变任务的优先级函数U/COS-II在建立任务时,会分配给任务一个优先级,但是这个优先级并不是一成不变的,而是可以通过调用U/COS-II提供的函数修改。
U/COS-II提供的任务优先级修改函数原型为:INT8U OSTaskChangePrio(INT8U oldprio,INT8U newprio)。
3)任务挂起函数任务挂起只是将被挂起任务的就绪标志删除,并做任务挂起记录,并没有将任务控制块任务控制块链表里面删除,也不需要释放其资源。
被挂起的任务,在恢复(解挂)后可以继续运行。
U/COS-II 提供的任务挂起函数原型为:INT8U OSTaskSuspend(INT8U prio)。
4)任务恢复函数有任务挂起函数,就有任务恢复函数,通过该函数将被挂起的任务恢复,让调度器能够重新调度该函数。
U/COS-II 提供的任务恢复函数原型为:INT8U OSTaskResume(INT8Uprio)。
2. U/COS-II信号量和邮箱简介系统中的多个任务在运行时,经常需要互相无冲突地访问同一个共享资源,或者需要互相支持和依赖,甚至有时还要互相加以必要的限制和制约,才保证任务的顺利运行。
因此,操作系统必须具有对任务的运行进行协调的能力,从而使任务之间可以无冲突、流畅地同步运行,而不致导致灾难性的后果。
例如,任务A和任务B共享一台打印机,如果系统已经把打印机分配给了任务A,则任务B因不能获得打印机的使用权而应该处于等待状态,只有当任务A把打印机释放后,系统才能唤醒任务B使其获得打印机的使用权。
如果这两个任务不这样做,那么会造成极大的混乱。
任务间的同步依赖于任务间的通信。
在U/COS-II中,是使用信号量、邮箱(消息邮箱)和消息队列这些被称作事件的中间环节来实现任务之间的通信的。
两个任务通过事件进行通讯的示意图如图2所示:图2:两个任务使用事件进行通信的示意图在图2中任务1是发信方,任务2是收信方。
任务1负责把信息发送到时间上,这项操作叫做发送事件。
任务 2 通过读取事件操作对事件进行查询:如果有信息则读取,否则等待。
读事件操作叫做请求事件。
为了把描述事件的数据结构统一起来,U/COS-II使用叫做事件控制块(ECB)的数据结构来描述诸如信号量、邮箱(消息邮箱)和消息队列这些事件。
事件控制块中包含包括等待任务表在内的所有有关事件的数据,事件控制块结构体定义如下:typedef struct{INT8U OSEventType; //事件的类型INT16U OSEventCnt; //信号量计数器void *OSEventPtr; //消息或消息队列的指针INT8U OSEventGrp; //等待事件的任务组INT8U OSEventTbl[OS_EVENT_TBL_SIZE];//任务等待表#if OS_EVENT_NAME_EN > 0uINT8U *OSEventName; //事件名#endif} OS_EVENT;信号量是一类事件。
使用信号量的最初目的,是为了给共享资源设立一个标志,该标志表示该共享资源的占用情况。
这样,当一个任务在访问共享资源之前,就可以先对这个标志进行查询,从而在了解资源被占用的情况之后,再来决定自己的行为。
信号量可以分为两种:一种是二值型信号量,另外一种是N 值信号量。
U/COS-II 将二值型信号量称之为也叫互斥型信号量,将N 值信号量称之为计数型信号量,也就是普通的信号量。
在U/COS-II 中,与信号量相关的几个重要函数。
1)创建信号量函数在使用信号量之前,我们必须用函数OSSemCreate 来创建一个信号量,该函数的原型为:OS_EVENT *OSSemCreate (INT16U cnt)。
该函数返回值为已创建的信号量的指针,而参数cnt 则是信号量计数器(OSEventCnt)的初始值。
2)请求信号量函数任务通过调用函数OSSemPend 请求信号量,该函数原型如下:void OSSemPend ( OS_EVENT *pevent, INT16U timeout, INT8U *err)。