freeRTOS中文实用教程1

article/2025/4/27 9:47:15

资料转载出处 https://www.cnblogs.com/smartjourneys/p/7073450.html

1.前言
FreeRTOS是小型多任务嵌入式操作系统,硬实时性。本章主要讲述任务相关特性及调度相关的知识。

  1. 任务的总体特点
    任务的状态
    (1)任务有两个状态,运行态和非运行态

(2)任务由非运行态转入运行态为切入,相反为切出

设置优先级
(1)最高优先级在FreeRTOSConfig.h 中 设 定 的 编 译 时 配 置 常 量configMAX_PRIORITIES中进行设置。
注:FreeRTOS 本身并没有限定这个常量的最大值,但这个值越大,则内核花销的内存空间就越多。建议将此常量设为能够用到的最小值

(2)任意数量的任务可以共享同一个优先级也可以为每个任务唯一指定一个优先级

(3)低优先级号表示任务的优先级低
(4)有效的优先级号范围从 0 到(configMAX_PRIORITES – 1)
(5)调度器保证总是在所有可运行的任务中选择具有最高优先级的任务,并使其进入运行态
(6)如果被选中的优先级上具有不止一个任务,调度器会让这些任务轮流执行

(7)调度器总是选择所有能够进入运行态的任务中具有最高优先级的任务

改变任务优先级
可以通过vTaskPrioritySet() 来改变任务的优先级

任务时间片
(1)两个任务被创建在同一个优先级上,并且一直是可运行的。所以每个任务都执行一个”时间片”,任务在时间片起始时刻进入运行态,在时间片结束时刻又退出运行态

(2)调度器需要在每个时间片结束时能够调度自己, tick中断可以完成此目的

(3)tick中断频率可以通过FreeRTOSConfig.h 中的编译时配置常量configTICK_RATE_HZ 进行配置,如设为100HZ,则时间片长度为10ms

3.任务状态机
3.1 任务状态机
在这里插入图片描述

图 完整的任务状态机

阻塞态(blocked)
(1)如果一个任务正在等待某个事件,则称这个任务处于”阻塞态(blocked)”。阻塞态是非运行态的一个子状态。

(2)任务进入阻塞态一般等待以下两种事件:定时事件和同步事件

(3)任务可以在进入阻塞态等待同步事件时指定一个等待超时时间,这样可以有效地实现阻塞状态下同时等待两种类型的事件,

比如说,某个任务可以等待队列中有数据到来,但最多只等10ms。如果10ms 内有数据到来,或是10ms 过去了还没有数据到来,这两种情况下该任务都将退出阻塞态。

挂起状态(suspended)
(1)处于挂起状态的任务对调度器而言是不可见的

(2)让一个任务进入挂起状态的唯一办法就是调用vTaskSuspend() API 函数

(3)把一个挂起状态的任务唤醒的唯一途径就是调用vTaskResume() 或TaskResumeFromISR() API 函数

(4)大多数应用程序中都不会用到挂起状态

就绪状态(ready)
(1)如果任务处于非运行状态,但既没有阻塞也没有挂起,则这个任务处于就绪(ready,准备或就绪)状态

(2)处于就绪态的任务能够被运行,但只是”准备(ready)”运行,而当前尚未运行

3.2.利用阻塞态实现延迟
1 void vTaskDelay( portTickType xTicksToDelay );
调用上面的函数的任务会进入阻塞态,xTicksToDelay表示delay的tick周期数,portTICK_RATE_MS代表每毫秒有多少个tick周期

  1. 空闲任务
    空闲任务的特点
    (1)在调度器启动的时候vTaskStartScheduler会自动创建一个空闲任务

(2)空闲任务具有最低的优先级0,保证不会影响其它更高优先级的任务进入就绪态

(3)运行在最低优先级可以保证一旦有更高优先级的任务进入就绪态,空闲任务就会立即切出运行态

(4)空间任务可以获得的执行时间量,是系统处理能力裕量的一个度量指

空闲任务钩子函数
(1)通过空闲任务钩子函数(或称回调,hook, or call-back),可以直接在空闲任务中添加应用程序相关的功能,空闲任务钩子函数会被空闲任务每循环一次就自动调用一次

(2)空闲任务钩子函数被用于:

—执行低优先级,后台或需要不停处理的功能代码。

