一、获取uC/OS-III源码
- 到官网下载
进入 Micrium 公司官网下载中心:http://micrium.com/downloadcenter/
二、建立stm32 hal库工程
打开stm32 cubeMX,选择芯片stm32f103c8,配置系统时钟为72M,作为移植测试,将与LED相连的两个端口PB0,PB1配置为GPIO_Output,可根据LED现象作为我们是否移植成功的依据。
生成keil工程后的文件夹:
三、复制uC/OS-III文件到工程文件夹
在生成的keil工程文件夹f103c8_uCOSIII_1_test中新建一个 UCOSIII 的文件夹,将我们下载的源代码中三个文件夹: Uc-CPU、 uC-LIB、 Ucos-III 复制到我们新建的文件夹中:
在Src文件夹下新建一个OS文件夹
将刚才下载源码打开,将路径:\EvalBoards\Micrium\uC-Eval-STM32F107\uCOS-III 下的文件:
app.c 、 app_cfg.h 、 cpu_cfg.h 、 includes.h 、 lib_cfg.h 、 os_app_hooks.c 、os_app_hook.h、os_cfg.h、os_cfg_app.h复制到上一步建立的OS文件夹中,同时新建三个空白文件: bsp.c、bsp.h、app.h
四、添加工程组件和头文件路径
- 添加工程分组
打开f103c8_uCOSIII_1_test工程, 按照如图所示添加六个新的组: bsp、uCOSIII_CPU、 uCOSIII_LIB、 uCOSIII_Ports、 uCOSIII_Source、 OS_cfg
-
添加文件到分组
文件目录是: Src/OS,将其中 bsp.c 和 bsp.h文件添加至 bsp 组中,将 app.c 添加进 Application/User 组中
uCOSIII_CPU 组件, 点击 Add Files…按钮,将文件目录跳转至: UCOSIII/uC-CPU, 选择 ALL files 文件类型,将其中的三个文件点击 Add 添加, 然后再打开: ARM-Cortex-M3\RealView, 同样选择 ALL files 文件类型,将三个文件添加进 uCOSIII_CPU 组
添加 uCOSIII_LIB 组件文件:选择 uCOSIII_LIB 组,点击 Add Files…按钮, 将文件目录跳转至: UCOSIII/uCLIB,选择 ALL files 文件类型,将其中的九个文件添加进 uCOSIII_LIB 组;然后继续打开: Ports/ARM-Cortex-M3/Realview, 添加 lib_mem_a.asm 文件
选择 uCOSIII_Ports 组,点击 Add Files…按钮, 将文件目录调整至: UCOSIII/UcosIII/Ports/RAM-Cortex-M3/Generic/RealView。选择 ALL files 文件类型, 将其中三个文件添加进 uCOSIII_Ports 组
选择uCOSIII_Sourc组,点击Add Files…按钮, 将文件目录调整至: UCOSIII/UcosIII/Source。选择 ALL files 文件类型, 将其中二十个文件添加进 uCOSIII_Sourc 组。
选择 OS_cfg 组,点击 Add Files…按钮, 将文件目录调整至: Src/OS。选择 ALLfiles 文件类型, 将图中的八个文件添加进 uCOSIII_Sourc 组
全部组件文件添加完成以后的工程文件结构:
五、修改文件内容
-
启动文件
-
app_cfg.h
第一处修改:
修改前
#define APP_CFG_SERIAL_EN DEF_ENABLED
修改后
#define APP_CFG_SERIAL_EN DEF_DISABLED
第二处修改:
修改前
#define APP_TRACE BSP_Ser_Printf
修改后
#define APP_TRACE (void) -
includes.h
第一处修改: 添加相关头文件
修改前
#include <bsp.h>
修改后
#include <bsp.h>
#include “gpio.h”
#include “app_cfg.h”
#include “app.h”
第二处修改: 添加HAL 库
修改前
#include <stm32f10x_lib.h>
修改后
#include “stm32f1xx_hal.h” -
bsp.c和bsp.h
直接复制下面的代码:
// bsp.c
#include "includes.h"
#define DWT_CR *(CPU_REG32 *)0xE0001000
#define DWT_CYCCNT *(CPU_REG32 *)0xE0001004
#define DEM_CR *(CPU_REG32 *)0xE000EDFC
#define DBGMCU_CR *(CPU_REG32 *)0xE0042004
#define DEM_CR_TRCENA (1 << 24)
#define DWT_CR_CYCCNTENA (1 << 0)
CPU_INT32U BSP_CPU_ClkFreq (void)
{
return HAL_RCC_GetHCLKFreq();
}
void BSP_Tick_Init(void)
{
CPU_INT32U cpu_clk_freq;
CPU_INT32U cnts;
cpu_clk_freq = BSP_CPU_ClkFreq();
#if(OS_VERSION>=3000u)
cnts = cpu_clk_freq/(CPU_INT32U)OSCfg_TickRate_Hz;
#else
cnts = cpu_clk_freq/(CPU_INT32U)OS_TICKS_PER_SEC;
#endif
OS_CPU_SysTickInit(cnts);
}
void BSP_Init(void)
{
BSP_Tick_Init();
MX_GPIO_Init();
}
#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
void CPU_TS_TmrInit (void)
{
CPU_INT32U cpu_clk_freq_hz;
DEM_CR |= (CPU_INT32U)DEM_CR_TRCENA; /* Enable Cortex-M3's DWT CYCCNT reg. */
DWT_CYCCNT = (CPU_INT32U)0u;
DWT_CR |= (CPU_INT32U)DWT_CR_CYCCNTENA;
cpu_clk_freq_hz = BSP_CPU_ClkFreq();
CPU_TS_TmrFreqSet(cpu_clk_freq_hz);
}
#endif
#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
CPU_TS_TMR CPU_TS_TmrRd (void)
{
return ((CPU_TS_TMR)DWT_CYCCNT);
}
#endif
#if (CPU_CFG_TS_32_EN == DEF_ENABLED)
CPU_INT64U CPU_TS32_to_uSec (CPU_TS32 ts_cnts)
{
CPU_INT64U ts_us;
CPU_INT64U fclk_freq;
fclk_freq = BSP_CPU_ClkFreq();
ts_us = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);
return (ts_us);
}
#endif
#if (CPU_CFG_TS_64_EN == DEF_ENABLED)
CPU_INT64U CPU_TS64_to_uSec (CPU_TS64 ts_cnts)
{
CPU_INT64U ts_us;
CPU_INT64U fclk_freq;
fclk_freq = BSP_CPU_ClkFreq();
ts_us = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);
return (ts_us);
}
#endif
// bsp.h
#ifndef __BSP_H__
#define __BSP_H__
#include "stm32f1xx_hal.h"
void BSP_Init(void);
#endif
- app.c和app.h
// app.c
#include <includes.h>
// app.h
#ifndef __APP_H__
#define __APP_H__
#include <includes.h>
#endif /* __APP_H__ */
这样就完成了