一、准备工作:
准备好 uCOS-II源码、uCOS-II官方移植到STM32F107的Demo、STM32F103裸机Demo
下载地址:链接:https://pan.baidu.com/s/1y_v3z5sscQ6kDDGNzNZLtA
提取码:gg05
二、文件预处理:
1.下载解压完成后有以下内容:
2.在裸机代码STM32F103_Demo中添加一个目录uCOS-II
3.在uCOS-II目录下新建两个目录Ports和Source
4.将准备目录下的Micrium\uCOS-II\Source下除os_cfg_c.h和os_dbg_r.c全部复制到移植工程目录下的Source(第3步建成的 \STM32F103_Demo\uCOS-II\Source )下
↓↓↓
5.将准备目录下Micrium_uC-Eval-STM32F107_uCOS-II\Software\uCOS-II\Ports\ARM-Cortex-M3\Generic\RealViem下的全部文件拷贝到移植目录的Ports(第3步建成的 \STM32F103_Demo\uCOS-II\Ports )下
↓↓↓
6.将 Micrium_uC-Eval-STM32F107_uCOS-II\Software\EvalBoards\Micrium\uC-Eval-STM32F107\uCOS-II 目录下的四个文件拷贝到移植工程 STM32F103_DEMO的App目录下
↓↓↓
三、工程移植
1.使用 Keil5 MDK打开移植工程
2.在APP Group下,添加对应的文件
红色方框内是新添加的文件。
3.在工程目录下 新建两个Group uCOS-II_Source uCOS-II_Ports
4.向Group UCOS-II_Source 和 uCOS-II_Ports中添加文件,需要添加的文件为 文件预处理部分,第4、5步已经拷贝过的文件,目录对应即可。
注意,uCOS-II_Source Group中不需要 ucos_ii.c文件
文件添加完成后如下图所示
5.修改如下两条 Include Paths
四、程序修改
1.修改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
*********************************************************************************************************
*/
#ifndef INCLUDES_PRESENT
#define INCLUDES_PRESENT
/*
*********************************************************************************************************
* STANDARD LIBRARIES
*********************************************************************************************************
*/
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/*
*********************************************************************************************************
* LIBRARIES
*********************************************************************************************************
*/
//#include <cpu.h>
//#include <lib_def.h>
//#include <lib_ascii.h>
//#include <lib_math.h>
//#include <lib_mem.h>
//#include <lib_str.h>
/*
*********************************************************************************************************
* APP / BSP
*********************************************************************************************************
*/
#include "bsp.h"
/*
*********************************************************************************************************
* OS
*********************************************************************************************************
*/
#include <ucos_ii.h>
/*
*********************************************************************************************************
* ST
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* INCLUDES END
*********************************************************************************************************
*/
#endif
2.修改main.c
/******************************************************************************
* File : main.c
* Function : 主文件
* Description: None
* Version : V1.00
* Author : WXP
* Date :
* History :
******************************************************************************/
#include "includes.h"
//START 任务
//设置任务优先级
#define START_TASK_PRIO 10 //开始任务的优先级设置为最低
//设置任务堆栈大小
#define START_STK_SIZE 64
//任务堆栈
OS_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *pdata);
//LED0任务
//设置任务优先级
#define LED0_TASK_PRIO 7
//设置任务堆栈大小
#define LED0_STK_SIZE 64
//任务堆栈
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//任务函数
void led0_task(void *pdata);
//LED1任务
//设置任务优先级
#define LED1_TASK_PRIO 6
//设置任务堆栈大小
#define LED1_STK_SIZE 64
//任务堆栈
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 = 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);
}
}
3.修改uCOS-II_Ports下的os_cpu_a.asm
4. 把stm32f10x_it.c中的PendSV_Handler注释掉
5.修改bsp_systick.c
6. 修改os_cpu_c.c中的关于systick的配置初始化及中断处理部分
注意:文件末尾不要忘了留一个空行
7.注释掉os_cpu.h中我们刚才修改过的函数部分
五、结果验证
1.编译程序 无Error,有4个Warning(s),无影响
2.程序烧写
将程序生成的 .hex文件,通过 STMFlashLoader Demo.exe 程序串烧工具,烧写到STM32-M3核心模块,使用杜邦线连接核心模块与LED显示模块(PB5和PE5),即可查看结果:两盏LED灯以不同的频率交替闪烁
这里放一个已经成功的文件链接,有困难的同学可以比照着修改吼
链接:https://pan.baidu.com/s/1aP_db5osWhQttSGbJOHw6A
提取码:zy3d