文章目录
一、UCOSIII介绍
1、简介
UCOS是Micrium公司出品的RTOS类实时操作系统, UCOS目前有两个版本:
UCOSII和UCOSIII。
UCOSIII是一个可裁剪、可剥夺型的多任务内核,而且没有任务数限制。
UCOSIII提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等。
UCOSIII是用C和汇编来写的,其中绝大部分都是用C语言编写的,只有极少数的与处理器密切相关的部分代码才是用汇编写的, UCOSIII结构简洁,可读性很强!最主要的是非常适合初次接触嵌入式实时操作系统学生、嵌入式系统开发人员和爱好者学习。
2、UCOSIII中的任务
组成
任务堆栈 任务控制块 任务函数
任务堆栈
上下切换的时候用来保存任务工作环境(STM32内部寄存器)
任务控制块
记录任务的各个属性
任务函数
用户编写的任务处理代码(干活的)
系统任务组成
空闲任务 时钟节拍任务 统计任务 定时任务 中断服务管理任务
空闲任务
UCOSIII创建的第一个任务,UCOSIII必须创建的任务,此任务由UCOSIII自动创建
时钟节拍任务
必选任务
统计任务
可选任务 作用:统计CPU使用率和各个任务的堆栈使用量 由 OS_CFG_STAT_TASK_EN控制
定时任务
可选任务 作用:提供定时服务 由OS_CFG_TMR_EN控制
中断服务管理任务
可选任务 由OS_CFG_ISR_POST_DEFERRED_EN控制
二、将uc/OS-III移植到stm32f103c8
1、创建CubeMx工程
(1) 打开stm32 cubeMX,选择芯片stm32f103c8,配置系统时钟为72M.
(2) 配置RCC、SYS
(3) 串口配置
本实验设置PA3,PC13
作为两个LED灯的端口
将与LED相连的两个端口PA3 PC13配置为GPIO_Output,可根据LED现象作为是否移植成功的依据。
2、进行uCOS-III的移植
(1) 从百度网盘上下载源码
链接地址:https://pan.baidu.com/s/10RqsDRecbmVteWmDv2oUNQ
提取码:1234
(2) 打开下载下来的文件
将选中的文件复制并粘贴到上面创建的hal库MDK-ARM文件中
(3) 打开CubeMx生成的Keil文件
点击Manage Project Items
,按下图所示操作,为项目新建文件夹,在对应文件夹下添加文件。
点击CPU–>Add Files…
MDK-ARM\uC-CPU
路径下选中以下文件,Add添加
一定要记得点ALL files
MDK-ARM\uC-CPU\ARM-Cortex-M3\RealView
路径下选中以下文件,Add添加
点击LIB–>Add Files…
MDK-ARM\uC-LIB
路径下选中下图红框文件,Add添加
MDK-ARM\uC-LIB\Ports\ARM-Cortex-M3\RealView
路径下选中下图绿框文件,Add添加
点击PORT–>Add Files…
MDK-ARM\uCOS-III\Ports\ARM-Cortex-M3\Generic\RealView
路径下选中以下文件,Add添加
点击SOURCE–>Add Files…
MDK-ARM\uCOS-III\Source
路径下选中以下全部 .c .h 文件,Add添加
点击CONFIG–>Add Files…
MDK-ARM\uC-CONFIG
路径下选中以下全部文件,Add添加
点击BSP–>Add Files…
MDK-ARM\uC-BSP
路径下选中以下全部文件,Add添加
全部添加完成之后,一定要点击OK。
(4) 导入文件路径
三、构建三个任务
1、代码添加
(1) 为bsp.c和bsp.h添加代码
bsp.h
#ifndef __BSP_H__
#define __BSP_H__
#include "stm32f1xx_hal.h"
void BSP_Init(void);
#endif
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);
}