FreeRTOS学习笔记—②RTOS的认识(持续更新中)

  由于正在学习韦东山大佬的RTOS课程,结合了网上的一些资料,整理记录了下自己的感悟,用于以后自己的回顾。如有不对的地方请各位大佬纠正。
课程链接:https://www.bilibili.com/video/BV1844y1g7ud/?spm_id_from=333.337.search-card.all.click&vd_source=c48fed208dddb3dfb2649420bfdd32d9

一、RTOS的优势【为啥学习RTOS】

①:确定性和实时性:
  RTOS的最大特点是能够在严格的时间约束内完成任务。这种确定性对于时间敏感的应用(如工业控制、医疗设备等)至关重要。
②:优先级调度:
  RTOS通常支持优先级调度机制,确保高优先级的任务可以抢占低优先级的任务执行。这种机制保证了关键任务能够在最短时间内得到处理。
③:低延迟和高响应性:
  RTOS设计的目标是最小化任务切换时间和中断延迟,从而实现高响应性。这在需要快速反应的嵌入式系统中非常重要。
④:资源管理和内存控制:
  RTOS通常提供精细的资源管理工具,允许开发者更好地控制内存和CPU资源的使用。这种控制对于嵌入式系统中的资源有限环境尤其重要。
⑤:模块化和灵活性:
  RTOS通常具有模块化设计,允许开发者根据具体需求启用或禁用特定的功能模块。这种灵活性有助于优化系统性能和减少系统开销。
⑥:可靠性和稳定性:
  RTOS被广泛应用于需要高可靠性和稳定性的系统中,例如自动驾驶、军事系统等。RTOS通过严格的测试和验证,确保其在各种边界情况下都能稳定运行。
⑦:较小的内存占用:
  RTOS通常占用的内存和资源较少,这使得它非常适合嵌入式系统或其他资源受限的环境。

二、RTOS的核心功能

RTOS的核心功能块主要分为任务管理、内核管理、时间管理以及通信管理4部分,框架图如下所示:
(1)任务管理:负责管理和调度任务的执行,确保系统中的任务能够按照预期运行。
(2)内核管理:负责系统核心功能的管理,包括内存、中断、异常处理和系统启动等。
(3)时间管理:负责所有与时间相关的操作,包括系统时钟、定时器、任务延迟和周期性任务的执行。
(4)通信管理:提供任务之间的通信机制,确保任务能够有效地协作和共享资源。
在这里插入图片描述

2.1 任务管理
2.1.1 任务的创建

  任务就是一个无返回的函数(Void)。由于函数传参的不同,一个函数可以创建多个任务,然后每个任务都有对应自身的栈,也就是说一个函数可以有多个栈(当然一个函数对应一个栈也是可以的)。使用下面的函数用于创建任务:

void TaskAFunction(void *param)
{int* tmp	= (int*) param;//首先将void *指针类型的param转为int *类型的指针 int value = *tmp;	       //然后解引用来获取指针指向的值while(1){printf("%d",value);}
}

尽管是同一个函数,但是创建的多个任务主要不同还是在于传参而不是名字,下面的代码使用了相同的名字(“TaskA”)创建了三个参数不同的任务。

int x1=1;int x2=2;int x3=3;
int main( void )
{TaskHandle_t xHandleTask1;#ifdef DEBUGdebug();
#endifprvSetupHardware();printf("Hello, world!\r\n");xTaskCreate(TaskAFunction,"TaskA",100,&x1,1,NULL);xTaskCreate(TaskAFunction,"TaskA",100,&x2,1,NULL);xTaskCreate(TaskAFunction,"TaskA",100,&x3,1,NULL);/* Start the scheduler. */vTaskStartScheduler();/* Will only get here if there was not enough heap space to create theidle task. */return 0;
}

在这里插入图片描述
2.1.1 xTaskCreate
上面使用的xTaskCreate是动态创建任务的,当然还有静态创建任务的函数xTaskCreateStatic,后面再提静态创建。下图为xTaskCreate函数的参数及介绍:
在这里插入图片描述
下图摘自韦东山的FreeRTOS完全开发手册3.2.2节
摘自韦东山的FreeRTOS完全开发手册3.2.2节

2.1.2 任务的删除

  任务的删除使用如下函数,其中填入的参数如果是NULL表示自杀,如果是自己的句柄则是被杀,别人的句柄就是杀人

void vTaskDelete( TaskHandle_t xTaskToDelete );

  基础实验如下,在vTask1任务中嵌套vTask2任务的创建,并vTask2任务中进行自杀,所以xTask2Handle设置为NULL。

