嵌入式RTOS实战:uC/OS-III最新版移植指南(附项目源码)

文章目录

  • 前言
  • 一、uC/OS简介
  • 二、工程移植
    • 2.1 下载ucos源码
    • 2.2 创建空白工程
    • 2.3 拷贝ucosiii源码文件
      • 2.3.1 UC-CONFIG
      • 2.3.2 UC-CPU
      • 2.3.3 UC-LIB
      • 2.3.4 UC-OS3
    • 2.3 添加工程文件分组及路径
    • 2.4 代码首次编译
    • 2.5 源码修改
      • 2.5.1 cpu_cfg.h
      • 2.5.2 os_cpu_c.c
      • 2.5.3 lib_cfg.h
      • 2.5.4 sys.h
      • 2.5.5 delay.c
      • 2.5.6 usart.c
      • 2.5.7 os_cpu_a.asm
      • 2.5.8 stm32f10x_it.c
    • 2.6 再次编译
  • 三、编译测试
    • 3.1 添加任务调度代码
    • 3.2 下载测试
  • 四、源码下载


前言

在网上查阅了许多关于uC/OS操作系统移植的问题,发现真的是鱼龙混杂 稀烂,缺胳膊少腿严重,到处踩坑,于是有了这篇博客,以下是我想与大家分享如何实现从0到1的移植。

这里我移植的是目前最新版本uC/OS-Ⅲ


一、uC/OS简介

走个流程,简单介绍下uC/OS

uC/OS(Micro-Controller Operating System)是由 Micrium 公司开发的一款 实时操作系统(RTOS),专为嵌入式系统设计,广泛应用于工业控制、汽车电子、消费电子等领域。

主要特点

  • 实时性强
  • 可移植性好
  • 模块化设计
  • 低资源占用
  • 高可靠性

适用场景

  • 工业自动化(PLC、HMI)
  • 汽车电子(ECU、车载信息娱乐系统)
  • 消费电子(智能家居、穿戴设备)
  • 航空航天(无人机、卫星控制)

版本分支

  • uC/OS-II(经典版本,适用于 8/16/32 位 MCU)
  • uC/OS-III(增强版,支持多核、时间片轮询调度)

uC/OS 因其 高实时性、稳定性和可裁剪性,成为嵌入式开发中广泛使用的 RTOS 之一。

二、工程移植

2.1 下载ucos源码

