uCOS-II在STM32上的移植步骤

发布者:心怀梦想最新更新时间:2015-11-17 来源: eefocus关键字: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.    创建源文件工程文件夹,如下图所示:
uCOS-II在STM32上的移植步骤
其中文件夹“CMSIS”为内核的接口,包含的文件如下图
uCOS-II在STM32上的移植步骤
文件夹STM32_StdPeriph为固件驱动文件夹,这个把STM32的固件全都添加进去即可。
文件夹User为其他文件,如下图所示:
uCOS-II在STM32上的移植步骤
文件夹Output和List主要是放那些编译产生的乱七八糟的文件,为了使工程代码更加简洁。
2.使用MDK创建无操作系统工程项目,这一点就不一一说了,将创建后的工程项目文件树截图如下:
uCOS-II在STM32上的移植步骤
      这个时候还没有main文件,那么创建一个mian.c文档即可,这里需要注意,创建main.c后,要将其添加到项目中才行,而不是简单的保存。如下图所示:、
uCOS-II在STM32上的移植步骤
注意:main.c中要有一个mian函数,否则编译器会报错提示你的。然后就是项目的配置,这个还是很重要的,下面分别说需要配置的地方:
(1)Output选项如下:
      uCOS-II在STM32上的移植步骤
这里面勾选了Create HEX File选项,同时将项目输出放到了之前创建的Output文件夹。
(2)List选项,将List产生的文件放入到之前创建的List文件夹中。
(3)C/C++配置选项如下:
uCOS-II在STM32上的移植步骤
其中Define选项中,填入:USE_STDPERIPH_DRIVER,STM32F10X_HD,这是告诉编译器,使用标准外设,还有选择的CPU类型,其中CPU类型需要根据你选择移植的CPU进行适当的更改。Include Paths是要包含的头文件路径,这个为了保险,将项目中的所有有.h的文件的文件夹都包含进去就可以了。
4.Debug选项如下:
uCOS-II在STM32上的移植步骤
,我使用的是Jlink进行烧写调试,所以选择了如图所示,还要进行settings,如下:
uCOS-II在STM32上的移植步骤
这里要勾选“Reset and Run”,这样做的目的是,每当烧写下载后,CPU进行复位并运行。
5.Utilities选项设置如下所示:
uCOS-II在STM32上的移植步骤
至此,配置完毕,编译一下,没有错误,创建一个简单的点亮LED程序,验证一下即可。
备注说明:如果按照这个步骤操作,编译,如果出现一些简单的错误,比如没有main函数,没有发现某个头文件,那么按照提示解决即可,但是如果发现了很多怪怪的编译错误,比如说未定义u32,u8这些符号时,那就要注意一下了,有可能是MDK版本的问题,我在使用MDK低版本的时候,发现有问题,而使用高版本的时候就没问题了,所以需要注意一下。[page]
二、  移植uC/OS-ii到STM32F10X上
1. 首先在官网上下载基于STM32的移植工程案例,里面的移植文档AN-1018中是作者写的移植文档,说的很详细,想要移植的话,多看看这个文档。
2. 其中有张图,非常重要,其实就是告诉了移植者要做的工作,如下图所示:
uCOS-II在STM32上的移植步骤
这个图表达了什么信息呢,其实就是告诉移植者需要将那些文件移植到你的工程当中,首先是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,这个也建议直接舍弃,这个是官方文档中针对他们的的开发板写的一些底层的设备驱动,我们自己的开发板跟他们的不同,所以根本就没必要要,至此,将刚刚分析的这些必须的文件加入到上面创建的无操作系统裸板程序中,进行编译。肯定会有很多错误,下面我们就一一的修改这些错误。添加到项目后的文件树,如下图所示:
uCOS-II在STM32上的移植步骤
需要注意的是,这其中的app.c和app_cfg.h是自己创建的空的文件,而不是使用官网案例里提供的,如果非要使用官网里面的,那么只能不停的更正其中的错误啦。下面就是要修改错误的过程了。
3. 修改os_cfg.h 这个是配置uCOS-ii系统功能的头文件,根据自己的需要进行裁剪任务吧,我只做了一个修改,就是:
                 #define OS_APP_HOOKS_EN           0