—测试系统处理裕量

—将处理器配置到低功耗模式——提供一种自动省电方法,使得在没有任何应用功能需要处理的时候,系统自动进入省电模式。

空闲任务钩子函数必须遵从以下规则
(1)绝不能阻塞或挂起。

空闲任务只会在其它任务都不运行时才会被执行(除非有应用任务共享空闲任务优先级)。

以任何方式阻塞空闲任务都可能导致没有任务能够进入运行态!
(2)如果应用程序用到了vTaskDelete() 函数,则空闲钩子函数必须能够尽快返回。

因为在任务被删除后,空闲任务负责回收内核资源。如果空闲任务一直运行在钩子函数中,则无法进行回收工作。

5.任务的调度
优先级抢占式调度
每个任务都被赋予了一个优先级,这个优先级不能被内核本身改变(只能被任务修改)。

”抢占式”是指当任务进入就绪态或是优先级被改变时,如果处于运行态的任务优先级更高,则该任务总是抢占当前运行的任务

单调速率调度

单调速率调度(Rate Monotonic Scheduling, RMS)是一种常用的优先级分配技术。其根据任务周期性执行的速率来分配一个唯一的优先级。

具有最高周期执行频率的任务赋予高最优先级;具有最低周期执行频率的任务赋予最低优先级。这种优先级分配方式被证明了可以最大化整个应用程序的可调度性(schedulability),但是运行时间不定以及并非所有任务都具有周期性,会使得对这种方式的全面计算变得相当复杂

协作式调度

只可能在运行态任务进入阻塞态或是运行态任务显式调用 taskYIELD()时,才会进行上下文切换。

任务永远不会被抢占,而具有相同优先级的任务也不会自动共享处理器时间。协作式调度的这作工作方式虽然比较简单,但可能会导致系统响应不够快

混合调度
这需要在中断服务例程中显式地进行上下文切换,从而允许同步事件产生抢占行为,但时间事件却不行。

这样做的结果是得到了一个没有时间片机制的抢占式系统。或许这正是所期望的,因为获得了效率,并且这也是一种常用的调度器配置

6.任务调度举例
两个优先级相同的任务时间片执行图如下:
在这里插入图片描述
图 优先级相同的两个任务的时间片执行序列

加入了tick中断及tick中断调度器调度下个任务图示如下:
在这里插入图片描述图 对执行流程进行扩展以显示tick中断的执行

由于task2比task1优先级高,因此task1永远得不到执行:
在这里插入图片描述图 Task2比Task1优先级高时的任务运行序列

用vTaskDelay()代替空循环后的执行流程,task1得到了执行,如下图:
在这里插入图片描述

图 用vTaskDelay()代替空循环后的执行流程

continuous 1与continuous 2具有优先级1,periodic具有优先级2,periodic使用vTaskDelayUntil,调度图如下(注意心跳中断在t5时刻实际是时间片到时调度器执行):
在这里插入图片描述

开始任务1具有最高优先级,任务1结束前将任务2设为最高优先级,任务2在结束时将自身设为最低优先级,执行序列如下:
在这里插入图片描述

idle在任务1进入阻塞态后,会执行对任务2的内存清除工作
在这里插入图片描述

三个任务(事件唤醒)的抢占执行过程
在这里插入图片描述

  1. 一些重要的API
    API 含义 重要参数说明 返回值
    void ATaskFunction( void *pvParameters ); 任务的原型 参数必须是void * 返回值必须是void
    portBASE_TYPE xTaskCreate( pdTASK_CODE pvTaskCode,
      const signed portCHAR * const pcName,
      unsigned portSHORT usStackDepth,
      void *pvParameters,
      unsigned portBASE_TYPE uxPriority,
      xTaskHandle *pxCreatedTask );
    创建任务
    uxPriority
    表示任务的优先级,最好设置成实际任务需要的最小值,以避免浪费

void vTaskStartScheduler( void )
开始调度一个任务执行,第一次调度时会自动创建一个空闲任务

void vTaskDelete( TaskHandle_t xTaskToDelete )
删除一个任务
xTaskToDelete
要删除任务的句柄

void vTaskDelay( const TickType_t xTicksToDelay )
让当前任务进入阻塞态,并保持多少个tick
xTicksToDelay
用来指定任务在调用vTaskDelay()到切出阻塞态整个过程包含多少个tick

