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

一、资料下载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移植目录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压的文件,双击解压。
UCOSII在STM32处理器上的移植

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 个任务,但每个任务的优先级必须互不相同,优先级号小的任务比优先级号大的任务具有更高的优先级,并且该操作系统总是调度优先级最高的就绪态任务运行。
大学作业--ucos在STM32移植

1、μCOS-II操作系统与内核分析1.1实时系统μCOS-II的分析μCOS-II,作为一个优秀的实时系统,不仅代码短小精悍,在实时性方面也非常优秀。
μCOS-II的各种服务都以任务的形式来出现的。
在μCOS-II中,每个任务都有一个唯一的优先级。
它是基于优先级的可剥夺内核,适用应用在对实时性要求较高的场合。
基于任务是μCOS-II内核的基础,我们首先来分析它的任务的结构,然后在分析μCOS-II对任务的管理和任务间的通信,最后简要谈谈μCOS-II对内存的管理。
1.2 μCOS-II的任务结构1.2.1 μCOS-II的任务μCOS-II的核心部分就是它的任务,它也是通过任务来对不同事件进行响应和处理的,从代码上看,μCOS-II的任务一般为如下的形式:void uCOSTsak(void *p){While(1){任务;}}1.2.2 任务的存储结构和状态μCOS-II的任务从内存中来看由三个部分组成,任务的代码部分,任务堆栈和任务控制块。
其中任务控制块保存任务的属性;任务堆栈在任务进行切换时保存任务运行的环境;代码任务部分就是在宏观上看到的C代码。
任务就是在以这样的块的形式存储在内存中的。
所有的任务的一个链表,每一个节点都由一个这样的结构组成。
嵌入式设备中一般都只有一个微处理器,所以在某一具体的时刻只能有一个任务占用处理器。
μCOS-II的任务一共有5种状态:睡眠、就绪、运行、等待和中断服务。
现在介绍任务的每个状态的详细情况:睡眠状态:任务仅仅以代码的形式驻留在程序存储器中,没有分配任务控制块或者任务控制块被删除。
因此操作系统还没有管理这个任务。
就绪状态:任务已经分配到了任务控制块并且具备了运行的条件,在就绪表中已经登记,等待运行的状态。
运行状态:就绪的任务获得了微处理器的使用权就立即进入运行状态,此时该任务占有微处理的使用权。
等待状态:正在运行的任务,由于需要等待一段时间或者等待某个条件的满足,需要让出微处理器的使用权。
STM32上面运行UCOSII的步骤

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 个代码,这个在移植的时候完成。
ucosii移植stm32总结

STM32移植uCOS-II

