前言:
说点废话,网上有很多关于uCOS-ii移植的文章,好多都是千篇一律,理论性很强,分析了一大堆虚头巴脑的东西,实操性严重欠缺,这方面我也走了很多弯路,下面就将自己的移植过程一步步的记录下来,也给大家做做参考。
首先,简单总结一下移植的大概过程:
(1)去uC/OS-ii官网下载你要移植芯片CPU的相关案例,不一定完全对应,那就找相应系列吧。
(2)编程环境一般有两种,分别是IAR和MDK,这个根据你自己的编程环境进行下载。
(3)本案例需要将uC/OS-II移植到STM32F103RCT6上,而我使用的编程环境是MDK,很遗憾,官网上提供的案例是基于IAR的,所以要基于IAR的案例进行更改。
(4)使用MDK创建一个无操作系统的最简单程序,确保这个程序能够使用,这样做的目的是为了一步步的排查错误,假如无操作系统时,都有错误,移植过程中也肯定会有编译错误,那么在排查错误的时候也就增加了难度,不会写无操作系统的简单程序怎么办。。。那就不要往下看了。
(5)移植的最大的改动主要有两部分,一个是一些头文件的增减,另外一个就是向量表中PendSV_Handler和SysTick_Handler的修改。这里我要吐槽一下,网上说了一大堆关于什么OS_CPU.H的更改还有各种函数的的分析,这都是扯淡。。。这些根本就不用移植者去修改,官网提供的案例都已经提供了,除非你选择移植的CPU是比较偏的,那么这些东西需要移植者自己去编写。
好了,下面就开始详细的记录怎么去移植。
一、创建一个无操作系统的简单裸板系统
1.创建源文件工程文件夹,如下图所示:
文章图片
其中文件夹“CORE”为内核的接口,包含如下文件:
文章图片
文件夹DRIVER为硬件驱动文件,本程序中包含LED.c和LED.h文件;
文件夹FWLIB为固件驱动文件夹,这个把STM32的固件全都添加进去即可;
文件夹PROJECT存放工程相关文件;
文件夹SYSTEM为系统初始化文件夹,包含如下文件:
文章图片
文件夹uCOSII放uc/os系统相关文件;
文件夹USER为用户文件,包含如下文件:
文章图片
2.使用MDK创建无操作系统工程项目,这一点就不一一说了,将创建后的工程项目文件树截图如下:
文章图片
然后就是项目的配置,这个还是很重要的,下面分别说需要配置的地方:
(1)Output选项如下:
文章图片
这里面勾选了Create HEX File选项,同时将项目输出放到了之前创建的Output文件夹。
(2)List选项,将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程序,验证一下即可。
二、移植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,其他的,可以自己编写,为什么不套用另外那几个呢,主要是因为那几个文件是针对官方开发板创建的任务,里面包含的信息量太大,编译的时候,肯定会有大量的错误,因为我们是移植到我们自己的板子,所以不需要。至此,将刚刚分析的这些必须的文件加入到上面创建的无操作系统裸板程序中,进行编译。肯定会有很多错误,下面我们就一一的修改这些错误。添加到项目后的文件树,如下图所示:
文章图片
3. 修改os_cfg.h 这个是配置uCOS-ii系统功能的头文件,根据自己的需要进行裁剪任务吧,我只做了一个修改,就是#define OS_APP_HOOKS_EN0,禁用钩子函数,这是为了防止出现那些所谓的文档中分析的要写的那几个钩子函数出现错误,禁用钩子函数了,也就不用写钩子函数了,其他的根据自己需要裁减吧。
4. OS_CPU_A.ASM文件的修改
首先是修改
文章图片
为
文章图片
这样修改的目的,是因为MDK编程环境不认识PUBLIC,要用EXPORT.
其次是修改:
RESG CODE:CODE:NOROOT(2)
为:
文章图片
这个也是因为编程环境的问题。
5. 修改OS_DBG.C
修改:#define OS_COMPILER_OPT__root
为:#define OS_COMPILER_OPT
,原因也是编程环境的问题。
6. 修改启动代码
这个步骤是移植的核心:上面说的其他的修改,都是一些附属的格式方面的修改,而启动代码的修改才是移植的核心,这里简单的分析2个问题,一是,什么叫移植,二是移植的操作系统如何能够被我们的工程所应用。所谓移植,打一个恰当的比喻——器官移植,就是将A的器官移植到B身上,使A的器官能够为B所用。所以移植绝对不是简单的“复制”,不仅要放到你的工程项目中,更重要的是要能够和你的项目建立联系。那么uCOS-ii怎么跟STM32建立联系呢?
uCOS-ii的核心作用就是任务调度,要使用STM32的一个特殊中断——PendSV,就是可挂起系统任务中断,通过该中断进行系统的调度。还有就是uCOS-ii需要一个基准时间,那么STM32中有一个专用的定时器,嘀嗒定时器SysTick,这个定时器,就是专为操作系统而设计的,通过这个滴答定时器给uCOS-ii提供一个时间基准,每隔固定的时间出发一个PendSV中断,进行任务的调度。所以呢,在官方案例的移植文档AN-1018中也特别提到这一点,要将startup_stm32f10x_hd.s启动代码中所有“PendSV_Handler”和“SysTick_Handler”,替换成“OS_CPU_PendSVHandler”和“OS_CPU_SysTickHandler”,这样就相当于将uCOS-ii的“神经”跟你的项目的“神经”搭在了一起。
7. 编写OS_CPU_SystickHandler函数
文章图片
8. 创建任务,验证移植效果。
文章图片
【stm32|uCOS-II移植到STM32上的详细步骤】其中需要注意的是,在创建的第一个任务里,一定要先初始化嘀嗒定时器,至此移植完成,验证成功。
代码下载地址http://download.csdn.net/detail/linis_yes/9615317
推荐阅读
- stm32|基于STM32和freeRTOS智能门锁设计方案
- 日常分享|共享充电宝方案原理,具体部件组成以及主控MUC参数
- #|ARM裸机开发(汇编LED灯实验(I.MX6UL芯片))
- ucos ii信号量的理解
- STM32|STM32的四种IO输出模式
- STM32 远程升级(ISP / IAP)
- stm32|stm32f103can总线过滤器配置
- STM32CubeMX配置SDIO模式(非DMA方式)
- STM32|如何建一个STM32F030标准库工程模板
- STM32 时钟RCC相关配置参考stm32f10x_rcc.h