STM32移植ucos-III并实现多任务——HAL

本文详细介绍了如何将uC/OS-III实时操作系统移植到STM32 HAL库,从uC/OS-III的介绍、STM32CubeMX新建工程、Keil中移植步骤,到文件修改和代码编写,最后展示了实际效果和操作系统的学习心得。


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


一、uC/OS-III简介

1、什么是uC/OS-III

  • uC/OS-III(Micro C OS Three 微型的C 语言编写的操作系统第3版)是一个可升级的可固化的,基于优先级的实时内核。它对任务的个数无限制。uC/OS-III 是一个第3 代的系统内核,支持现代的实时内核所期待的大部分功能。例如资源管理,同步,任务间的通信等等。然而,uC/OS-III 提供的特色功能在其它的实时内核中是找不到的,比如说完备的运行时间测量性能,直接地发送信号或者消息到任务,任务可以同时等待多个内核对象等。
  • uC/OS-III 是一个可扩展的,可固化的,抢占式的实时内核,它管理的任务个数不受限制。它是第三代内核,提供了现代实时内核所期望的所有功能包括资源管理、同步、内部任务交流等。uC/OS-III 也提供了很多特性是在其他实时内核中所没有的。比如能在运行时测量运行性能,直接得发送信号或消息给任务,任务能同时等待多个信号量和消息队列。

2、uC/OS-III的特点

  • 抢占式多任务处理
    uC/OS-III是一个抢占式多任务处理的内核,因此,uC/OS-III正在运行的经常是最重要的就绪任务。
  • 源代码
    uC/OS-III 完全根据ANSI-C 标准写的。代码的规范是Micrium 团队的一种文化。虽然很多商业内核供应商提供他们产品的源代码,但是这些产品很有可能是笨重且难以利用的。除非代码严格地遵循标准并且产品有完整的带例子的说明书以展示代码是怎样工作的。
  • 应用程序接口(API)
    uC/OS-III 是很直观的。如果你熟悉类似的编码规范,你能轻松地知道函数名所对应的服务,以及需要怎样的参数。例如:指向对象的指针通常是第一个参数,指向错误代码的指针通常是最后一个参数。
  • 快速响应中断
    uC/OS-III 有一些内部的数据结构和变量。uC/OS-III 保护临界段可以通过锁定调度器代替关中断。因此关中断的时间会非常少。这样就使uC/OS-III 可以响应一些非常快的中断源了。
  • 可扩展性
    根据应用的需求,代码大小可以被调整。编译时通过调整uC/OS-III 源代码中的大约40 个#define(见OS_CFG.H)可以在添加或移除一些功能。uC/OS-III 的服务还提供一些实时检查功能。特别的,uC/OS-III 能检传递的参数是否为NULL 指针,ISR 是否就绪了任务级服务。参数有允许范围,指定选项都是有用的。检测功能可以被关闭(在编译时)以提供更好的性能和缩减代码大小。实际上,可扩展的uC/OS-III 支持更广泛的应用和项目。
  • 易移植性
    uC/OS-III 可以被移植到大部分的CPU 架构中。大部分的支持uC/OS-II 的器件通过改动就能支持uC/OS-III。而uC/OS-II已经移植到45 种CPU 架构中了。
  • 任务数量无限制
    uC/OS-III 对任务数量无限制。实际上,任务的数量限制于处理器能提供的内存大小。每一个任务需要有自己的堆栈空间,uC/OS-III 在运行时监控任务堆栈的生长。uC/OS-III 对任务的大小无限制,
  • 优先级无限制
    uC/OS-III 对优先级的数量无限制。然而,配置uC/OS-III 的优先级在32 到256 之间已经满足大多数的应用了。
  • 可实时配置性
    uC/OS-III 允许用户在运行时配置内核。特别的,所有的内核对象如任务、堆栈、信号量、事件标志组、消息队列、消息、互斥信号量、内存分区、软件定时器等都是在运行时分配的,以免在编译时的过度分配。
  • 挂起多个对象
    uC/OS-III 允许任务等待多个事件的发生。特别的,任务可以同时等待多个信号量和消息队列被提交。等待中的任务在事件发生的时候被唤醒。
  • 可优化性
    uC/OS-III 被设计于能够根据CPU 的架构被优化。uC/OS-III 所用的大部分数据类型能够被改变,以更好地适应CPU 固有的字大小。优先级调度法则可以通过编写一些汇编语言而获益于一些特殊的指令如位设置、位清除、计数清零指令(CLZ),find-first-one(FF1)指令。

二、基于HAL库stm32移植uC/OS-III

1、STM32CubeMX新建一个工程

  • New Project
    在这里插入图片描述
  • 芯片选型
    在这里插入图片描述
  • 配置是时钟和gpio
    在这里插入图片描述
  • 配置串口
    在这里插入图片描述
  • 配置时钟树
    在这里插入图片描述
  • 导出工程
    在这里插入图片描述
    在这里插入图片描述

2、用keil打开工程完成uC/OS-III的移植

下载下来如下
在这里插入图片描述

  • 打开keil工程,添加文件
    在这里插入图片描述
  • 添加如下文件
    在这里插入图片描述
  • 并在这些文件添加我们刚刚下载的库
    CPU->/uC-CPU中
    在这里插入图片描述
    LIB->/uC-LIB中
    在这里插入图片描述
    PORT->/Generic/RealView中
    在这里插入图片描述
    SOURCE->/uCOS-III/SOURCE
    在这里插入图片描述
    CONFIG->/uC-CONFIG
    在这里插入图片描述
    BSP->/uC_BSP
    在这里插入图片描述
    至此,文件的添加工作已经完毕,后面需要导入头文件
  • 为工程添加头文件路径
    在这里插入图片描述
    对整个工程文件的添加以及路径修改已经完成,接下来就是对工程内一些文件夹的修改

三、对一些文件的修改

  • 找到启动文件,将以下修改成我这样
    在这里插入图片描述
    在这里插入图片描述
  • 找到app_cfg.h文件修改成我这样
    在这里插入图片描述
    在这里插入图片描述
  • 找到icludes.h文件修改成我这样
    在这里插入图片描述
  • 找到lib_cfg.h文件修改成我这样
    在这里插入图片描述
  • keil的一些修改
    在这里插入图片描述

至此,所有都已经完成,可以编写程序运行看效果了

四、代码编写及实际效果展示

1. main.c

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"
#include "usart.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <includes.h>
#include "stm32f1xx_hal.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* 任务优先级 */
#define START_TASK_PRIO		3
#define LED0_TASK_PRIO		4
#define MSG_TASK_PRIO			5
#define LED1_TASK_PRIO    6

/* 任务堆栈大小	*/
#define START_STK_SIZE 		64
#define LED0_STK_SIZE 		64
#define MSG_STK_SIZE 		  64//任务堆大小过大会报错,可以试着改小一点
#define LED1_STK_SIZE			64

/* 任务栈 */	
CPU_STK START_TASK_STK[START_STK_SIZE];
CPU_STK LED0_TASK_STK[LED0_STK_SIZE];
CPU_STK MSG_TASK_STK[MSG_STK_SIZE];
CPU_STK LED1_TASK_STK[LED1_STK_SIZE];
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值