uc/OS-III移植到stm32f103c8进行多任务实验

本文详细介绍了如何将实时操作系统UCOS-III移植到STM32F103C8单片机上,从创建CubeMX工程、配置系统时钟和GPIO,到下载源码、添加文件,再到构建和初始化任务,最后展示了实验结果。通过此过程,读者可以了解UCOS-III的移植步骤和操作思路。
摘要由CSDN通过智能技术生成

一、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);
}
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值