官网下载ucosiii源码(https://github.com/weston-embedded)
找到uC-OS3uC-CPUuC-LIB下载并解压
在这里插入图片描述

在这里插入图片描述

2.2 创建空白工程

第一步:创建空白工程,用于移植ucosiii(我这里选用正点原子的led灯例程)
在这里插入图片描述

第二步:在项目中创建UCOSiii文件夹,并在该文件夹创建uc-CONFIG、uc-CPU、uc-LIB、uc-OS3子文件夹
在这里插入图片描述
在这里插入图片描述

2.3 拷贝ucosiii源码文件

2.3.1 UC-CONFIG

打开空白工程中创建的uc-CONFIG子文件夹,拷贝如下文件

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.3.2 UC-CPU

打开空白工程中创建的uc-CPU子文件夹,拷贝如下文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3.3 UC-LIB

打开空白工程中创建的uc-LIB子文件夹,拷贝如下文件
在这里插入图片描述
在这里插入图片描述

2.3.4 UC-OS3

打开空白工程中创建的uc-OS3子文件夹,拷贝如下文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 添加工程文件分组及路径

Keil工程添加文件分组、路径
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.4 代码首次编译

完成如上操作后编译,发现54error,别急,往下看
在这里插入图片描述

2.5 源码修改

2.5.1 cpu_cfg.h

打开文件cpu_cfg.h,将 #if 0修改为 #if 1
在这里插入图片描述

2.5.2 os_cpu_c.c

打开文件os_cpu_c.c,将#include “…/…/…/Source/os.h” 更改为 #include “os.h”
在这里插入图片描述

2.5.3 lib_cfg.h

打开文件lib_cfg.h,将DEF_DISABLED更改为DEF_ENABLED
在这里插入图片描述

2.5.4 sys.h

打开文件sys.h,打开ucos宏, 0–>1
在这里插入图片描述

2.5.5 delay.c

打开文件delay.c,将#include “includes.h”更改为#include”os.h”
在这里插入图片描述

2.5.6 usart.c

打开文件usart.c,将#include “includes.h”更改为#include”os.h”
在这里插入图片描述

2.5.7 os_cpu_a.asm

打开文件os_cpu_a.asm,将OS_CPU_PendSVHandler更改为PendSV_Handler

在这里插入图片描述
在这里插入图片描述

2.5.8 stm32f10x_it.c

打开文件stm32f10x_it.c,屏蔽或删除PendSV_Handler( )和SysTick_Handler( )函数
在这里插入图片描述

2.6 再次编译

在这里插入图片描述
至此,环境适配完成,准备烧录验证。

三、编译测试

3.1 添加任务调度代码

#include "sys.h"
#include "delay.h"
#include "led.h"#include "os.h"#define START_TASK_PRIO		3
#define START_STK_SIZE 		128
OS_TCB StartTaskTCB;
CPU_STK START_TASK_STK[START_STK_SIZE];void start_task(void *p_arg);
#define TASK1_TASK_PRIO		4
#define TASK1_STK_SIZE 		128
OS_TCB Task1_TaskTCB;
CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
void task1_task(void *p_arg);#define TASK2_TASK_PRIO		4
#define TASK2_STK_SIZE 		128
OS_TCB Task2_TaskTCB;
CPU_STK TASK2_TASK_STK[TASK2_STK_SIZE];
void task2_task(void *p_arg);int main(void) 
{	OS_ERR err;CPU_SR_ALLOC();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);delay_init();	    LED_Init();		  OSInit(&err);		    CPU_CRITICAL_ENTER();	 OSTaskCreate((OS_TCB 	* )&StartTaskTCB,		(CPU_CHAR	* )"start task", 		(OS_TASK_PTR )start_task, 			(void		* )0,					(OS_PRIO	  )START_TASK_PRIO,     (CPU_STK   * )&START_TASK_STK[0],	(CPU_STK_SIZE)START_STK_SIZE/10,	(CPU_STK_SIZE)START_STK_SIZE,		(OS_MSG_QTY  )0,					(OS_TICK	  )0,					(void   	* )0,					(OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR 	* )&err);			CPU_CRITICAL_EXIT();OSStart(&err);							 
} void start_task(void *p_arg)
{OS_ERR err;CPU_SR_ALLOC();p_arg = p_arg;CPU_Init();CPU_CRITICAL_ENTER();OSTaskCreate((OS_TCB 	* )&Task1_TaskTCB,		(CPU_CHAR	* )"Task1 task", 		(OS_TASK_PTR )task1_task, 			(void		* )0,					(OS_PRIO	  )TASK1_TASK_PRIO,     (CPU_STK   * )&TASK1_TASK_STK[0],	(CPU_STK_SIZE)TASK1_STK_SIZE/10,	(CPU_STK_SIZE)TASK1_STK_SIZE,		(OS_MSG_QTY  )0,					(OS_TICK	  )0,					(void   	* )0,					(OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR 	* )&err);	OSTaskCreate((OS_TCB 	* )&Task2_TaskTCB,		(CPU_CHAR	* )"Task2 task", 		(OS_TASK_PTR )task2_task, 			(void		* )0,					(OS_PRIO	  )TASK2_TASK_PRIO,     (CPU_STK   * )&TASK2_TASK_STK[0],	(CPU_STK_SIZE)TASK2_STK_SIZE/10,	(CPU_STK_SIZE)TASK2_STK_SIZE,		(OS_MSG_QTY  )0,					(OS_TICK	  )0,					(void   	* )0,					(OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR 	* )&err);		CPU_CRITICAL_EXIT();	OSTaskDel((OS_TCB*)0,&err);	
}void task1_task(void *p_arg)
{OS_ERR err;p_arg = p_arg;while(1){LED0=0;OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); }
}void task2_task(void *p_arg)
{OS_ERR err;p_arg = p_arg;while(1){LED0=1;OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); }
}

3.2 下载测试

在这里插入图片描述
经本人测试,实验效果过led灯闪烁,大家可下载下方源码自行验证,到此结束,谢谢。

四、源码下载

链接: https://pan.baidu.com/s/113vDqOzdq_ATz0m-14xtgg
提取码: c2h5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78828.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TypeScript中的函数类型定义与类型约束

函数类型定义与类型约束 一、核心概念:类型别名与函数类型 1. 类型别名(Type Alias) 定义 类型别名使用 type 关键字为现有类型创建一个新名称,可以用于: 基础类型(如 string、number)&…

相机DreamCamera2录像模式适配尺寸

在开发中遇到 一个问题,相机切换视频模式时,预览时,界面不能充满屏幕两侧有黑边,客户要求修改,在此记录 一问题现象: 系统相机在视频模式下预览时如下现象如图1,期望现象如图2: 图1 …

SpringCloud组件——Gateway

一.网关 1.问题提出 我们通过Eureka,Nacos解决了服务注册,服务发现的问题,使用SpringCloud LoadBalance解决了负载均衡的问题,使用OpenFeign解决了远程调用的问题。 但是当前所有微服务的接口都是直接对外暴露的,可…

C#中构造器及属性的加载顺序

一.基本原则: 先加载静态构造函数和静态字段,后加载普通构造函数和普通字段;先加载基类再加载子类; 二.具体的加载顺序: 父类静态字段--->父类静态构造函数--->子类静态字段--->子类静态构造函数--->父类实例字段---> 父类实例构造函数--->子类实例字段-…

Python面试问题

一、Python 基础 1. Python 的特点 动态类型:变量无需声明类型。解释型语言:逐行解释执行。支持多种编程范式(面向对象、函数式、过程式)。 2. 列表(List)与元组(Tuple)的区别 特…

计算机视觉进化论:YOLOv12、YOLOv11与Darknet系YOLOv7的微调实战对比

