STM32F103C8T6基于HAL库移植uCOS

本文详细介绍了如何将uCOS-III实时操作系统移植到STM32F103C8T6芯片上,基于HAL库进行操作。首先,介绍了uCOS-III的基本概念和任务管理功能。接着,提供了下载uCOS-III源码的途径,并指导新建项目文件。然后,使用CubeMX配置STM32F103C8T6工程,设置GPIO和USART。在HAL库工程中移植uCOS-III文件,并逐步解释了添加和修改相关代码的过程,包括启动文件、配置参数、任务创建等。最终实现了三个不同周期的任务运行,分别控制LED灯和串口通信。文章结尾强调了移植过程的注意事项,并鼓励读者深入学习uCOS-III的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

目录

使用 CubeMX 建立 STM32F103 HAL 库工程

5 为 HAL 库工程移植文件

5.1 为 HAL 工程配置 uCOS 相关文件

将 uCOS 相关文件添加到项目

 实现三个任务运行【进阶】1 目标要求

总结


1 uC/OS-III 多任务系统简介

    uC/OS 是 Micrium 公司出品的 RTOS 类实时操作系统,uC/OS 目前有两个版本:uC/OS-II 和 uC/OS-III。
    uC/OS-III 是一个可裁剪、可剥夺型的多任务内核,而且没有任务数限制。
    uC/OS-III 提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等。
    uC/OS-III 是用 C 和汇编来写的,其中绝大部分都是用 C 语言编写的,只有极少数的与处理器密切相关的部分代码才是用汇编写的, uC/OS-III 结构简洁,可读性很强!

    uC/OS-III 任务管理
    ① uC/OS-III 创建任务。
    创建任务就是将任务控制块、任务堆栈、任务代码等联系在一起,并且初始化任务控制块的相应字段。在 uC/OS-III 中通过函数 OSTaskCreate() 来创建任务。
    ② uC/OS-III 任务删除。
    OSTaskDel() 函数用来删除任务,当一个任务不需要运行的话,我们就可以将其删除掉,删除任务不是说删除任务代码,而是 uC/OS-III 不再管理这个任务。
    ③ uC/OS-III 任务挂起。
    有时候有些任务因为某些原因需要暂停运行,但是以后还要运行,因此就不能删除掉任务,这里可以使用 OSTaskSuspend() 函数挂起这个任务,以后再恢复运行。
    ④ uC/OS-III 任务恢复。
    OSTaskResume() 函数用来恢复被 OSTaskSuspend() 函数挂起的任务, OSTaskResume() 函数是唯一能恢复被挂起任务的函数。
    ⑤ uC/OS-III 时钟片轮转调度。
    uC/OS-III 是支持多个任务拥有同一个优先级的,这些任务采用时间片轮转调度方法进行任务调度。在 os_cfg.h 文件中有个宏 OS_CFG_SCHED_ROUND_ROBIN_EN,使用时间片轮转调度就需要将 OS_CFG_SCHED_ROUND_ROBIN_EN 定义为 1 ,这样 uC/OS-III 中有关时间片轮转调度的代码才会被编译,否则不能使用时间片轮转调度。

2 准备 uC/OS-III 源码

    官网下载:http://micrium.com/downloadcenter/
    官网下载比较麻烦,这里提供网盘链接,可直接下载。
    百度网盘下载
    链接:https://pan.baidu.com/s/1bz15YwXgSfqO1cnelcAcZA
    提取码:luha

3 准备项目文件

    新建文件夹
    下载好 uC/OS-III 源码文件之后,在下面所示的文件夹里新建两个文件夹 uC-BSP 和 uC-CONFIG,方便后面使用。

为 uC-BSP 文件夹添加文件
在 uC-BSP 文件夹中新建 bsp.c 和 bsp.h 空文件,等之后再用 

 

为 uC-CONFIG 文件夹添加文件
将“Micrium\Software\EvalBoards\Micrium\uC-Eval-STM32F107\uCOS-III”文件路径里框住的文件(共 8 个)全部复制到刚才新建的 uC-CONFIG 文件夹,app.c 里是 main 函数。

 

 

使用 CubeMX 建立 STM32F103 HAL 库工程

这里选择的芯片是 STM32F103C8T6。

 配置 SYS

 配置引脚
设置 PC13 引脚为 GPIO_Output 来点亮 LED 灯。

配置串口 USART1 

命名工程文件并设置
这里我命名为“ uC ” 

 在 main.c 文件的 while 循环里添加下面代码

while (1)
  {
    /* USER CODE END WHILE */
    
    /* USER CODE BEGIN 3 */
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
		HAL_Delay(500);
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
		HAL_Delay(500);
  }
  • 编译烧录后,可以发现 PC13 引脚的 LED 灯闪烁,说明代码没有问题。

5 为 HAL 库工程移植文件

5.1 为 HAL 工程配置 uCOS 相关文件

  • 将 uCOS 相关文件(共 5 个)复制到 HAL 工程的 MDK-ARM 文件夹下。

 

将 uCOS 相关文件添加到项目

  • 打开 keil5 工程,点击 Manage Project Items 添加项目

 

 为上面新建的项目分别添加文件
① 点击 CPU –> Add Files…,按照如下方式,选中 4.1 部分中添加的 uC-CPU 中的文件(共 6 个),最后点击 Add

 

 依次操作同上,注意细心

 记得最后点击 OK 保存关闭

效果如下:

按照如下依次导入文件路径 

 

添加修改代码

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_ClkFre
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值