UCOSIII移植——学习笔记1

 本文是笔者在学习 正点原子官方 的《【正点原子】手把手教你学UCOS-III实时操作系统》系列视频时整理的笔记。
视频讲解清晰透彻,非常感谢UP主的无私奉献!原课程链接如下:
👉 B站视频链接:【正点原子】手把手教你学UCOS-III实时操作系统_哔哩哔哩_bilibili

目录

1、添加UCOSIII源码

2、修改SYSTEM文件

3、修改中断相关文件

4、修改四个头文件

5、测试移植是否成功


1、添加UCOSIII源码

①复制内存管理实验到我们新创建的统一存放UCOSIII的文件夹下:

②去官网下载好这三个源代码

链接:https://github.com/weston-embedded/

③将“内存管理实验”的文件夹名修改为“UCOSIII移植”,并在里面新建一个名为“uC-OS3”文件夹,

将刚下载好的三个源代码解压后全部放在“uC-OS3”文件夹内。

④打开实验工程,创建下面4个分组

⑤从“uC-OS3”文件中的CPU和OS3文件夹中分别添加这两个文件到这个BSP分组上。

后面这些类似步骤,将下面的文件添加到对应的分组即可。

⑥添加路径


2、修改SYSTEM文件

sys.h里将宏置1

usart.c里将包含的头文件"include.h"修改成“os.h"

③delay.c

(1)修改头文件

(2)从定义的变量后面开始删到delay_ostimedly()函数为止(包括该函数)。

(3)修改systick中断服务函数

(4)修改延迟初始化的函数

(5)修改微秒延迟的函数

(6)修改毫秒延迟的函数


3、修改中断相关文件

stm32f10x_it.cstm32f10x_it.h

重复定义了注释掉

startup_stmf10x_hd.s


4、修改四个头文件

因为要修改的宏比较多,所以直接复制粘贴了移植成功后的实验的相关头文件。

要修改的头文件路径如图所示:


5、测试移植是否成功

编译之后发现有很多错误,集中错误显示在ucos_ii.h文件,显示变量未定义。

但是我们要用的是ucosIII的,不需要原来的关于UCOSII的文件,把这三个分组的删掉并且把相关路径删掉问题就解决了。

编译0错误0警告之后,将移植成功后的实验的demo文件加进去,下载编译后0错误0警告。

demo代码如下:

/******************************************************************************************************* @file        uc-os3_demo.c* @author      正点原子团队(ALIENTEK)* @version     V1.0* @date        2022-04-13* @brief       uC/OS-III 移植实验* @license     Copyright (c) 2020-2032, 广州市星翼电子科技有限公司***************************************************************************************************** @attention** 实验平台:正点原子 探索者 F407开发板* 在线视频:www.yuanzige.com* 技术论坛:www.openedv.com* 公司网址:www.alientek.com* 购买地址:openedv.taobao.com******************************************************************************************************/#include "uc-os3_demo.h"
#include "usart.h"
#include "led.h"
#include "delay.h"
/*uC/OS-III*********************************************************************************************/
#include "os.h"
#include "cpu.h"/******************************************************************************************************/
/*uC/OS-III配置*///UCOSIII中以下优先级用户程序不能使用,ALIENTEK
//将这些优先级分配给了UCOSIII的5个系统内部任务
//优先级0:中断服务服务管理任务 OS_IntQTask()
//优先级1:时钟节拍任务 OS_TickTask()
//优先级2:定时任务 OS_TmrTask()
//优先级OS_CFG_PRIO_MAX-2:统计任务 OS_StatTask()
//优先级OS_CFG_PRIO_MAX-1:空闲任务 OS_IdleTask()
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com  
//广州市星翼电子科技有限公司  
//作者:正点原子 @ALIENTEK//任务优先级
#define START_TASK_PRIO		3
//任务堆栈大小	
#define START_STK_SIZE 		512
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈	
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *p_arg);//任务优先级
#define LED0_TASK_PRIO		4
//任务堆栈大小	
#define LED0_STK_SIZE 		128
//任务控制块
OS_TCB Led0TaskTCB;
//任务堆栈	
CPU_STK LED0_TASK_STK[LED0_STK_SIZE];
void led0_task(void *p_arg);//任务优先级
#define LED1_TASK_PRIO		5
//任务堆栈大小	
#define LED1_STK_SIZE 		128
//任务控制块
OS_TCB Led1TaskTCB;
//任务堆栈	
CPU_STK LED1_TASK_STK[LED1_STK_SIZE];
//任务函数
void led1_task(void *p_arg);//任务优先级
#define FLOAT_TASK_PRIO		6
//任务堆栈大小
#define FLOAT_STK_SIZE		128
//任务控制块
OS_TCB	FloatTaskTCB;
//任务堆栈
__align(8) CPU_STK	FLOAT_TASK_STK[FLOAT_STK_SIZE];
//任务函数
void float_task(void *p_arg);
/******************************************************************************************************//*** @brief       uC/OS-III例程入口函数* @param       无* @retval      无*/void uc_os3_demo(void)
{OS_ERR err;OSInit(&err);		//初始化UCOSIII//创建开始任务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,					//任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息(OS_TICK	  )0,					//当使能时间片轮转时的时间片长度,为0时为默认长度,(void   	* )0,					//用户补充的存储区(OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项(OS_ERR 	* )&err);				//存放该函数错误时的返回值OSStart(&err);  //开启UCOSIII
}/*** @brief       start_task* @param       p_arg : 传入参数(未用到)* @retval      无*/
//开始任务函数
void start_task(void *p_arg)
{OS_ERR err;p_arg = p_arg;CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err);  	//统计任务                
#endif#ifdef CPU_CFG_INT_DIS_MEAS_EN		//如果使能了测量中断关闭时间CPU_IntDisMeasMaxCurReset();	
#endif#if	OS_CFG_SCHED_ROUND_ROBIN_EN  //当使用时间片轮转的时候//使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5msOSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
#endif		OSSchedRoundRobinCfg(OS_TRUE, 0, &err);//创建LED0任务OSTaskCreate((OS_TCB 	* )&Led0TaskTCB,		(CPU_CHAR	* )"led0 task", 		(OS_TASK_PTR )led0_task, 			(void		* )0,					(OS_PRIO	  )LED0_TASK_PRIO,     (CPU_STK   * )&LED0_TASK_STK[0],	(CPU_STK_SIZE)LED0_STK_SIZE/10,	(CPU_STK_SIZE)LED0_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);				//创建LED1任务OSTaskCreate((OS_TCB 	* )&Led1TaskTCB,		(CPU_CHAR	* )"led1 task", 		(OS_TASK_PTR )led1_task, 			(void		* )0,					(OS_PRIO	  )LED1_TASK_PRIO,     	(CPU_STK   * )&LED1_TASK_STK[0],	(CPU_STK_SIZE)LED1_STK_SIZE/10,	(CPU_STK_SIZE)LED1_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 	* )&FloatTaskTCB,		(CPU_CHAR	* )"float test task", 		(OS_TASK_PTR )float_task, 			(void		* )0,					(OS_PRIO	  )FLOAT_TASK_PRIO,     	(CPU_STK   * )&FLOAT_TASK_STK[0],	(CPU_STK_SIZE)FLOAT_STK_SIZE/10,	(CPU_STK_SIZE)FLOAT_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);								 		 OSTaskDel((OS_TCB *)0, &err);
}//led0任务函数
void led0_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); //延时500msLED0=1;OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms}
}//led1任务函数
void led1_task(void *p_arg)
{OS_ERR err;p_arg = p_arg;while(1){LED1=~LED1;OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms}
}//浮点测试任务
void float_task(void *p_arg)
{static float float_num=0.01;while(1){float_num+=0.01f;printf("float_num的值为: %.4f\r\n",float_num);delay_ms(500);			//延时500ms}
}

最后下载观察现象,移植成功了!!!!

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

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

相关文章

SpringBootCodeGenerator使用JSqlParser解析DDL CREATE SQL 语句

🧠 使用 JSqlParser 解析 CREATE TABLE SQL 语句详解在数据库开发中,我们常常需要从 SQL 中提取表结构信息,比如字段名、类型、注释等。相比使用正则表达式,JSqlParser 提供了更可靠的方式来解析 SQL 语句,尤其适用于复…

css3新增-网格Grid布局

目录flex弹性布局Gird布局开启网格布局定义网格中的行和列长度值百分比值新单位fr关键字函数minmax(min, max)函数-repeatauto-fill vs auto-fit举例说明grid-template-areasgapgrid-auto-columns和grid-auto-rowsjustify-contentalign-contentjustify-contentalign-contentjus…

最新最强新太极工具3.6 支持Windows和不支持mac电脑,支持免改码,和改码,支持12—18系统

温馨提示:文末有资源获取方式最新最强太极工具3.6支持Windows和Mac计算机,支持无代码更改和代码更改,支持12-18个系统 支持A7-A11芯片、Apple 5s x、iPad A7至A11芯片,支持所有者锁定、激活锁定、无法激活(密码界面和禁…

深入浅出 C++20:新特性与实践

C20 是 C 编程语言的一次重要更新,引入了许多新特性和改进,旨在提升代码的简洁性、安全性和性能。本文将详细介绍 C20 的一些核心特性,并通过示例代码帮助读者理解这些特性的应用场景。C20 新特性总结 以下是 C20 的主要新特性及其简要描述&a…

CSS 属性概述

CSS 属性概述 CSS 属性用于控制 HTML 元素的样式和行为,包括布局、颜色、字体、动画等。以下是常用的 CSS 属性分类及示例: 布局相关属性 display: 控制元素的显示方式,如 block、inline、flex、grid。position: 定义元素的定位方式&#…

--- 统一请求入口 Gateway ---

spring cloud gateway 官方文档 Spring Cloud Gateway 中文文档 什么是api网关 对于微服务的每个接口,我们都需要校验请求的权限是否足够,而微服务把项目细化除了许多个接口,若这些接口都要对服务进行权限校验的话,那么无疑加重…

返利app的消息队列架构:基于RabbitMQ的异步通信与解耦实践

返利app的消息队列架构:基于RabbitMQ的异步通信与解耦实践 大家好,我是阿可,微赚淘客系统及省赚客APP创始人,是个冬天不穿秋裤,天冷也要风度的程序猿! 在返利app的业务流程中,用户下单、返利计算…

Vue3 响应式失效 debug:Proxy 陷阱导致数据更新异常的深度排查

人们眼中的天才之所以卓越非凡,并非天资超人一等而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成超凡的必要条件。———— 马尔科姆格拉德威尔 🌟 Hello,我是Xxtaoaooo! 🌈 “代码是逻辑的诗篇&#xff0…

【贪心算法】day10

📝前言说明: 本专栏主要记录本人的贪心算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;&#xff…

LeetCode算法日记 - Day 42: 岛屿数量、岛屿的最大面积

目录 1. 岛屿数量 1.1 题目解析 1.2 解法 1.3 代码实现 2. 岛屿的最大面积 2.1 题目解析 2.2 解法 2.3 代码实现 1. 岛屿数量 https://leetcode.cn/problems/number-of-islands/ 给你一个由 1(陆地)和 0(水)组成的的二维…

短波红外相机在机器视觉检测方向的应用

短波红外相机在机器视觉检测方向的应用短波红外相机:机器视觉的“低成本突破者”一、打破成本困局:短波红外的“平民化”革新二、核心技术:有机材料的“硬核创新”1. 材料革命:有机感光层的优势2. 工艺兼容:嫁接成熟CM…

【数据结构与算法】图 Floyd算法

相关题目: 1334. 阈值距离内邻居最少的城市 - 力扣(LeetCode) 资料 : Floyd算法原理及公式推导 - 知乎 Floyd 算法是一种经典的动态规划算法,用与求解图中所有顶点之间的最短短路路径。它由Robert Floyd 于1962…

卫星通信天线的指向精度,含义、测量和计算

卫星通信天线的指向精度,含义、测量和计算我们在卫星通信天线的技术规格书中,都会看到天线指向精度这个指标。一般来说,技术规格书上的天线指向精度的参数是这么写的:“天线指向精度≤1/10半功率波束带宽”今天这个文章&#xff0…

基于LSTM与3秒级Tick数据的金融时间序列预测实现

数据加载模块解析 def load_data(filepath):df pd.read_csv(filepath)return df该函数承担基础数据采集职责,通过Pandas库读取CSV格式的高频交易数据(典型如股票分笔成交明细)。输入参数为文件路径字符串,输出结构化DataFrame对象…

C# --- Field and Property

C# --- Field and Property字段 (Field) vs. 属性 (Property)Property的声明初始化方法单例类property错误初始化导致线程泄漏字段 (Field) vs. 属性 (Property) 字段 (Field) - 数据的存储容器 字段是直接在类或结构中声明的变量。它是存储数据的地方,是对象状态的…

【Python】实现一个文件夹快照与比较工具

1. 工具简介 在日常开发、项目管理或备份场景中,我们经常需要知道某个文件夹中的文件是否发生变化,例如: 项目源码是否新增或修改文件?数据集是否被不小心删除或篡改?备份文件夹是否和上次一致? 本教程将教…

LINUX913 shell:set ip [lindex $argv 0],\r,send_user,spawn ssh root@ip “cat “

问题 获取公钥 [codesamba ~]$ cat pub.sh #!/bin/usr/expect set ip "$1" set password 123456 set timeout 20 spawn ssh root192.168.235.100:cat ~/.ssh/id_rsa.pub expect { "yes/no" {send "yes/r";exp_continue} "password:" {…

Acwing算法基础课--链表

一、单链表 AcWing 826. 单链表 代码 N 100010 idx 0 e [0] * N ne [0] * N head -1def init():global idx,headidx 0head -1def add_head(x):global idx,heade[idx] xne[idx] headhead idxidx 1def delete(k):ne[k] ne[ne[k]]def add_k(k,x):global idxe[idx] …

AI表征了西方的有界,AI+体现了东方的无界

AI表征了西方的有界,AI体现了东方的无界,试图通过文化差异的视角来对比传统AI(AI)与增强型或融合型AI(AI)的特征。一、“AI表征了西方的有界”西方的“有界”可以理解为:1、逻辑清晰、结构严谨&…

LabVIEW泵轮检测

​在现代制造业蓬勃发展的浪潮下,汽车行业也迎来了高速发展期。液力变矩器作为实现车辆自动变速的关键零件产品,在汽车动力系统中扮演着不可或缺的角色。泵轮作为液力变矩器的核心组成部分,其生产质量直接影响着液力变矩器的性能。因此&#…