摘要 YOLO系列作为实时目标检测领域的重要里程碑,持续引领速度与精度的平衡发展。本文围绕YOLOv7(基于Darknet框架)、YOLOv11及YOLOv12,系统、深入地对比了三款模型的架构创新、微调策略、核心技术及应用场景。我们详细解析了三者…

SQL Server 存储过程开发规范

SQL Server 存储过程开发规范(高级版) 1. 总则 1.1 目标 本规范旨在: 提高存储过程的事务一致性、异常可追踪性、错误透明度。 统一日志记录、错误码管理、链路追踪(Trace ID)。 支持复杂事务场景(嵌套…

opendds的配置

配置的使用 文档中说明有4种使用配置的方式: 环境变量 命令行参数(将覆盖环境变量中的配置) 配置文件(不会覆盖环境变量或命令行参数中的配置) 用户调用的 API(将覆盖现有配置) 这里对开发…

(Go Gin)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收

1. 路由 gin 框架中采用的路优酷是基于httprouter做的 HttpRouter 是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。 主要特点 显式匹配:与其他路由…

Marin说PCB之----板材的替换注意事项

由于最近很多武林上的主流门派都需要采用将的本方案,小编所在的宗门古族也是不例外了,宗门大长老韩立现在想把之前一直在用的板材EM370Z替换成生益的Autolad3,让我去拿资料分析一下是否可以替换。下图所示是就是小编我做的一个表格关于两家板…

4月28日信息差全景:国际局势、科技突破与市场震荡一、国际政治与安全:俄乌冲突关键转折

一、国际政治与安全:俄乌冲突关键转折 1. 乌克兰反攻进展与情报差异 前线动态: 俄国防部称在顿涅茨克击退乌军三次进攻,摧毁12辆坦克;乌方则宣布在巴赫穆特南部推进2公里,双方战报存在显著差异。 信息差根源:战场信息管控导致西方媒体与俄媒报道截然不同。 国际援助: 美…

关系数据的可视化

目录 【实验目的】 【实验原理】 【实验环境】 【实验步骤】 一、安装Python所需要的第三方模块 二、实验 【实验总结】 【实验目的】 1.掌握关系数据在大数据中的应用 2.掌握关系数据可视化方法 3. python 程序实现图表 【实验原理】 在传统的观念里面&#xff0…

夏季道路安全的AI革命:节省人力、提升效率

AI夏季道路安全:用智能算法守护每一条街道 背景:夏季道路安全的挑战与机遇 夏季是道路安全事件的高发期。高温天气容易导致驾驶员疲劳、行人行为异常(如跌倒或中暑),同时,车流量增加、夜间活动频繁…

HTML标记语言_@拉钩教育【笔记】

目录 1.文本标签 2.格式化标签 3.图片标签 4.超链接标签 5.表格标签 6表单标签 6.1 6.2 6.3 7.行内框架(超链接内套一个页面) 8.多媒体标签(音/视频) 1.文本标签 2.格式化标签 3.图片标签 4.超链接标签 5.表格标签 6表单标签 6.1 6.2 6.3 7.行内框架(超链接内套一个…

Python 中调用方法内部定义的类详解(类在方法中的各种操作)

更多内容请见: python3案例和总结-专栏介绍和目录 文章目录 一、基本概念1.1 方法内部定义类概述1.2 方法内部定义类的特点1.3 替代方案二、基本使用2.1 直接在方法内部使用2.2 返回类定义供外部使用2.3 返回类的实例2.4 作为闭包使用(访问外部变量)三、高级用法3.1 动态类创…

第36课 常用快捷操作——用“鼠标右键”退出当前命令

概述 在AD 20软件中,很多的命令都是可以一直连续下去的,比方说放置一个元器件符号,如果你当中不取消的话,那就可以一直执行下去,放完一个接着放下一个,放完一个接着放下一个…… 想要退出这种连续进行的命…

FFTW3.3.10库与QT结合的使用

FFTW(Fastest Fourier Transform in the West)是世界上最快的FFT, 实测计算长度为10000的double数组, 单次运行时间在2ms左右。为了详细了解FFTW以及为编程方便,特将用户手册看了一下,并结合手册制作了以下…

服务器异地备份,服务器异地备份有哪些方法?

服务器异地备份是应对区域性灾难(如地震、火灾、洪水)或人为事故(如误删除、勒索病毒攻击)的关键策略,其核心在于将数据副本存储在物理隔离的地理位置,确保主数据中心故障时仍可恢复业务。 以下是主流的异地…

导轨表面硬化处理有哪些?

导轨是机器工作的重要组成部分,它与滑块紧密配合,保证机器的运转精度和定位精度。为了提高导轨的耐磨性能和使用寿命,通常在导轨表面加工硬化层。硬化层一般是在导轨表面形成一层高硬度和高强度的薄层,有效地提高了导轨的耐磨性能…

Android Compose vs 传统View系统:全面对比与选型指南

Android Compose vs 传统View系统:全面对比与选型指南 一、引言 随着Android Jetpack Compose的正式发布,Android开发迎来了全新的声明式UI框架。本文将全面对比Compose与传统View系统的差异,帮助开发者做出合理的技术选型。 二、核心架构…