1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤

I.说明
作者:WXP(翱翔云端的鸟)
联系方式:328452854@qq.com || 13100610853(联系请注明CSDN)
申明:个人原创,转载请先经过本人同意!
要说的话:个人水平有限,写之前也看过许多大神的博客,不足之处,还请指正!有疑问欢迎大家联系我交流探讨!



II.环境
软件环境:KEIL-MDK v-5.24a
硬件:STM32F103ZET6最小系统板



III.uCOS-II

1.uCOS简介
uCOS(也有人叫uC/OS)由美国人 Jean Labrosse在1992年编写的一个实时操作系统
1998年更新到uCOS-II,并于2000年得到美国航天管理局(FAA)认证,可以用于飞行器中.
官方网站:www.micrium.com

2.uCOS-II的特点

(1)可裁剪
uCOS-II源代码中有一个专门用来裁剪系统的配置文件,通过各种宏的来打开或者
关闭那些不需要用到系统服务,这样可以大大减小平台移植uCOS-II所需要的存储空间

(2) 便于移植
uCOS-II基本全部是用C语言写的,只有和微处理器相关的那部分是用汇编写的,汇编
所占比例极小,从而使得uCOS-II便于移植到各种微处理器上.事实上uCOS-II已经运用
在了大部分的8位、16位、32位的MCU中了

(3) 抢占式
uCOS-II是支持抢占式,系统总是运行多个任务中优先级别最高的那个就绪任务,高
优先级会就绪任务会抢占正在运行的任务,实时性得以保证

(4) 多任务
uCOS-II同时支持255个任务,实际上不会用到这么多,看具体应用来决定

(5) 稳定可靠
uCOS-II已经被使用在很多的产品上,经过市场产品的实际检测,具有很好的稳定
性和可靠性

3.uCOS-II的内核对象

⊙ 信号量
⊙ 互斥信号量
⊙ 事件标志
⊙ 消息邮箱
⊙ 消息队列
⊙ 内存管理
⊙ 时钟管理
⊙ 任务管理

4.uCOS-II的文件结构

⊙ 与处理器无关的代码
os_core.c
os_flag.c
os_mbox.c
os_mem.c
os_mutex.c
os_q.c
os_sem.c
os_task.c
os_time.c
os_tmr.c
ucos_ii.h
⊙ 与处理相关的代码(移植时需要修改)
os_cpu_c.c
os_cpu_a.asm
os_cpu.h
⊙ 与应用程序相关的代码
os_cfg.h
includes.h



IV.移植uCOS-II到STM32F103
1. uCOS-II移植准备工作

准备好uCOS-II源码、uCOS-II官方移植到STM32F107的Demo、STM32F103裸机Demo
下载地址:
CSDN:http://download.csdn.net/download/wang328452854/10110946
百度云盘: http://pan.baidu.com/s/1eRHYeJo密码:d1pj
当然也可以从官网或者论坛下载,然后用你自己的裸机历程也是可以的.








2. uCOS-II移植
(1) 若是按照我的代码,解压后如下图所示

1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片


















(2) 在裸机代码STM32F103_Demo中添加一个目录uCOS-II
1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片



(3)uCOS-II,并在uCOS-II目录下新建两个目录Ports和Source
1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片




(4) 将准备目录下的Micrium\uCOS-II\Source下除os_cfg_c.h和os_dbg_r.c全部复制到移植工程目录下的Source下
1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片


1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片









(5) 将准备目录下Micrium_uC-Eval-STM32F107_uCOS-II\Software\uCOS-II\Ports\ARM-Cortex-M3\Generic\RealViem下的全部文件拷贝到移植目录的Ports下

1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片


1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片














(6) Micrium_uC-Eval-STM32F107_uCOS-II\Software\EvalBoards\Micrium\uC-Eval-STM32F107\uCOS-下的三个文件拷贝到移植工程的App目录下
1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片



1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片











(7) 用MDK打开移植工程,新建GroupuCOS-II_Source uCOS-II_Ports并添加对应文件如下
1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片