TaskHandle_t xTask2Handle = NULL;
void vTask1( void *pvParameters )
{const TickType_t xDelay100ms = pdMS_TO_TICKS( 100UL );//100ms的延时BaseType_t ret;/* 任务函数的主体一般都是无限循环 */for( ;; ){/* 打印任务1的信息 */printf("Task1 is running\r\n");ret = xTaskCreate( vTask2, "Task 2", 1000, NULL, 2, &xTask2Handle );if (ret != pdPASS)//判断vTask2是否创建成功,一般pdPASS默认为1printf("Create Task2 Failed\r\n");vTaskDelay( xDelay100ms );}
}void vTask2( void *pvParameters )
{/* 打印任务的信息 */printf("Task2 is running and about to delete itself\r\n");// 可以直接传入参数NULL,进行“自杀”vTaskDelete(xTask2Handle);
}int main( void )
{
#ifdef DEBUGdebug();
#endifprvSetupHardware();xTaskCreate(vTask1, "Task 1", 1000, NULL, 1, NULL);/* Start the scheduler. */vTaskStartScheduler();/* Will only get here if there was not enough heap space to create theidle task. */return 0;
}

  其中vTask2任务的优先级为2,高于vTask1的优先级1(这里是数字大优先级高)。实验结果如下,实现现象为首先打印vTask1的printf,然后执行优先级高的vTask2。然后vTask2会打印自身内容并进行自杀退出vTask2循环中,最后又回到vTask1这样来回交替循环。
在这里插入图片描述
其中vTaskDelay( xDelay100ms );的作用在于保证在Idle任务时有时间执行来保证释放创建任务vTask2时分配的内存。如果没有这一行的延时会导致释放vTask2的内存失败而导致内存耗尽,最终导致无法创建新的任务。删除vTaskDelay( xDelay100ms );的结果如下:
在这里插入图片描述

2.2 内存管理

  源码中对应了5种内存管理的方法,如下所示。不过在了解这5种方式前,需要对TCBStack有个认识。
  (1)TCB:即任务控制块,是操作系统用来管理每个任务的信息结构体。每个任务(或线程)在RTOS中都会有一个对应的TCB。TCB中存储了任务的所有关键信息,用于操作系统对任务的调度、状态管理和上下文切换。通常TCB包含如①任务ID:每个任务的唯一标识符。②任务状态:例如就绪、运行、阻塞、挂起等状态。③程序计数器(PC):保存任务执行的当前指令位置。④寄存器状态:保存任务执行时CPU的寄存器值。⑤任务优先级:用于任务调度中的优先级信息。⑥任务栈指针:指向任务的栈空间,保存任务的栈信息。⑦任务上下文信息:保存任务切换时的上下文信息,如寄存器内容等。
  (2)Stack:即, 是每个任务用来存储其运行时局部变量、函数调用链和返回地址等信息的内存空间。对于RTOS,每个任务通常都有自己独立的栈空间,这样可以确保任务之间的执行互不干扰。在这里插入图片描述

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

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

相关文章

Elasticsearch 向量数据库本地部署 及操作方法

elasticsearch是个分布式向量数据库,支持多种查找模式。此外还拥有 Metadata、Filtering、Hybrid Search、Delete、Store Documents、Async等能力。本文仅是记录本地测试途中遇到的问题。 一,环境部署 下载软件 首先去官网,选择适合平台下…

GoF 代理模式

代理模式的理解 代理模式,就是自己做不了,需要别人来代理,代替自己来完成。最终这个行为还是要发生,只不过不是由自己来完成,而是由别人代理完成,只是对于客户其他人来说感受不到 代理模式的作用&#xf…

MySQL复习3

视图 视图(view)是一种虚拟存在的表,是一个逻辑表,本省没有数据,内容由查询定义。 基表:用来创建视图的表叫做基表 通过视图,我们可以查看基表的部分数据。视图数据来自定义视图的查询中使用…

RISC-V (八)定时器中断

​​​​​​​riscv中断的分类 Core local INTerrupt: CLINT CLINT编程接口-寄存器 mtime寄存器,由中断触发的时钟,按照固定频率计数。

【基础算法总结】BFS_多源最短路问题

目录 1. 算法介绍2. 算法原理和代码实现542.01矩阵1020.飞地的数量1765.地图中的最高点1162.地图分析 3. 算法总结 1. 算法介绍 所谓多源,就是有多个起点。对应上一篇文章【BFS_最短路问题】的单源问题。这篇文章介绍用bfs解决边权为1(或边权相等)的多源最短路问题…

监控平台之rollup打包

设计思路 1.根据模块,通过index.js去调用执行调用 2.WebEyeSDK.js暴露方法,同时定义init方法,去初始化config里的上报参数 3.rollup/build里入口文件为WebEyeSDK.js进行打包 4.打包编译用babel,同时安装babel/preset-env智能预…

网络安全服务基础Windows--第12节-域与活动目录

