移植uCOS-II到STM32F103平台攻略

移植uCOS-II到STM32F103平台

感谢声明

首先感谢wang328452854博主的博客指导,为本次实验提供的帮助。
此外,本篇博客是在此博主的博客uCOS-II简介及移植uCOS-II到STM32F103平台详细步骤的基础进行进一步的完善修改。

移植前准备工作

  1. uCOS-II源码
  2. uCOS-II官方移植到STM32F107的Demo
  3. STM32F103裸机Demo
  4. 环境:Keil uVision5
  5. 硬件:M3核

下载地址:
CSDN:http://download.csdn.net/download/wang328452854/10110946

百度云盘: http://pan.baidu.com/s/1eRHYeJo 密码:d1pj
上述材料也均可从官网或者论坛下载

移植过程

若是从百度网盘下载的压缩包可在解压后直接跳到第6步

  1. 解压压缩包,如下图所示
    在这里插入图片描述

  2. 在裸机代码STM32F103_Demo中添加一个目录uCOS-II在这里插入图片描述

  3. 在uCOS-II目录下新建两个目录Ports和Source
    在这里插入图片描述

  4. 将路径:\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中文件为下图所示
    在这里插入图片描述

  5. 将路径: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的内容为
    在这里插入图片描述

  6. 将路径: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中的文件如下
    在这里插入图片描述

  7. 打开路径:uCOS-II移植准备目录\STM32F103_Demo\Project下的工程
    此时工程如下:
    在这里插入图片描述

  8. 右键单击APP,点击Add Exiting Files to Group ‘App’,添加路径 :uCOS-II移植准备目录\Micrium_uC-Eval-STM32F107_uCOS-II\Software\EvalBoards\Micrium\uC-Eval-STM32F107\uCOS-II下的这四个文件
    在这里插入图片描述
    在这里插入图片描述

  9. 右键单击STM32F103_Demo,点击Add Group,创建uCOS-II_Source,重复此操作创建uCOS-II_Ports,对应添加路径:uCOS-II移植准备目录\STM32F103_Demo\uCOS-II\SourceuCOS-II移植准备目录\STM32F103_Demo\uCOS-II\Ports下的文件
    注意 :添加Source中的文件时不添加ucos_ii.c文件
    添加后如图:
    在这里插入图片描述

  10. 修改 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
  1. 修改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);
}
}
  1. 修改uCOS-II_Ports下的os_cpu_a.asm
    EXPORT OS_CPU_PendSVHandler修改为
  EXPORT  PendSVHandler

修改的位置
在这里插入图片描述
修改后
在这里插入图片描述

  1. 修改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();
	}
}
  1. 修改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

在这里插入图片描述

  1. 注释掉uCOS-II Ports下的os_cpu.h更改过的部分
    在这里插入图片描述
    注释后
    在这里插入图片描述

  2. 更改工程配置
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
17. 此时编译成功
在这里插入图片描述

下载到开发板操作

  1. 连线
    本实验需要三条杜邦线,一条接3.3v电源
    另外两条连接LED灯和引脚PB5、PE5
    在这里插入图片描述

在这里插入图片描述

  1. 通过STMicroelectronics flash loader下载到开发板,下载前需要按下复位,防止下载软件死机。
    在这里插入图片描述

  2. 按下复位即可观察到内容
    可通过修改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);
}
}

此时能观察到更加明显的效果
如下图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值