void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime,
const TickType_t xTimeIncrement )
用于实现一个固定执行周期的需求求(当你需要让你的任务以固定频率周期性执行的时候)
pxPreviousWakeTime
保存了任务上一次离开阻塞态(被唤醒)的时刻这个时刻被用作一个参考点来计算该任务下一次离开阻塞态的时刻。pxPreviousWakeTime 指向的变量值会在API 函数vTaskDelayUntil()调用过程中自动更新,应用程序除了该变量第一次初始化外(通过调用xTaskGetTickCount()初始化),通常都不要修改它的值

xTimeIncrement
此参数命名时同样是假定vTaskDelayUntil()用于实现某个任务以固定频率周期性执行 —— 这个频率就是由xTimeIncrement 指定的。xTimeIncrement 的单位是心跳周期, 可以使用常量

portTICK_RATE_MS 将毫秒转换为心跳周期。

void vApplicationIdleHook( void )
空闲钩子函数
void vTaskPrioritySet( xTaskHandle pxTask,
    unsigned portBASE_TYPE uxNewPriority )
改变任务优先级
pxTask
被修改优先级的任务句柄(即目标任务)

uxNewPriority
目标任务将被设置到哪个优先级上。如果设置的值超过了最大可用优
先级(configMAX_PRIORITIES – 1),则会被自动封顶为最大值。常
量 configMAX_PRIORITIES 是在 FreeRTOSConfig.h 头文件中设置
的一个编译时选项。

unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask );
用于查询一个任务的优先级
pxTask
被查询任务的句柄(目标任务)

返回值 被查询任务的当前优先级
void vTaskDelete( xTaskHandle pxTaskToDelete )
删除任务
pxTaskToDelete
被删除任务的句柄(目标任务) 。任务可以通过传入 NULL 值来删除自己

taskYIELD
调用此函数的任务转入就绪态,同时另一个任务转入运行态
7.参考文档
[1] FreeRTOS中文实用教程


http://chatgpt.dhexx.cn/article/xX1ASceK.shtml

相关文章

FreeRTOS入门

目录 一、简介 二、堆的概念 三、栈的概念 四、从官方源码中精简出第一个FreeRTOS程序 五、修改官方源码增加串口打印 一、简介 FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、…

freeRTOS系列教程之【第一章】FreeRTOS概述与体验

文章目录 教程目录1.1 FreeRTOS目录结构1.1 FreeRTOS目录结构1.2 核心文件1.3 移植时涉及的文件1.4 头文件相关 1.4.1 头文件目录1.4.2 头文件 1.5 内存管理1.6 Demo1.7 数据类型和编程规范 1.7.1 数据类型1.7.2 变量名1.7.3 函数名1.7.4 宏的名 1.8 安装Keil 1.8.1 下载Keil1.…

【机器学习】3-4-2 流行学习

#3-4-2流行学习 import mglearn import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.datasets import load_breast_cancer from sklearn.datasets import make_moons from sklearn.datasets import make_blobs from sklearn.datasets impor…

【机器学习】(十八)用t-SNE进行流行学习:手写数字分类

PCA是用于变换数据的首选方法,也可以进行可视化,但它的性质(先旋转然后减少方向)限制了有效性。 流行学习算法:是一类用于可视化的算法,它允许进行更复杂的映射,通常也可以给出更好的可视化。t-…

用Python实现流行机器学习算法

对于此库的Octave/MatLab版本,请检查machine-learning-octave项目。 该库包含在Python中实现的流行机器学习算法的示例,其中包含数学背后的解释。 每个算法都有交互式Jupyter Notebook演示,允许您使用训练数据,算法配置&#xff0…

【流行学习】局部线性嵌入(Locally Linear Embedding)

一、前言 局部线性嵌入(LLE)假设数据在较小的局部是线性的,也就是说,某一个样本可以由它最近邻的几个样本线性表示,离样本远的样本对局部的线性关系没有影响,因此相比等距映射算法,降维的时间复…

流行-Manifold学习理解与应用

流行-Manifold【1】 流形,也就是 Manifold 。 1. 比较好的形象理解 流形学习的观点是认为,我们所能观察到的数据实际上是由一个低维流形映射到高维空间上的,即这些数据所在的空间是“嵌入在高维空间的低维流形。”。由于数据内部特征的限制&a…