,禁用钩子函数,这是为了防止出现那些所谓的文档中分析的要写的那几个钩子函数出现错误,禁用钩子函数了,也就不用写钩子函数了,其他的根据自己需要裁减吧。
4. OS_CPU_A.ASM文件的修改
     首先是修改
uCOS-II在STM32上的移植步骤
这样修改的目的,是因为MDK编程环境不认识PUBLIC,要用EXPORT.
   其次是修改:
uCOS-II在STM32上的移植步骤
这个也是因为编程环境的问题。
5. 修改OS_DBG.C
修改:uCOS-II在STM32上的移植步骤是编程环境的问题。
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. 此时编译,发现还有一个错误:
    未定义 OS_TASK_TMR_PRIO 
           在uCOS-ii源码中查找OS_TASK_TMR_PRIO定义,原来这个定义在源码文件app_cfg.h中,如下所示:
uCOS-II在STM32上的移植步骤
    比葫芦画瓢,复制到自己创建的那个空白app_cfg.h中。然后编译,发现已经还有的错误就是在includes.h中,说没有包含一些的头文件,这个把includes.h中对应错误的那些包含头文件代码删掉即可,这是因为我们没有完全的使用官方案例中的所有文件。至此移植的修改工作告一段落,已经完成。
8. 创建任务,验证移植效果。
     这个可以参照源代码中APP.C进行创建任务,在app_cfg.h中编写各个任务的配置文件,这里需要注意的是,我们之前创建的裸板中已经有main.c文件,其中已经有main.c函数,所以我们在app.c中就不必再创建main函数了,直接在main函数中初始化uCOS-ii,然后创建一个任务,或者调用一个函数,在这个任务或者函数中再创建需要的几个任务即可。案例如下图所示:
uCOS-II在STM32上的移植步骤
     其中需要注意的是,在创建的第一个任务里,一定要先初始化嘀嗒定时器,这个是仿照官方案例中的代码格式写的,直接使用OS_CPU_SysTickInit(),可能在编译的时候,会发现这个嘀嗒定时器初始化启动函数有报错,这个一般是没有包含这个函数中调用的函数,或者直接没有,那么在源代码中搜索这个函数,比葫芦画瓢照抄写就行啦。
另外特别注意,官网代码的创建的第一个开始任务里有一段代码,如下图所示:
uCOS-II在STM32上的移植步骤
这个,调用了OSStatInit()函数,这个函数的作用是启动统计CPU占用率的函数,这个不太清楚还有没有其他功能,建议不要使用,因为我在使用的时候,发现,创建的任务都不能工作了,索性就不使用,反倒好了。
关键字:uCOS-II  STM32  移植步骤 引用地址:uCOS-II在STM32上的移植步骤

上一篇:ARM·UART
下一篇:ARM之协处理器CP15

推荐阅读最新更新时间:2024-03-16 14:39

