实操性最强: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文件夹中。
ucosii在stm32上的移植详解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下的代码是移植时需要修改的。
ucosii在STM32上的移植详解
ucosii在stm32上的移植详解虽然目前网上已经有不少关于ucosii在stm32上的移植版本,包括micrium也有官方移植版本。
但这些版本具体是怎么移植出来的,又该怎么基于移植好的ucosii 开发应用软件,网上介绍的并不多。
这里介绍一下我的移植经历,希望对大家有所帮助。
我的移植基本上是从零开始的。
首先想要做好移植,有两方面的内容是必须要了解。
1.目标芯片;2.ucosii内核原理。
虽然我们移植的目标芯片是stm32,但操作系统的移植基本是针对Cortex-M3内核(以下简称CM3)而言的,所以我们只需了解CM3内核就好了。
stm32芯片就是CM3内核加上各种各样的外设。
怎么才能了解CM3呢?看一本书<<ARM Cortex-M3权威指南>>(宋岩译,网上多的很)就好了,很多同学可能想,看完这本书移植的新鲜劲都没了,因此我把该书和移植有关的章节都列了出来,并对其中的重点内容进行介绍,我数了数相关章节还不到100页,就这点内容,总要看了吧。
相关章节如下:chapter2 Cortex-M3概览2.1 - 2.9主要了解Cortex-M3的概貌。
刚开始看时不用追求全部理解,后面会有详细介绍,很多内容多看几遍就明白。
其中2.8 指令集,只要了解,CM3只使用thumb2就ok了。
chapter3 Cortex-M3基础3.1 寄存器组R0-R12: 通用寄存器R13: 堆栈寄存器有两个,MSP和PSP,同时只能看见一个引用R13时,引用的是正在使用的那个MSP:可用于异常服务和应用程序PSP:只能用于应用程序系统复位后,用的堆栈指针是MSP。
R14: 连接寄存器,又名LR,存储返回地址R15: 程序计数寄存器,又名PC3.2 特殊功能寄存器程序状态字寄存器组(PSRs)中断屏蔽寄存器组(PRIMASK, FAULTMASK, BASEPRI)控制寄存器(CONTROL)程序状态字寄存器组(PSRs)分为应用程序 PSR(APSR)中断号 PSR(IPSR)执行 PSR(EPSR)每个都是32位,由于这3个寄存器有效位是错开的,因此可以组合访问。
STM32平台移植uCOS-II详细说明-2012.11.13
1 / 13
STM32 平台移植 uCOS-II 详细说明
具体文件结构说明如下图所示:
文件名
说明
AppNote
uCOS-II说明,其中AppNotes\AN1xxx-RTOS\AN1018-uCOS-II-Cortex-M3.pdf文件介绍了 移植过程的详细说明。
os_cpu.h os_cpu_a.asm os_cpu_c.c
os_dbg.c
BSP
bsp.c bsp.h
盘古UE-STM32F103开发板 ARM Cotex-M3
3 / 13
STM32 平台移植 uCOS-II 详细说明
4. 建立 Keil 工程
打开 Keil_v4.20,新建工程 UE-uCOS-II-Port 工程,并将其保存至 uCOS-II-Port\Project 在随后跳出的窗口中,选择芯片型号,盘古 UE-STM32F103 开发板的芯片为:STM32F103VET6 点击 OK,跳出对话框,是否自动添加启动文件,注意此处选择否,因为我们会自己添加。
STM32F10x_StdPeriph_Driver: STM32固件库函数v3.5,包含了各个外设驱动代码;
STM32F10x_CM3: core_cm3.h和core_cm3.c文件为内核支撑文件,其他CM3核
的芯片也能使用; stm32f10x.h为标准函数库的入口文件,包含了一些寄存器
的定义; system_stm32f1ox.h、system_stm32f10x.c提供了初始化
和 DeviceSupport\ST\STM32F10x 下的 stm32f10x.h、system_stm32f10x.c 和 system_stm32f10x.h 拷贝至 uCOS-II-Port\Library\CM3,并去掉只读属性 再将 DeviceSupport\ST\STM32F10x\startup\arm 下的 startup_stm32f10x_hd.s 拷贝至 uCOS-II-Port\Library\CM3\startup 注:盘古 UE-STM32F103 的主芯片的内部 flash 为 512K 打开 STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template 将其下的 stm32f10x_conf.h、stm32f10x_it.c 和 stm32f10x_it.h 拷贝至 uCOS-II-Port\App 至此,库函数的源代码搬移工作已经完成,现在进行 uCOS-II 的源代码搬移工作: 打开 Micrium\Software\uCOS-II\Source 将其下的所有文件拷贝至 uCOS-II-Port\OS-uCOSII\core 打开 Micrium\Software\uCOS-II\Ports\ARM-Cortex-M3\Generic\RealView 将其下的所有文件拷贝至 ucos\uCOS-II-Port\OS-uCOSII\port 打开 Micrium\Software\EvalBoards\ST\STM3210B-EVAL\RVMDK\OS-Probe 将其下的 os_cfg.h 拷贝至 ucos\uCOS-II-Port\App 至此,所有的可利用的文件已经搬移结束,不过仍然需要建立一些文件 ,这个工程的文件结构才算完 整,具体如下: 打开 ucos\uCOS-II-Port\App 新建 app.c、app_cfg.h 和 includes.h 三个空文件 打开 ucos\uCOS-II-Port\Bsp 新建 bsp.c 和 bsp.h 两个空文件 到目前为止,我们所有的文件准备工作已经完成,我们可以了解一下 uCOS-II 的体系结构,如下所示:
步步清晰之uCOSII在STM32上的移植
同时,谨以此文献给我尊敬的晓丹同志(LeeDan)。O(∩_∩)O~
============================ Ucosii 在 stm32 上的移植 - 准备工作 ============================
4
步步清晰
◆4.把 App 目录下的所有文件加载到工程里的 APP 下 。 其中 stm32f10x_it.c 是中断服务程序文件,stm32f10x_conf.h 是外设配置文件。
weishao
5. 初始配置 STM32 的标准外设库
事实上,stm32 标准外设库的使用在 stm32f10x_stdperiph_lib_um.chm 中的 How to use the Library 一节中已有说明,下面我把其中的步骤罗列一下:
代家可以回想一有通用寄存器执行完了呢osstarthigoscpupenoscpusysoscpusysoscpusys几个函数o这里最后三个systickhan中断函数的定systickinitickclkfreqsystickclk面我们会自己移植时需要beginendtehookookhookhooknitokookhook数除了osta单看看就应说一说osta代码在正常运一下中断过程器即当前代想回到原来ghrdyvoidndsvhandlerstickhandlestickinitvstickclkfreoscpupend个函数需要注ndler定义定义systickkfreq定义己实现因此askstkinit应该明白了askstkinit运行时一行程当中断发代码的现场来函数执行的void
ucosiiSTM32keil开发板移植修改版
2. 打开文件夹,在该文件夹建立一个 ucosii 文件夹(用来存放 ucosii 的文件) 3. 在 ucosii 文件夹下面建立 3 个文件夹 4. 从官方网站上下载支持 STM32F103ZE 的源码 5. 打开 Micrium -> Software -> uCOS-II ->Source 如图
#define Reload_1us SystemCoreClock/1000000 #define Reload_1ms SystemCoreClock/1000
#define OS_tick_ms 1000/OS_TICKS_PER_SEC 滴答时钟的初始化: void SysTickConfig(void) {
这三个函数屏蔽掉;
18.打开 os_cfg.h 文件
1. #define OS_APP_HOOKS_EN
1 改为 0
#define OS_ARG_CHK_EN
1 改为 0
#define OS_TMR_EN
1 改为 0
19.字节编写滴答时钟的初始化和中断服务函数;
20.屏蔽 stm32f10x_it.c 中的 PendSV_Handler 中断服务函数。
u32 OS_reload = 0; OS_reload = Reload_1ms*(1000/OS_TICKS_PER_SEC); if(SysTick_Config(OS_reload) == 1)
{ while(1);
} SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; }
把上面这两个文件复制到我们 STM32 工程中 ucosii –> config 下. 8.用 keil 打开我们的 STM32 工程:
基于STM32的μCOS_II移植实例(非常详细的移植过程)
基于STM32的μCOS_II移植实例(非常详细的移植过程)基于STM32的μC/OS_II移植实例目录第一章μC/OS_II移植准备工作 (2)1.1 硬件平台 (2)1.2 软件平台 (2)第二章μC/OS_II移植步骤 (3)2.1 文件结构 (3)2.2 μC/OS_II文件移植 (4)2.3 MDK中导入μC/OS_II文件 (4)2.4 需要修改的代码 (7)第三章μC/OS_II多任务以及任务间通信的实现 (9)3.1 μC/OS_II任务的创建 (9)3.2 事件标志组的创建 (11)第四章μC/OS_II移植测试 (13)4.1 μC/OS_II多任务的测试 (13)4.2 任务间通信的测试 (14)第一章μC/OS_II移植准备工作以武陵源车载系统终端为背景,探讨基于STM32的μC/OS嵌入式系统移植方法。
武陵源车载终端的基本功能是GPS数据的接收、站点和弯道的识别、超速报警、GPRS数据上传等。
本文重点是把μC/OS移植到程序中来,其次把各个基本功能模块化并划分为几个主任务,以便实现嵌入式系统的操作。
1.1 硬件平台硬件平台是ARM公司基于ARMv7架构的Cortex-M3系列处理器STM32F103T8。
此处理器执行Thumb-2指令的32位哈佛微体系结构和系统外设,包括Nested Vec-tored Interrupt Controller和Arbiter总线。
它整合了多种技术,减少内存的使用,极小的RISC内核有着低功耗和高性能的特点。
新的单线调试技术,避免使用多引脚进行JTAG调试,并全面支持RealView编译器和RealView调试产品。
GPS模块为Fastrax IT500,它是一款能适用于非常苛刻的应用场合,有着高性能的导航,即使在GPS卫星可见度较恶劣的环境下也能实现稳定定位。
IT500有着领先的冷启动灵敏度(-148dBm)和领先的导航灵敏度(-165dBm),定位率可以根据客户的要求设置到最高10Hz,非常适合高动态的应用。
移植uCOS-II到STM32开发平台(基于uCOS-II2.86和ST官方V3.5固件库)
移植uCOS-II到STM32开发平台(基于uCOS-II2.86和ST官方V3.5固件库)之前有使用ST官方V3.5固件库新建工程,并且编写了GPIO的LED和KEY函数。
现在在此基础上移植uCOS-II到我们的工程。
参考野火STM32系统提高的uCOS-II移植1、文件拷贝1.1、打开我们的工程文件夹test,在inc文件夹里创建includes.h文件1.2、在test工程根目录下创建3个文件夹:BSP 存放硬件驱动APP 存放软件任务uCOS-II →PORTS 拷贝uCOS内核文件SOURCE1.3、将之前在inc和src目录下自己写的led.h和led.c剪切(Ctrl+X)到我们新建的BSP 文件夹再在BSP文件夹新建BSP.c和BSP.h1.4、在APP文件夹创建app.h、app.c和app_cfg.h拷贝uCOS文件夹下的Micrium\Software\EvalBoards\ST\STM32F103ZE-SK\IAR\OS-Probe-LCD\os_cfg.h到APP文件夹1.5、将uCOS\Micrium\Software\uCOS-II文件夹下的source 文件夹文件拷贝到工程新建的uCOS-II/SOURCE将uCOS\Micrium\Software\uCOS-II\Ports\arm-cortex-m3\Generic\IAR文件夹下的文件全部拷贝到工程新建的uCOS-II/PORTS文件夹下,并且全选所有文件,右键属性,去除只读2、工程配置2.1、keil打开test工程,进行工程组设置工程组中新添加APP、BSP、uCOS-II/SOURCE和uCOS-II/PORTS四个组,添加相应的文件APP →app.cBSP →led.c和BSP.cuCOS-II/SOURCE →所有.c文件uCOS-II/PORTS →os_cpu_a.asm os_cpu_c.c os_dbg.c(.asm 文件要经过过滤才能看到)2.2、打开工程配置选项卡进行工程配置,C/C++选项卡中头文件路径中添加新建4个目录的路径.\APP.\BSP.\uCOS-II\PORTS.\uCOS-II\SOURCE3、代码修改3.1、os_cfg.h在文件中找到以下宏,将1更改为0进行禁用3.2、os_cpu.h屏蔽三个嘀嗒时钟函数3.3、os_cpu_c.c屏蔽以下代码代码前加#if 0 末尾加#endif 第一处:第二处:第三处:3.4、os_cpu_a.asm PUBLIC修改为EXPORT源代码RSEG CODE:CODE:NOROOT(2)屏蔽,修改为以下代码3.5、os_dbg.c屏蔽__root3.6、startup_stm32f10x_hd.sstartup_stm32f10x_hd.s文件下搜索PendSV_Handler,修改为OS_CPU_PendSVHandler(三处)4、编写代码4.1、includes.h#ifndef __INCLUDES_H__#define __INCLUDES_H__#include "stm32f10x.h"#include "stm32f10x_rcc.h" //SysTick 定时器相关#include "ucos_ii.h" //uC/OS-II 系统函数头文件#include "BSP.h" //与开发板相关的函数#include "app.h" //用户任务函数#include "led.h" //LED 驱动函数#endif //__INCLUDES_H__4.2、BSP.c这里注意将嘀嗒时钟初始化函数放到前面,然后将SystemFrequency改为SystemCoreClock,因为前者为3.0版本固件库的时钟定义,这里是V3.5#include "includes.h"/** 函数名:SysTick_init* 描述:配置SysTick 定时器* 输入:无* 输出:无*/void SysTick_init(void){SysTick_Config(SystemCoreClock/OS_TICKS_PER_SEC);//初始化并使能SysTick 定时器}/** 函数名:BSP_Init* 描述:时钟初始化、硬件初始化* 输入:无* 输出:无*/void BSP_Init(void){SystemInit(); /* 配置系统时钟为72M */SysTick_init(); /* 初始化并使能SysTick 定时器*/led_init(); /* LED 端口初始化*/}4.3、BSP.h#ifndef __BSP_H#define __BSP_Hvoid SysTick_init(void);void BSP_Init(void);#endif // __BSP_H4.4、stm32f10x_it.c添加#include “includes.h”添加以下函数OSIntEnter();OSTimeTick();OSIntExit();5、创建任务5.1、app_cfg.h#ifndef __APP_CFG_H__#define __APP_CFG_H__/*******************设置任务优先级*******************/ #define STARTUP_TASK_PRIO 4#define TASK_LED2_PRIO 5#define TASK_LED3_PRIO 6/************设置栈大小(单位为OS_STK )************/ #define STARTUP_TASK_STK_SIZE 80#define TASK_LED2_STK_SIZE 80#define TASK_LED3_STK_SIZE 80#endif5.2、app.c#include "includes.h"OS_STK task_led2_stk[TASK_LED2_STK_SIZE]; //定义栈OS_STK task_led3_stk[TASK_LED3_STK_SIZE]; //定义栈//主任务void Task_Start(void *p_arg){(void)p_arg; // 'p_arg' 并没有用到,防止编译器提示警OSTaskCreate(Task_LED2,(void *)0, //创建任务2&task_led2_stk[TASK_LED2_STK_SIZE-1], TASK_LED2_PRIO); OSTaskCreate(Task_LED3,(void *)0, //创建任务3&task_led3_stk[TASK_LED3_STK_SIZE-1], TASK_LED3_PRIO); while (1){led_open_D3();OSTimeDlyHMSM(0, 0,0,200);led_close_D3();OSTimeDlyHMSM(0, 0,0,800);}}//任务2void Task_LED2(void *p_arg){(void)p_arg;while (1){led_open_D4();OSTimeDlyHMSM(0, 0,0,500);led_close_D4();OSTimeDlyHMSM(0, 0,0,500);}}//任务3void Task_LED3(void *p_arg){(void)p_arg;while (1){led_open_D5();OSTimeDlyHMSM(0, 0,0,800);led_close_D5();OSTimeDlyHMSM(0, 0,0,200);}}5.3、app.h#ifndef _APP_H_#define _APP_H_/**************** 用户任务声明*******************/void Task_Start(void *p_arg);void Task_LED2(void *p_arg);void Task_LED3(void *p_arg);#endif //_APP_H_5.4、main.c#include "includes.h"OS_STK startup_task_stk[STARTUP_TASK_STK_SIZE]; //定义栈int main(void){BSP_Init();OSInit();OSTaskCreate(Task_Start,(void *)0,&startup_task_stk[STARTUP_TASK_STK_SIZE-1], STARTUP_TASK_PRIO);OSStart();return 0;}至此,移植完成,编译不出错,下载验证。
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 和。
在ucos上移植stm32
1.准备材料在st官网上下载最新的固件库(现在是v3.5.0),地址为:/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32 f10x_stdperiph_lib.zip(地址仅为参考,以最新变更为准)解压后目录如下:在ucos官网上下载移植stm32移植版的ucosii代码,这个需要注册一下,下载地址为:/download/uCOSII-ST-STM32F103ZE-SK.exe(以最新变更为准)下载安装后目录如下:2.创建工程文件(以Template为例)创建一个文件夹,取名为Template,新建App,Bsp,Libraries,Project,Readme,uCos-II,Source insight 文件夹,如图:App:用于存放与应用程序有关的文件Bsp:用于存放与硬件有关的驱动程序Libraries:用于存放固件库和启动文件Project:存放项目工程文件Readme:存放一些说明性的文件Source Insight:存放Source insight项目文件uCOS-II:存放uCOS的相关文件。
接下来往各个文件夹下添加相应的文件(以下图的文件路径为例):(1)将路径E:\Micrium\Software\EvalBoards\ST\STM32-SK\IAR\OS-Probe-LCD下的app,app_cfg,includes,os_cfg 复制到App文件目录下,除os_cfg外其他三个文件中的内容可以删除或在应用时更改。
(2)将路径E:\Micrium\Software\EvalBoards\ST\STM32-SK\IAR\BSP下的bsp.c,bsp.h 复制到Bsp文件目录下,用户使用时可以根据项目需求重写或更改。
(3)在Libraries文件夹下新建CMSIS文件夹,并在CMSIS中新建startup文件夹,将路径E:\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries下的STM32F10x_StdPeriph_Driver文件夹复制到Libraries中,将路径E:\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport 下的core_cm3.c,core_cm3.h 、路径E:\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x 下stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h文件复制到CMSIS中,将路径E:\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\start up\iar 下的startup_stm32f10x_hd.s(根据mcu型号选择)复制到startup文件夹下,将路径E:\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template\EWARM 下的stm32f10x_flash.icf 复制到startup 文件夹下。
ucosii在stm32上的移植详解2
ucosii在stm32上的移植详解2在详解1 中主要讲了移植需要用到的CM3 内核知识,本文讲一讲ucosii的原理和代码组成。
ucosii 最经典的学习资料莫过于邵贝贝老师的>,我想这本书对学ucosii 已经足够了,因为他把ucosii V2.55 代码都讲了一遍。
移植前应该好好看看此书。
下面说说我对ucosii 的理解。
应该说ucosii 这个内核还是比较简单的,基本可以分为任务调度,任务同步和内存管理三个部分。
任务调度ucosii 为保证实时性,给每个任务分配一个不同的优先级。
当发生任务切换时,总是切换到就绪的最高优先级任务。
有2 种情况会发生任务切换。
1.任务等待资源就绪或自我延时;2.退出中断;情况1 可以理解为任务主动放弃cpu 的使用权。
情况2 可以理解为中断后,某种资源可能就绪了,需要任务切换。
需要注意的是SysTick 中断,这个中断是os 的心跳,必须得有。
这样就使得cpu 会发生周期性地做任务切换。
由于ucosii 不支持时间片轮转调度,因此在该中断中必须做的工作仅有os 的时间管理。
也就是调用OSTimeTick()。
任务同步任务同步和大多数操作系统的做法差不多,如果学过操作系统或是有多线程编程经验的话,应该很好理解。
无非是任务A 因为某个资源未就绪,就放弃cpu 使用权,等任务B 或是中断使该资源就绪,当再次任务进行切换时如果任务A 优先级最高,则任务A 继续执行。
具体怎么实现就看邵老师的书吧。
内存管理ucosii 的内存管理比较简单,就不说了。
下面看看ucosii 代码组成:os_core.c 是ucosii 的核心,它包含了内核初始化,任务切换,事件块管理等,其中事件块是各个同步量(这里我把互斥量,信号量,邮箱,队列统称为同步量,不是很科学,图个方便。
事件标志组不是以事。
- 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占用率的函数,这个不太清楚还有没有其他功能,建议不要使用,因为我在使用的时候,发现,创建的任务都不能工作了,索性就不使用,反倒好了。