【流行学习】拉普拉斯映射(Laplacian Eigenmaps)

一、前言 拉普拉斯特征映射是一种基于图的降维算法,它希望在原空间中相互间有相似关系的点,在降维后的空间中尽可能的靠近,从而在降维后仍能保持原有的数据结构信息。 二、主要步骤 拉普拉斯特征映射通过构建邻接矩阵为 W W W(…

7个流行的强化学习算法及代码实现

目前流行的强化学习算法包括 Q-learning、SARSA、DDPG、A2C、PPO、DQN 和 TRPO。 这些算法已被用于在游戏、机器人和决策制定等各种应用中,并且这些流行的算法还在不断发展和改进,本文我们将对其做一个简单的介绍。 1、Q-learning Q-learning&#xff1…

流行学习,比较好的一篇博客

转载自:https://blog.csdn.net/sinat_32043495/article/details/78997758 嵌入在高维空间的低维流形 流形:局部具有欧几里得空间性质的空间 1.较好的描述转载 作者:暮暮迷了路 链接:https://www.zhihu.com/question/2401548…

深度学习—近年来流行的卷积神经网络(一)

近年来流行的卷积神经网络 1. 回顾与目标2. 近年来流行的卷积神经网络2.1 VGGNet2.1.1 感受野的概念2.1.2 感受野的计算 2.2 GooleNet2.3 ResNet 3. 结尾参考资料 1. 回顾与目标 前面几讲,我们以LeNet和AlexNet为例,详细讲解了卷积神经网络的结构。从20…

流行学习常用算法

Isomap:等距映射。前提假设为低维空间中的欧式距离等于高维空间中的侧地线距离,当然该算法具体实施时是高维空间中较近点之间的测地线距离用欧式距离代替,较远点距离用测地线距离用最短路径逼近。 LLE:局部线性嵌入。前提假设是数据所在的低维…

流行学习与拉普拉斯变换的推导

参考:拉普拉斯矩阵 参考:流行学习

流行学习初步理解

一. 流形学习的英文名为manifold learning。其主要思想是把一个高维的数据非线性映射到低维,该低维数据能够反映高维数据的本质,当然有一个前提假设就是高维观察数据存在流形结构,其优点是非参数,非线性,求解过程简单。…

流行学习简单入门与理解

最近博主再看西瓜书第十三章半监督学习,文章中作者提到需要少量查询的主动学习、K-means簇的聚类,以及流行学习。对于流行学习,博主也是第一次接触,下面我们来简单学习和理解一下流行学习。 1. 半监督学习 SSL的成立依赖于模型假…

机器学习----流行学习(manifold learning)的通俗理解

流形学习(manifold learning)是一类借鉴了拓扑流行概念的降维方法,在降维时,若低维流行嵌入到高维空间中,则数据样本在高维空间的分布虽然看上去十分复杂,但在局部上仍具有欧式空间(对现实空间的…

流行学习Manifold Learning

文章目录 1、流行学习前言:2、流形学习的概念流形的概念:流行学习的概念: 3、流形学习的分类4、高维数据降维与可视化5、基本问题和个人观点6、参考文献 1、流行学习前言: 流形学习是个很广泛的概念。这里我主要谈的是自从2000年…

关于nn.embedding的理解

import torch.nn as nn nn.Embedding(num_embeddings, embedding_dim, padding_idxNone, max_normNone, norm_type2, scale_grad_by_freqFalse, sparseFalse)参数解释 num_embeddings (python:int) – 词典的大小尺寸,比如总共出现5000个词,那就输入500…

深究embedding层

关于embedding层,贴出一些很好的链接,以供备忘与分享。 http://blog.sina.com.cn/s/blog_1450ac3c60102x79x.html https://blog.csdn.net/sjyttkl/article/details/80324656 https://blog.csdn.net/jiangpeng59/article/details/77533309 https://juejin…

一文搞懂 Embedding !

这篇文章把embedding单独提出来,梳理一下embedding在推荐系统中的应用。以下内容主要从深度学习方法和传统的协同过滤方法两个方面加深和理解在推荐系统领域对embedding的认识,详细解读下“embedding”这一重要思想。 什么是Embedding? Embedding(嵌入)是拓扑学里面的词…