关于STM32单片机移植FATFS
使用单片机的朋友都知道单片机一般提供的ROM和RAM都比较小。就算是STM32这样的提供256KB flash和64KB RAM的。一旦你需要存一些数据量比较大的文件的时候还是不够用的。一般可以通过外扩SD和nand flash来实现大容量存储。相对来说SD卡的使用更加方便一些。使用过nand flash的也许会知道nand flash有坏块,使用的时候需要做坏块管理,还有就是需要做损耗均衡。不然nand flash很容易就会坏掉。 下面说说SD卡。SD卡驱动有两种方式。一种是SPI驱动方式。还有一种是SDIO驱动方式。SPI驱动时只需要4更线:CLK、SD_CS、MISO、MOSI。SDIO则需要CLK、CMD、Data0、Da
[单片机]
STM32的精准延迟
这里主要是使用Systick 时钟 来实现精准延迟,它本质也是一个 定时器 ,使用时只需复制粘贴使用,这里是使用72M的 STM32 F103ZET6,不同型号需要自行修改对应参数。 #include stm32f10x.h static uint8_t D_us=0; //微妙系数 static uint16_t D_ms=0; //毫秒系数 void Delay_Init(void) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); D_us = SystemCoreClock/8000000; D_ms = (uint16
[单片机]
STM32 时钟RCC相关配置参考stm32f10x_rcc.h
1. 时钟使能配置: RCC_LSEConfig()、RCC_HSEConfig()、 RCC_HSICmd()、RCC_LSICmd()、RCC_PLLCmd()...... 2. 时钟源相关配置: RCC_PLLConfig()、RCC_SYSCLKConfig()、 RCC_RTCCLKConf()..... 3. 分频系数选择配置: RCC_HCLKConfig()、RCC_PCLK1Config()、RCC_PCLK2Config()...... 4. 外设时钟使能: RCC_APB1PeriphClockCmd(); // APB1线上外设时钟使能 RCC_APB2PeriphC
[单片机]
<font color='red'>STM32</font> 时钟RCC相关配置参考stm32f10x_rcc.h
STM32库函数USART波特率计算的问题
STM32的串口波特率计算本来没多大个事,只不过ST的StdPeriph以及后继者STM32Cube计算波特率那块弄得很复杂。写此文的目的是避免新手在这一块被函数库误导了。 STM32F1波特率计算只有一个公式: F2之后的系列有两公式,增加了8倍采样的模式,将16换成8就行。 先说常用的16倍采样。STM32的USART波特率生成支持小数分频,BRR寄存器高12位是整数部分,低4位是小数部分。刚好有4位小数部分,于是: BRR=(PCLK/(16*Baud)) 4=PCLK/Baud,so easy!你看硬件设计师都设计好了,波特率计算就这么简单。这样分频系数截尾误差最大1个bit,4位小数也就是1/16=0.0
[单片机]
<font color='red'>STM32</font>库函数USART波特率计算的问题
STM32 SysTick定时器的1秒钟设计与实现
单片机源程序如下: #include stm32f10x.h #include Delay.h #include smg.h //定义0~9十个数字的字型码表 uint16_t table ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uint16_t wei ={0x0fe,0x0fd,0x0fb,0x0f7,0x0ef,0x0df,0xff,0xff}; //位码; uint8_t i; int main(void) { SMG_Init(); while(1) { for(i=1;i 7;i++)
[单片机]
<font color='red'>STM32</font> SysTick定时器的1秒钟设计与实现
STM32 UART 重映射
在进行原理图设计的时候发现管脚的分配之间有冲突,需要对管脚进行重映射,在手册中了解到STM32 上有很多I/O口,也有很多的内置外设像:I2C,ADC,ISP,USART等 ,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多复用内置的外设的 I/O引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的。 第一次这么干感觉心里没底,所以针对USART1在STM32F103RBT6的板子上实现了一把,以下是相关的测试代码: /***************************************************
[单片机]
STM32之串口原理
串口通信定义   串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。 串口通信原理   串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信
[单片机]
STM32单片机在酒精探测仪的应用
酒后驾车是导致交通事故的一个重要原因,给人们的生活和生命安全带来巨大的危害。为了防止机动车辆驾驶人员酒后驾车,现场实时对人体呼气中酒精含量的检查已日益受到重视。本系统针对现有酒精传感器恢复时间较长的问题,通过计算斜率成功地实现了快速酒精浓度检测,缩短了检测间隔时间,大大提升了酒精检测的效率。 酒精浓度探测仪由单片机、酒精传感器、信号调理电路、语音报警模块、TFTLCD显示模块、通信模块、功放模块等部分组成,结构框图如图1所示。由于语音报警模块和TFTLCD显示模块对于单片机的处理速度和处理数据量要求高,再加上酒精检测反应速度较快,实时性较高,因此采用了ST公司的STM32系列的单片机作为主控端。ME3-C2H5OH电
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved