移植操作系统uCOSIII实现点灯
前言
本次移植需要使用到uCOSIII的源码,在此下载。(官方下载地址)
一、建立stm32 hal库工程
1.GPIO配置。此处选择的是PC13和PB0作为输出口
2.RCC配置
3.SYS配置
4.USART1配置
5.时钟配置
6.项目文件配置
7.至此,项目创建完成
二、uCOSIII文件的引入
1.在项目中创建一个UCOSIII文件,并将uCOSIII源码中的uC-CPU、uCLIB和uCOS-III这三个文件复制进去(此操作是为了之后操作的方便)
2.用KEIL打开项目,我们创建如下图的六个文件
- 我们在bsp中加入文件。
点击Add Files,进入项目文件中的->Core->Src->OS中,找到bsp.c和bsp.h文件加入。同时将OS中的app.c文件添加到Application/User/Core中
- 我们在uCOSIII_CPU中加入文件
点击添加文件,进入我们创建的UCOSIII->uC-CPU,文件类型选择All files,将其中的三个文件加入。接着,打开: ARM-Cortex-M3\RealView, 同样选择 ALL files 文件类型,将三个文件添加进 uCOSIII_CPU 组
uCOS_III中一个有此6个文件
- 我们在uCOSIII_LIB中加入文件
点击 Add Files…按钮, 进入 UCOSIII->uCLIB,选择 ALL files 文件类型,将其中的九个文件添加进 uCOSIII_LIB 组;然后继续打开: Ports/ARM-Cortex-M3/Realview, 添加 lib_mem_a.asm 文件
完成后,uCOSIII_LIB中一共有此10个文件
- 我们在uCOSIII_Ports中加入文件
点击 Add Files…按钮,进入 UCOSIII->Ucos-III->Ports->RAM-Cortex-M3->Generic->RealView。选择 ALL files 文件类型, 将其中三个文件添加进 uCOSIII_Ports 组
- 我们在uCOSIII_Sourc中加入文件
点击Add Files…按钮, 进入 UCOSIII->Ucos-III->Source。选择 ALL files 文件类型, 将其中二十个文件添加进 uCOSIII_Sourc 组
- 我们在
点击 Add Files…按钮, 进入项目文件中的->Core->Src->OS中。选择 ALLfiles 文件类型, 将图中的八个文件添加进 uCOSIII_Sourc 组
- 添加头文件路径
三、文件内容修改
1.bsp.c与bsp.h
- bsp.c
// 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(