工作组 在Windows环境中配置⼯作组相对简单,适合⼩型⽹络环境,如家庭或⼩型办公室⽹络。⼯作组通过简单的⽹络共享和本地管理来实现资源共享,⽽不依赖于中央控制的服务器。 ● 定义:⼯作组是⼀种对等⽹络模型,在这种…

【鸿蒙开发从0到1 day05】

一. 清除浮动 1.当外面的大盒子,仅仅只设置了宽度,里面的子盒子为了行排序, 设置了浮动,以至于小盒子脱标,大盒子的高度为0,这个时候就会导致大盒子下面的盒子会跑上去 解决办法方法一:给父盒子添加overflow:hidden,这个就是如果子盒子有溢出,,溢出部分会隐藏方法二:在子盒子的…

Linux【2】文件目录-ls进阶

目录 ls 组合使用:ls -lha​编辑 ls 通配符 ls .是隐藏文件 ls -a可以显示所有文件包括隐藏文件 ls- l列表形式,详细信息 ls -l -h 大小更详细 组合使用:ls -lha ls 通配符 *任意长度 ?一个字符 带扩展名 可选from…

计算机网络-VRRP切换与回切过程

前面我们学习了VRRP选举机制,根据VRRP优先级与IP地址确定主设备与备份设备,这里继续进行主备切换与主备回切以及VRRP抢占模式的学习。 一、VRRP主备切换 主备选举时根据优先级选择主设备,状态切换为Master状态,那当什么时候会切换…

HTTPS 协议“加密和解密”详细介绍

目录 一、加密 二、HTTPS的工作过程 2.1 引入对称加密 2.2 引入非对称加密 2.3 中间人攻击 2.4 引入证书 2.5 理解数据签名 2.6 通过证书解决中间人攻击 三、总结 HTTPS 是一个应用层协议,是在 HTTP 协议的基础上引入了一个加密层。 一、加密 加密就是把明文&#x…

Golang环境安装、配置详细

Windows下安装Go开发环境 点我下载 Windows配置Go环境变量 出现工具install失败时,切换其它代理 # 1. 七牛 CDN go env -w GOPROXYhttps://goproxy.cn,direct# 2. 阿里云 go env -w GOPROXYhttps://mirrors.aliyun.com/goproxy/,direct# 3. 官方 go env -w GOP…

【wsl2】从C盘迁移到G盘

参考大神 C盘的ubuntu22.04 非常大,高达30g 迁移后就只有几百M了: 右键有一个move没有敢尝试 迁移过程 Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved.Install the latest PowerShell for new features and improveme…

Xcode插件开发

Xcode插件开发 文章目录 Xcode插件开发一、插件开发流程创建插件Extension文件介绍文件说明 二、插件使用安装说明 一、插件开发流程 创建插件的过程并不复杂,只是官方教程,过于简单,所以这里补充下创建细节 创建插件 环境:Xco…

vue在生产环境和测试环境去掉 console 打印日志 只保留 “error“、 “warn“

vue在生产环境和测试环境去掉 console 打印日志 只保留 “error”、 “warn” 文章目录 vue在生产环境和测试环境去掉 console 打印日志 只保留 "error"、 "warn"一、安装插件二、babel.config.js配置 一、安装插件 npm install babel-plugin-transform-r…

C++11中的function和bind

目录 1.一个引例 2.function 什么是function? function模板原型 function的使用 使用示例代码 使用function解决引例中的问题 3.bind 什么是bind? 如何理解bind? bind的使用 4.function和bind总结 1.一个引例 看下面这一段代码…

仿华为车机UI--图标从Workspace拖动到Hotseat同时保留图标在原来位置

基于Android13 Launcher3,原生系统如果把图标从Workspace拖动到Hotseat里则Workspace就没有了,需求是执行拖拽动作后,图标同时保留在原位置。 实现效果如下: 实现思路: 1.如果在workspace中拖动,则保留原来“改变图标…

前端脚手架,自动创建远程仓库并推送

包含命令行选择和输入配置,远程仓库拉取模板,根据配置将代码注入模板框架的代码中,自动创建远程仓库,初始化git并提交至远程仓库,方便项目开发,简化流程。 目录结构 创建一个bin文件夹,添加ind…

云计算之存储

目录 一、产品介绍 1.1 对象存储oss 1.2 特点 二、产品技术背景 三、产品架构及功能 四、常见问题及排查思路 4.1 两个bucket目录文件如何快速复制? 4.2 oss里的目录如何删除? 4.3 能否统计oss一个目录的大小 4.4 异常诊断 - 上传下载速度慢 4…

CentOS 7安装Docker详细步骤-无坑-丝滑-顺畅

一,安装软件包 yum install -y yum-utils device-mapper-persistent-data lvm2二,更换yum源为阿里源: yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 三,查看docker版本&…