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和List主要是放那些编译产生的乱七八糟的文件,为了使工程代码更加简洁。
ucosII多核移植和扩展的原理以及注意事项
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的破坏。
基于uCOS_II的以太网移植实例
基于μC/OS_II的以太网移植实例目录第一章以太网移植准备工作 (2)1.1 硬件平台 (2)1.2 软件平台 (2)第二章以太网移植步骤 (4)2.1 文件结构以及文件说明 (4)2.2以太网文件移植 (5)2.3MDK中文件的导入 (5)2.4 程序中需要编辑的代码 (8)第三章以太网任务创建以及初始化流程 (11)3.1 以太网任务创建 (11)3.2 以太网初始化流程 (12)3.3 以太网数据收发流程 (12)第四章测试以太网连接以及任务间通信 (14)4.1Ping命令测试 (14)4.2 网络调试助手测试 (14)第一章以太网移植准备工作以移动基站的电表管理系统为背景,探讨基于μC/OS嵌入式系统的以太网移植方法。
移动基站电表管理系统终端的基本功能就是上位机通过以太网发送命令或数据给终端,终端收到后,再通过485通信对电表执行相应的动作,最后,终端把得到的信息处理后再次通过以太网上传回来。
这里重点是把以太网协议栈移植到程序中来,以创建一个以太网通信任务。
1.1 硬件平台硬件平台是主芯片为STM32F107VC的金牛开发板,开发板上已集成有以太网功能模块和RS485功能模块。
只是在开发板上RS-485与RS-232接口共用了微处理器的接收串口,需要设置JP4,且配置为1-2,如表1.1所示。
金牛开发板支持两种以太网接口模式,一种是MII接口模式,另一种是RMII接口模式。
这里选用MII接口模式,根据表1.2对跳线JP2、JP6、JP7、JP8、JP12进行相应的配置。
1.2 软件平台软件平台为RVMDK软件。
RVMDK是由ARM编译器RVCT与Keil的工程管理、调试仿真工具集成,RVMDK是业界最好的Cortex-M3开发工具之一,它拥有流畅的用户界面与强大的仿真功能,是一款非常强大的ARM微控制器开发工具。
移植前需要熟悉RVMDK软件的使用。
移植过程中需要用到如图1.1和图1.2所示文件,一个是基于μC/OS_II的移动基站电表管理系统终端程序,另一个是基于μC/OS_II系统以太网移植文件。
使用IAR移植ucos到stm32的步骤
芯片型号stm32f103ve,编译器IAR for ARM 6.3准备材料在st官网上下载最新的固件库(现在是v3.5.0),这个库作用非常大,可以帮我们快速开发出想要的功能,但是网上有很多人说这个库有漏洞,本人水平有限就不得而知了,这里直接上地址。
解压后得到目录如下图在ucos官网上下载移植stm32移植版的ucosii代码,这个需要注册一下,不多说直接上接上地址下载安装后得到目录如下图建立工程首先建三个文件目录:CMSIS用来存放cpu和系统的相关的文件、STM32F10x_StdPeriph_Driver用来存放cpu的硬件驱动、ucosii用来存放ucos的源代码。
复制固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport目录下的core_cm3.c和core_cm3.h到工程文件夹下的CMSIS目录中。
复制固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x目录下的stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h三个文件到工程文件夹下的CMSIS目录中。
在固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\iar目录中选取相应的开始文件,这里我选取的是startup_stm32f10x_hd.s复制到到工程文件夹下的CMSIS目录中。
复制固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template目录中的stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h三个文件到工程文件夹下的CMSIS目录中。
uCOSII移植到STM32的心得随笔
#include <includes.h>
/*
*******************************************************************************
**************************
*
LOCAL DEFINES
*******************************************************************************
都复制到 RVMDK 文件夹下,在 ucosII_STM32_Test 文件夹下建立一个文件夹 STM32LIB,把
Software\CPU\ST\STM32 文件夹下的两个文件夹 inc,src 都复制到 STM32LIB 下,这两个是 STM32 的固件库,分别是 h 文件和 C 文件,为了方便我直接把 STM32 这文件夹拷过去了(主 要 是 inc , src 这 两 个 文 件 夹 ), 差 点 还 漏 了 一 步 , 把 BSP 文 件 夹 下 的 文 件
/* Start multitasking
return (0); }
/*
*******************************************************************************
**************************
*
App_TaskStart()
*
* Description : The startup task. The uC/OS-II ticker should only be initialize once multitasking
UCOS-II ucGUI的完美移植
stm32 UCGUI 完美移植作者:Changing发表时间:09-16 04:13分类:电子相关1 Comment前一篇:stm32 DA 数模转换后一篇:Stm32 SWD 下载 调试配置UCGUI是一种嵌入式应用中的图形支持系统。
它设计用于为任何使用LCD图形显示的应用提供高效的独立于处理器及LCD控制器的图形用户接口,它适用单任务或是多任务系统环境, 并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显示。
它的设计架构是模块化的,由不同的模块中的不同层组成,由一个LCD驱动层来包含所有对LCD的具体图形操作。
UCGUI可以在任何的CPU上运行,因为它是100%的标准C代码编写的。
类似程序还有国产的一个MINIGUI (/zhcn/),MiniGUI 是一个自由软件项目。
其目标是提供一个快速、稳定、跨操作系统的图形用户界面(GUI)支持系统,尤其是基于 Li nux/uClinux、eCos 以及其他传统 RTOS(如 VxWorks、ThreadX、uC/OS-II、Nucleus 等)的实时嵌入式操作系统。
有机会尝试下,支持下国产,毕竟国内这样的公司不多。
这里移植的UCGUI3.90a版本,虽然已经有更新的版本,比如UCGUI3.98、甚至4.04版本。
但是目前来说只有这个版本的代码是最全的,包括了JPEG , MULTILAYER , MEMDEV ,AntiAlias等模块。
一直想尝试做一个数码相册,JEPG模块自然少不了,所以移植了这个版本。
UCGUI390a 下载整个移植过程,让LCD显示图案倒是没花多少时间,资料也比较多,但是在移植触摸屏的时候卡了好几天,然后又是 UCGUI 指针图标 移动有重影(LCD读取像素颜色函数有问题)。
总之移植是个累人的活首先需要保证你的LCD驱动和触摸屏驱动是有效的,如果你的LCD也是ili93xx 控制器 XPT2046控制器的触摸屏可以参考 stm32 驱动 T F T LCD stm32 驱动 触摸屏 两篇文章UCGUI的文件数量很大,主要用到UCGUI390a/Start/Con f ig 和 UCGUI390a/Start/GUI两个文件夹下文件,不过文件数量也已经很多了 。
uCOSII在cortexM3上的移植方法和步骤
void void
OS_CPU_SysTickInit(void); OS_CPU_SysTickClkFreq(void);
3. 修改 OS_CPU_C.C: 将以下代码注释掉:
4. 修改 OS_CPU_A.ASM: 由于编译器的原因,将“PUBLIC”关键词改为”EXPORT”. 并将原来的: RESG CODE: CODE:NOROOT(2) 修改为:
二、 建立存放目录:
在选定的逻辑盘上新建一个文件夹,如: LED,在 LED 文件夹下面新建下面 5 个文件夹, 如下图所示:
这些文件夹存放内容分配如下: 1. BSP: 主要用来存放板级支撑程序,如:功能模块初始化程序,端口初始化程序等。 2. Libraries: 用来存放 Stm32 官方库函数文件,这些库文件可以从官方网站下载得到, 本文中使用的版本是 3.5 版,进入 Ligraries 后可以看到下面两个文件夹:
3. Project: 存放工程文件,包括输出文件,列表文件等,具体存放内容再后面会有进 一步的介绍。 4. uCOS-II: 存放操作系统文件, 将前面讲到的文件夹 Ports 和 Sourec 连内容一起复制 到此文件下面,如下图所示:
2 / 12
5. User:存放用户源程序文件。
三、 创建工程:
1. 打开 Keil MDK,新建一个名为”LED”的工程,将工程文件存放在 LEDProject 文件下 面,控制器选 STM32F103RB。 2. 按下图建立 Project Target,Groups。
3 / 12
3. 在相应的 Groups 下面添加或者新建源程序文件和头文件:
4 / 12
ห้องสมุดไป่ตู้
一步步移植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文件结构示意图并以足够快的速度响应,其处理的结果又能够在规定的时间内输出,并控制所有实时任务协调、一致运行。
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,创建新工程,选择器件,注意弹出来的是否添加启动文件的询问
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 的体系结构,如下所示:
μcos_II之移植篇
/**Author:Callon Huang*Version:1.0*Time:2014/11/5*blog:/u/2451220761*/希望博客也能帮到你~第一步:μcosII源码下载/downloadcenter/STM32固件库stm32f10x_stdperiph_lib.zip的下载第二步:新建文件夹,并准备子目录:其中Software是μcosII源码下载完成后拷贝过来的,其它的都自己新建.App 用来存放应用程序文件,Bsp 用来存放版级驱动文件,Lib 用来存放 STM32 的标准外设库文件,Source 用来存放uCOS 文件第三步:把Software里的uCOS-II、uC-LIB和uC-CPU文件夹到Source里并把后两者拷贝到uCOS-II文件夹里,最后如下:第四步:找到Software\EvalBoards\ST\STM32F103ZE-SK\IAR下的BSP文件夹,复制到Source文件夹下第五步:找到Software\EvalBoards\ST\STM32F103ZE-SK\IAR下的OS-Probe-LCD文件夹,复制到Source文件夹下并改名为APP第六步:解压下载好的stm32f10x_stdperiph_lib.zip固件库:找到stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Librari es\STM32F10x_StdPeriph_Driver下的inc和src文件夹并复制到Lib 文件夹下第七步:复制stm32f10x_stdperiph_lib\STM32F10x_StdPeriph_Lib_V3.5.0\Librari es\CMSIS下的CM3文件夹到Lib文件夹下第八步:删除一些不需要的文件:APP文件夹只需要:BSP文件夹只需要:在Software\CPU\ST\STM32里也有inc和src文件夹,但是比STM32固件库的要多两个文件stm32f10x_systick.c和stm32f10x_systick.h把这两个文件拷贝到SysTick文件夹下.第九步:建立工程my_ucosII,把所有的.c文件和.asm文件都加进来:‘第十步:对工程进行一些设置:Device就不用说了;Target不变;Output勾选上Create HEX File,并在里选择Obj文件夹;C/C++中添加头文件所在路径,否则会出现大量如下编译错误:头文件路径:Libraries文件夹是这三个最后这部分全部设置好后,如下:最后总体设置完如下:Debug里最后下载程序的时候,如果碰到MDK中出现“Error Flash download failed-Cortex-M3”错误,可以通过上面的添加On-chip-Flash来解决。
移植ucosii遇到的问题 B OSStartHang
移植ucosii 遇到的问题 B OSStartHangucosii 在STM32rbt6 上可以正常地运行,工作需要,我将ucosii 移植到STM32F103C8T6,更换了一下启动代码,结果程序开始调度时就死在那了OSStart(); 进去后void OSStart (void){if (OSRunning == OS_FALSE) {OS_SchedNew();OSPrioCur = OSPrioHighRdy;OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];OSTCBCur = OSTCBHighRdy;OSStartHighRdy();}}停在黑色加粗,通过调试找到汇编代码.asm 里边OSStartHangB OSStartHang 这个位置。
网上搜索后有网友提供答案关于STM32F107VC _OSStartHang 解决方案问题:移植UCOS-II 后,程序总是在B OSStartHang ,//根据提示,应当永远不会到这步的。
其实很简单,因为STM32 本身的异常中断PendSV_Handler 替代了UCOS 的异常中断OSPendSV,使其不能正常执行。
这样我们就需要更改PendSV_Handler 为OSPendSV 以让中断正常。
第一种更改startup_stm32f10x_cl.s(V3.5.版本)1、DCD PendSV_Handler ; PendSV Handler 更改为:DCD OSPendSV ; OSPendSV 中断2、PendSV_Handler PROCEXPORT PendSV_Handler [WEAK]B .ENDP 更改为:OSPendSV PROCEXPORT OSPendSV [WEAK]B .ENDP 第二种:startup_stm32f10x_cl.s 中定义了中断向量表(中断函数的入口地址)stm32f10x_it.c 中断服务函数的C 语言代码。
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 回到任务断点继续执行。
stm32ucos详细教程
void led_init(void) { GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能 PA 端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //LED0-->PA.8 端口配置
3. 在 ucosii 文件下建立六个文件夹:○1 hardware(用来存放你以后建立的 外围硬件源文件还有头文件);○2 output(用来存放工程编译后的文件); ○3 stm32lib(用来存放 stm32 V3.5 库的文件);○4 ucosii(用来存放 ucosii 移 植 的 文 件 ) ; ○5 user( 用 来 存 放 你 的 工 程 还 有 main 文 件 ) 。
1.我使用的是 uCOS 的 2.86 版本,下载后可以看到 Micrium 文件夹,里面含 有三个文件夹:
文件名
说明
AppNotes
包含 ucosii 的说明文件,其中 Micrium\AppNotes\AN1xxx-RTOS\AN1018-uCOS-IICortex-M3\ AN-1018.pdf 是很重要的。这个文件对 uc/os 在 M3 内核移植过程中的代码做了详细的说 明。
基于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嵌入式操作系统介绍与移植
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