移植uCOS-II到STM32F103平台
感谢声明
首先感谢wang328452854博主的博客指导,为本次实验提供的帮助。
此外,本篇博客是在此博主的博客uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤的基础进行进一步的完善修改。
移植前准备工作
- uCOS-II源码
- uCOS-II官方移植到STM32F107的Demo
- STM32F103裸机Demo
- 环境:Keil uVision5
- 硬件:M3核
下载地址:
CSDN:http://download.csdn.net/download/wang328452854/10110946
百度云盘: http://pan.baidu.com/s/1eRHYeJo 密码:d1pj
上述材料也均可从官网或者论坛下载
移植过程
若是从百度网盘下载的压缩包可在解压后直接跳到第6步
-
解压压缩包,如下图所示
-
在裸机代码STM32F103_Demo中添加一个目录uCOS-II
-
在uCOS-II目录下新建两个目录Ports和Source
-
将路径:\uCOS-II移植准备目录\Micrium\uCOS-II\Source下的除os_cfg_c.h和os_dbg_r.c全部复制到路径:uCOS-II移植准备目录\STM32F103_Demo\uCOS-II\Source下
此时uCOS-II移植准备目录\STM32F103_Demo\uCOS-II\Source中文件为下图所示
-
将路径:uCOS-II移植准备目录\Micrium_uC-Eval-STM32F107_uCOS-II\Software\uCOS-II\Ports\ARM-Cortex-M3\Generic\RealView下的所有文件拷贝到路径:uCOS-II移植准备目录\STM32F103_Demo\uCOS-II\Ports下
此时移植目录的Ports的内容为
-
将路径:uCOS-II移植准备目录\Micrium_uC-Eval-STM32F107_uCOS-II\Software\EvalBoards\Micrium\uC-Eval-STM32F107\uCOS-II下的三个文件拷贝到路径uCOS-II移植准备目录\STM32F103_Demo\App中
此时路径uCOS-II移植准备目录\STM32F103_Demo\App中的文件如下
-
打开路径:uCOS-II移植准备目录\STM32F103_Demo\Project下的工程
此时工程如下:
-
右键单击APP,点击Add Exiting Files to Group ‘App’,添加路径 :uCOS-II移植准备目录\Micrium_uC-Eval-STM32F107_uCOS-II\Software\EvalBoards\Micrium\uC-Eval-STM32F107\uCOS-II下的这四个文件
-
右键单击STM32F103_Demo,点击Add Group,创建uCOS-II_Source,重复此操作创建uCOS-II_Ports,对应添加路径:uCOS-II移植准备目录\STM32F103_Demo\uCOS-II\Source和uCOS-II移植准备目录\STM32F103_Demo\uCOS-II\Ports下的文件
注意 :添加Source中的文件时不添加ucos_ii.c文件
添加后如图:
-
修改 APP下的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
- 修改APP下的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);
}
}
- 修改uCOS-II_Ports下的os_cpu_a.asm
将 EXPORT OS_CPU_PendSVHandler修改为
EXPORT PendSVHandler
修改的位置
修改后
- 修改Bsp下的bsp_systick.c
添加头文件
#include"includes.h"
修改void SysTick_Init(void)函数
函数位置如下
更改的地方:
SysTick_Config(SystemCoreClock /1000); //滴答时钟定时周期为1ms
更改为:
SysTick_Config(SystemCoreClock /OS_TICKS_PRE_SEC);
修改void SysTick_Handler(void)函数
函数位置如下:
将函数替换为
void SysTick_Handler(void)
{
//sysTickUptime++;
if(OSRunning){
OSIntEnter();
OSTimeTick();
OSIntExit();
}
}
- 修改uCOS-II Ports下的os_cpu_c.c中的关于systick的配置初始化及中断处理部分
位置
将此处更改为
#if 0
#define OS_CPU_CM3_NVIC_ST_CTRL (*((volatile INT32U *)0xE000E010uL)) /* SysTick Ctrl & Status Reg. */
#define OS_CPU_CM3_NVIC_ST_RELOAD (*((volatile INT32U *)0xE000E014uL)) /* SysTick Reload Value Reg. */
#define OS_CPU_CM3_NVIC_ST_CURRENT (*((volatile INT32U *)0xE000E018uL)) /* SysTick Current Value Reg. */
#define OS_CPU_CM3_NVIC_ST_CAL (*((volatile INT32U *)0xE000E01CuL)) /* SysTick Cal Value Reg. */
#define OS_CPU_CM3_NVIC_PRIO_ST (*((volatile INT8U *)0xE000ED23uL)) /* SysTick Handler Prio Reg. */
#define OS_CPU_CM3_NVIC_ST_CTRL_COUNT 0x00010000uL /* Count flag. */
#define OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC 0x00000004uL /* Clock Source. */
#define OS_CPU_CM3_NVIC_ST_CTRL_INTEN 0x00000002uL /* Interrupt enable. */
#define OS_CPU_CM3_NVIC_ST_CTRL_ENABLE 0x00000001uL /* Counter mode. */
#define OS_CPU_CM3_NVIC_PRIO_MIN 0xFFu /* Min handler prio. */
#endif
更改后
将此处内容
更改为
#if 0
void OS_CPU_SysTickHandler (void)
{
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL(); /* Tell uC/OS-II that we are starting an ISR */
OSIntNesting++;
OS_EXIT_CRITICAL();
OSTimeTick(); /* Call uC/OS-II's OSTimeTick() */
OSIntExit(); /* Tell uC/OS-II that we are leaving the ISR */
}
将此处位置(最后)
更改为
void OS_CPU_SysTickInit (INT32U cnts)
{
OS_CPU_CM3_NVIC_ST_RELOAD = cnts - 1u;
/* Set prio of SysTick handler to min prio. */
OS_CPU_CM3_NVIC_PRIO_ST = OS_CPU_CM3_NVIC_PRIO_MIN;
/* Enable timer. */
OS_CPU_CM3_NVIC_ST_CTRL |= OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC | OS_CPU_CM3_NVIC_ST_CTRL_ENABLE;
/* Enable timer interrupt. */
OS_CPU_CM3_NVIC_ST_CTRL |= OS_CPU_CM3_NVIC_ST_CTRL_INTEN;
}
#endif
-
注释掉uCOS-II Ports下的os_cpu.h更改过的部分
注释后
-
更改工程配置
17. 此时编译成功
下载到开发板操作
- 连线
本实验需要三条杜邦线,一条接3.3v电源
另外两条连接LED灯和引脚PB5、PE5
-
通过STMicroelectronics flash loader下载到开发板,下载前需要按下复位,防止下载软件死机。
-
按下复位即可观察到内容
可通过修改main.c中的程序,更改LED灯亮暗的频率
//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,1000);
LED3(OFF);
OSTimeDlyHMSM(0,0,0,1000);
}
}
此时能观察到更加明显的效果
如下图