32
2. 安装 MDK,解压外设库和 uCOS-II 源码 3. 创建工程目录结构,如下
4. 复制外设库 � STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport 下
128
#endif � 打开 os_cfg.h,将 OS_APP_HOOKS_EN 设置为 0 � 打开 main.c,全选删除,并将以下内容复制进去,具体板级代码需要适
当修改
#include "ucos_ii.h" #include "stm32f10x.h"
#define LED_0 0 #define LED_1 1 #define LED_2 2 #define LED_3 3
case LED_3: GPIO_SetBits(GPIOD, GPIO_Pin_7); break;
default: break;
}
}
void led_off(uint32_t n) {
switch (n) {
case LED_0: GPIO_ResetBits(GPIOD, GPIO_Pin_2); break;
所有文件到新建的 Ports 目录下 � Micrium\Software\uCOS-II\Source 下的所有文件到新建的 Source 下 � Micrium\Software\EvalBoards\ST\STM3210B-EVAL\RVMDK\OS-Probe 下
的 app_cfg.h 和 os_cfg.h 到工程目录的 User 中 6. 打开 Keil,创建新工程,选择器件,注意弹出来的是否添加启动文件的询问
Keil移植Ucosii到STM32F103

基于Keil移植Ucosii到STM32F103RC中一、资源准备1.STM32F10x标准库:STM32F10x_StdPeriph_Lib_V3.5.02.Ucosii源码库:2.86版本3.开发工具:Keil4.STM32F103RC芯片开发板。
二、STM32F10x标准库移植1.建立工程文件夹STM32F10x_Ucosii_Keil2.建立子文件夹:CMSIS、STM32F10x_StdPeriph_Driver、Ucosii、Project。
如下:3.将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x中的stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h三个文件拷贝到CMSIS文件夹;4.将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm中的startup_stm32f10x_hd.s文件拷贝到CMSIS文件夹;5.将STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template中的main.c、stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h三个文件拷贝到User文件夹;6.将STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver中的文件夹及其文件全部拷贝到STM32F10x_StdPeriph_Driver中。
三、Ucosii源代码移植1.在Ucosii文件夹下建立子文件夹ports、source。
2.将Micrium\Software\uCOS-II\Ports\ARM-Cortex-M3\Generic\RealView中的os_cpu.h、os_cpu_a.asm、os_cpu_c.c、os_dbg.c四个文件拷贝到Ucosii\ports文件夹中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前言:说点废话,网上有很多关于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主要是放那些编译产生的乱七八糟的文件,为了使工程代码更加简洁。
2.使用MDK创建无操作系统工程项目,这一点就不一一说了,将创建后的工程项目文件树截图如下:这个时候还没有main文件,那么创建一个mian.c文档即可,这里需要注意,创建main.c后,要将其添加到项目中才行,而不是简单的保存。
如下图所示:、注意:main.c中要有一个mian函数,否则编译器会报错提示你的。
然后就是项目的配置,这个还是很重要的,下面分别说需要配置的地方:(1)O utput选项如下:这里面勾选了Create HEX File选项,同时将项目输出放到了之前创建的Output文件夹。
(2)L ist选项,将List产生的文件放入到之前创建的List 文件夹中。
(3)C/C++配置选项如下:其中Define选项中,填入:USE_STDPERIPH_DRIVER,STM32F10X_HD,这是告诉编译器,使用标准外设,还有选择的CPU类型,其中CPU类型需要根据你选择移植的CPU进行适当的更改。
Include Paths是要包含的头文件路径,这个为了保险,将项目中的所有有.h的文件的文件夹都包含进去就可以了。
4.Debug选项如下:,我使用的是Jlink进行烧写调试,所以选择了如图所示,还要进行settings,如下:这里要勾选“Reset and Run”,这样做的目的是,每当烧写下载后,CPU进行复位并运行。
5.Utilities选项设置如下所示:至此,配置完毕,编译一下,没有错误,创建一个简单的点亮LED程序,验证一下即可。
备注说明:如果按照这个步骤操作,编译,如果出现一些简单的错误,比如没有main函数,没有发现某个头文件,那么按照提示解决即可,但是如果发现了很多怪怪的编译错误,比如说未定义u32,u8这些符号时,那就要注意一下了,有可能是MDK版本的问题,我在使用MDK 低版本的时候,发现有问题,而使用高版本的时候就没问题了,所以需要注意一下。
二、移植uC/OS-ii到STM32F10X上1.首先在官网上下载基于STM32的移植工程案例,里面的移植文档AN-1018中是作者写的移植文档,说的很详细,想要移植的话,多看看这个文档。
2.其中有张图,非常重要,其实就是告诉了移植者要做的工作,如下图所示:这个图表达了什么信息呢,其实就是告诉移植者需要将那些文件移植到你的工程当中,首先是uC/OS-ii的源文件,就是OS_CORE.C、OS_FLAG.C.....ucos_ii.H这些文件,其实是uC/OS-ii的Port文件,包括4个,分别是OS_CPU_C.C,OS_CPU_A.ASM,OS_CPU.H,OS_DBG.C,还有是用户应用程序里的包含文件,这个里面不能照搬,选择使用两个文件,分别为OS_CFG.H和INCLUDES.H,其他三个,可以自己编写,为什么不套用另外那三个呢,主要是因为那三个文件是针对官方开发板创建的任务,里面包含的信息量太大,编译的时候,肯定会有大量的错误(因为我们是一直到我们自己的板子),所以最好自己写最简单的,至于怎么写,后面再详细说,可以先建2个空文件,分别是APP.C和APP_CFG.H,这两个文件的含义很简单,APP是自己的应用程序C文件,APP_CFG.H是对我们自己的应用程序做的配置文件,看到这里可能会有个疑问,APP_VECT.C文件怎么处理呢,答案是舍弃,因为官方提供的案例是自己写启动文件,APP_VECT.C文件是向量表,我们使用的是STM32固件库里的启动代码,所以就不用使用了。
BSP 部分有两个文件BSP.C和BSP.H,这个也建议直接舍弃,这个是官方文档中针对他们的的开发板写的一些底层的设备驱动,我们自己的开发板跟他们的不同,所以根本就没必要要,至此,将刚刚分析的这些必须的文件加入到上面创建的无操作系统裸板程序中,进行编译。
肯定会有很多错误,下面我们就一一的修改这些错误。
添加到项目后的文件树,如下图所示:需要注意的是,这其中的app.c和app_cfg.h是自己创建的空的文件,而不是使用官网案例里提供的,如果非要使用官网里面的,那么只能不停的更正其中的错误啦。
下面就是要修改错误的过程了。
3.修改os_cfg.h 这个是配置uCOS-ii系统功能的头文件,根据自己的需要进行裁剪任务吧,我只做了一个修改,就是,禁用钩子函数,这是为了防止出现那些所谓的文档中分析的要写的那几个钩子函数出现错误,禁用钩子函数了,也就不用写钩子函数了,其他的根据自己需要裁减吧。
4.OS_CPU_A.ASM文件的修改首先是修改为这样修改的目的,是因为MDK编程环境不认识PUBLIC,要用EXPORT.其次是修改:为:这个也是因为编程环境的问题。
5.修改OS_DBG.C修改:为:,原因也是编程环境的问题。
6.修改启动代码这个步骤是移植的核心:上面说的其他的修改,都是一些附属的格式方面的修改,而启动代码的修改才是移植的核心,这里简单的分析2个问题,一是,什么叫移植,二是移植的操作系统如何能够被我们的工程所应用。
所谓移植,打一个恰当的比喻——器官移植,就是将A的器官移植到B身上,使A的器官能够为B所用。
所以移植绝对不是简单的“复制”,不仅要放到你的工程项目中,更重要的是要能够和你的项目建立联系。
那么uCOS-ii怎么跟STM32建立联系呢?uCOS-ii的核心作用就是任务调度,要使用STM32的一个特殊中断——PendSV,就是可挂起系统任务中断,通过该中断进行系统的调度。
还有就是uCOS-ii需要一个基准时间,那么STM32中有一个专用的定时器,嘀嗒定时器SysTick,这个定时器,就是专为操作系统而设计的,通过这个滴答定时器给uCOS-ii提供一个时间基准,每隔固定的时间出发一个PendSV中断,进行任务的调度。
所以呢,在官方案例的移植文档AN-1018中也特别提到这一点,要将启动代码中所有“PendSV_Handler”和“SysTick_Handler”,替换成“OS_CPU_PendSVHandler”和“OS_CPU_SysTickHandler”,这样就相当于将uCOS-ii的“神经”跟你的项目的“神经”搭在了一起。
7.此时编译,发现还有一个错误:在uCOS-ii源码中查找OS_TASK_TMR_PRIO定义,原来这个定义在源码文件app_cfg.h中,如下所示:比葫芦画瓢,复制到自己创建的那个空白app_cfg.h中。
然后编译,发现已经还有的错误就是在includes.h中,说没有包含一些的头文件,这个把includes.h中对应错误的那些包含头文件代码删掉即可,这是因为我们没有完全的使用官方案例中的所有文件。
至此移植的修改工作告一段落,已经完成。
8.创建任务,验证移植效果。
这个可以参照源代码中APP.C进行创建任务,在app_cfg.h中编写各个任务的配置文件,这里需要注意的是,我们之前创建的裸板中已经有main.c文件,其中已经有main.c函数,所以我们在app.c 中就不必再创建main函数了,直接在main函数中初始化uCOS-ii,然后创建一个任务,或者调用一个函数,在这个任务或者函数中再创建需要的几个任务即可。
案例如下图所示:其中需要注意的是,在创建的第一个任务里,一定要先初始化嘀嗒定时器,这个是仿照官方案例中的代码格式写的,直接使用OS_CPU_SysTickInit(),可能在编译的时候,会发现这个嘀嗒定时器初始化启动函数有报错,这个一般是没有包含这个函数中调用的函数,或者直接没有,那么在源代码中搜索这个函数,比葫芦画瓢照抄写就行啦。
另外特别注意,官网代码的创建的第一个开始任务里有一段代码,如下图所示:这个,调用了OSStatInit()函数,这个函数的作用是启动统计CPU占用率的函数,这个不太清楚还有没有其他功能,建议不要使用,因为我在使用的时候,发现,创建的任务都不能工作了,索性就不使用,反倒好了。