上图中比之前多了app_hooks.c,主要是一些钩子函数,若是需要从第6步中拷贝到App下添加即可
1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片




(8) 修改includes.h 如下

/* ********************************************************************************************************* *EXAMPLE CODE * *(c) Copyright 2003-2013; Micrium, Inc.; Weston, FL * *All rights reserved.Protected by international copyright laws. *Knowledge of the source code may NOT be used to develop a similar product. *Please help us continue to provide the Embedded community with the finest *software available.Your honesty is greatly appreciated. ********************************************************************************************************* */ /* ********************************************************************************************************* * *MASTER INCLUDES * *ST Microelectronics STM32 *on the * *Micrium uC-Eval-STM32F107 *Evaluation Board * * Filename: includes.h * Version: V1.00 * Programmer(s) : EHS ********************************************************************************************************* */ #ifndefINCLUDES_PRESENT #defineINCLUDES_PRESENT /* ********************************************************************************************************* *STANDARD LIBRARIES ********************************************************************************************************* */ #include #include #include #include /* ********************************************************************************************************* *LIBRARIES ********************************************************************************************************* */ //#include //#include //#include //#include //#include //#include /* ********************************************************************************************************* *APP / BSP ********************************************************************************************************* */ #include"bsp.h" /* ********************************************************************************************************* *OS ********************************************************************************************************* */ #include /* ********************************************************************************************************* *ST ********************************************************************************************************* */ /* ********************************************************************************************************* *INCLUDES END ********************************************************************************************************* */ #endif







(9)修改main.c如下

/****************************************************************************** * File: main.c * Function: 主文件 * Description: None * Version: V1.00 * Author: WXP * Date: * History: ******************************************************************************/ #include "includes.h" //START 任务 //设置任务优先级 #define START_TASK_PRIO10 //开始任务的优先级设置为最低 //设置任务堆栈大小 #define START_STK_SIZE64 //任务堆栈 OS_STK START_TASK_STK[START_STK_SIZE]; //任务函数 void start_task(void *pdata); //LED0任务 //设置任务优先级 #define LED0_TASK_PRIO7 //设置任务堆栈大小 #define LED0_STK_SIZE64 //任务堆栈 OS_STK LED0_TASK_STK[LED0_STK_SIZE]; //任务函数 void led0_task(void *pdata); //LED1任务 //设置任务优先级 #define LED1_TASK_PRIO6 //设置任务堆栈大小 #define LED1_STK_SIZE64 //任务堆栈 OS_STK LED1_TASK_STK[LED1_STK_SIZE]; //任务函数 void led1_task(void *pdata); int main(void) { Bsp_Init(); OSInit(); OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO ); //创建起始任务 OSStart(); while(1) { } } //开始任务 void start_task(void *pdata) { OS_CPU_SR cpu_sr=0; pdata = https://www.it610.com/article/pdata; OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断) OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO); OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO); OSTaskSuspend(START_TASK_PRIO); //挂起起始任务. OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断) } //LED0任务 void led0_task(void *pdata) { while(1) { LED2(ON); OSTimeDlyHMSM(0,0,0,200); LED2(OFF); OSTimeDlyHMSM(0,0,0,200); } } //LED1任务 void led1_task(void *pdata) { while(1) { LED3(ON); OSTimeDlyHMSM(0,0,0,500); LED3(OFF); OSTimeDlyHMSM(0,0,0,500); } }





(10) 修改uCOS-II_Ports下的os_cpu_a.asm
1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片


1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片





(11) 编译会出现一个错误,重定义了PendSV_Handler
1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片



这个时候只需要把stm32f10x_it.c中的PendSV_Handler注释掉即可
1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片



此时编译不会报错但是并未修改完成

(12) 修改bsp_systick.c
1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片
1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片
1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片




(13) 修改os_cpu_c.c中的关于systick的配置初始化及中断处理部分
1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片
1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片



1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片







(14) 注释掉os_cpu.h中我们刚才修改过的函数部分
1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤
文章图片


【1.uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤】至此移植步骤完成了,main.c中两个LED任务,下载到开发板中可以看到两个灯以不同频率闪烁

    推荐阅读