FreeRTOS学习笔记-基于stm32f103(1)基础知识

news2024/10/6 2:22:49

一、裸机与RTOS

我们使用的32板子是裸机,又称前后台系统。裸机有如下缺点:

1、实时性差。只能一步一步执行任务,比如在一个while循环中,要想执行上一个任务,就必须把下面的任务执行完,循环一遍后才能执行这个任务;

2、浪费资源。在程序delay延时的时候会进入空等待,此时CPU不执行其他代码;

3、结构臃肿。实现的功能都放在无限循环中。

RTOS(Real Time OS)实时操作系统就可以解决这些问题。RTOS有以下特点:

1、分而治之。实现的功能可以划分为多个任务;

2、任务调度。在延时函数时,不会进入空等待,而是让CPU执行其他任务;

3、抢占式。高优先级的任务可以抢占低优先级的任务;

4、任务堆栈。每个任务都有自己的栈空间,用于保存局部变量以及任务的上下文信息。

注意:中断可以打断任意任务;任务可以同等优先级。

二、任务调度

1、任务调度器

使用相关的调度算法来决定当前需要执行的任务

2、调度方式

①抢占式调度:

主要针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务先执行,高优先级的任务可以抢占低优先级的任务;

        注意:

        高优先级的任务优先执行;

        高优先级的任务不停止,低优先级的任务无法执行;

        被抢占的任务将进入就绪态

②时间片调度:

主要针对优先级相同的任务,优先级任务相同的时候,任务调度器在每一个系统时钟节拍到的时候切换任务,即每一个任务执行一个滴答定时器中断周期的时间,然后执行别的任务;

        注意:

        同等优先级任务会轮流执行,时间片流转;

        一个时间片大小取决于滴答定时器中断频率

        如果任务被中途打断或阻塞,没有用完的时间片不会再次使用,而是直接跳过

③协程式调度(了解即可):

一个任务执行完后才能执行另一个任务,且不能被抢占。

三、任务状态

1、FreeRTOS的任务状态

①运行态:即正在执行的任务,STM32中,同一时间只有一个任务处于运行态

②就绪态:任务已经能够被执行但还未执行;

③阻塞态:任务因延时或等待外部事件发生;

④挂起态:类似暂停,调用vTaskSuspend()进入挂起态,调用vTaskResume()解挂函数解除挂起态。

        注意:

        ①:挂起态解除后会进入就绪态;

        ②:仅就绪态才可以转变为运行态;

        ③:其他状态想要运行,必须先转变为就绪态。

2、状态之间的转换

四、状态列表

这四种状态中,除了运行态,其他三种任务状态都有对应的任务状态列表:就绪列表(pxReadyTasksList[x]);阻塞列表(pxDelayedTaskList[x]);挂起列表(xSuspendedTaskList[x])其中x代表任务优先级数值,为0~31。

而任务调度器总是在所有处于就绪列表的任务中,选择优先级最高的任务来执行,如果优先级相同,就使用时间片调度,“同时”执行同一优先级的任务

五、任务实现

在使用 FreeRTOS 的过程中,我们要使用函数 xTaskCreate() xTaskCreateStatic()来创建任 务,这两个函数的第一个参数 pxTaskCode,就是这个任务的任务函数。什么是任务函数?任务函数就是完成本任务工作的函数。

FreeRTOS 官方给出的任务函数模板如下:

void vATaskFunction(void *pvParameters) (1)
{
    for( ; ; ) (2)
    {
        --任务应用程序-- (3)
        vTaskDelay(); (4)
    }
    /* 不 能 从 任 务 函 数 中 返 回 或 者 退 出 , 从 任 务 函 数 中 返 回 或 退 出 的 话                 就 会 调 用configASSERT(),前提是你定义了 configASSERT()。如果一定要从任务函数中退出的话那一定 要调用函数 vTaskDelete(NULL)来删除此任务。*/
    vTaskDelete(NULL); (5)
}

(1)、任务函数本质也是函数,所以肯定有任务名什么的,不过这里我们要注意:任务函数 的返回类型一定要为 void 类型,也就是无返回值,而且任务的参数也是 void 指针类型的!任务 函数名可以根据实际情况定义。

(2)、任务的具体执行过程是一个大循环,for(; ; )就代表一个循环,作用和 while(1)一样,笔 者习惯用 while(1)。

(3)、循环里面就是真正的任务代码了,此任务具体要干的活就在这里实现!

(4)、FreeRTOS 的延时函数,此处不一定要用延时函数,其他只要能让 FreeRTOS 发生任务 切换的 API 函数都可以,比如请求信号量、队列等,甚至直接调用任务调度器。只不过最常用 的就是 FreeRTOS 的延时函数。

(5)、任务函数一般不允许跳出循环,如果一定要跳出循环的话在跳出循环以后一定要调用 函数 vTaskDelete(NULL)删除此任务!

(6)、FreeRTOS 的每个任务都有一些属性需要存储,FreeRTOS 把这些属性集合到一起用一个结 构体来表示,这个结构体叫做任务控制块:TCB_t,在使用函数 xTaskCreate()创建任务的时候就 会自动的给每个任务分配一个任务控制块。

六、任务堆栈

FreeRTOS 之所以能正确的恢复一个任务的运行就是因为有任务堆栈在保驾护航,任务调 度器在进行任务切换的时候会将当前任务的现场(CPU 寄存器值等)保存在此任务的任务堆栈中, 等到此任务下次运行的时候就会先用堆栈中保存的值来恢复现场,恢复现场以后任务就会接着 从上次中断的地方开始运行。

xTaskCreate()创建任务(动态方法):任务堆栈就会由函数 xTaskCreate()自动创建;

xTaskCreateStatic()创建任务(静态方法):需自行定义任务堆栈,然 后堆栈首地址作为函数的参数 puxStackBuffer 传递给函数;

TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
                                const char * const pcName,
                                const uint32_t ulStackDepth,
                                void * const pvParameters,
                                UBaseType_t uxPriority,
                                StackType_t * const puxStackBuffer,//堆栈地址
                                StaticTask_t * const pxTaskBuffer )

不管是使用函数 xTaskCreate()还是 xTaskCreateStatic()创建任务都需要指定任务堆栈大 小。任务堆栈的数据类型为 StackType_t,StackType_t 本质上是 uint32_t,也就是4字节。

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

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

相关文章

智能风控体系之基于IC值因子有效性研究

在量化金融股市市场中,因子有效性的检验是经常被提及的。实际上对于多因子量化选股模型的有效性分析,更有指导参考意义的指标应该观察看的IC和IR。 因子评价4大维度: 1.因子单调性:因子单调性越高,收益越强。 2.因子…

笔记74:在SLAM建图过程中,为什么要使用【障碍物点云配准算法】和【里程计估算算法】结合的方法

仅使用【障碍物点云配准算法】,很容易导致在一条长通道中,因为前后两帧的雷达点云图过于相似,导致特征匹配一直完全重合,使得机器人建图一直停留在原地,但实体机器人早就沿着通道跑向远端了; 使用Hector_ma…

三范式与ER模型

三范式 概念: 三范式(3NF)是关系型数据库设计理论的基础,它确保数据的结构化和减少数据的冗余性。三范式由数学家E.F. Codd在1970年提出,作为关系理论的一部分。三范式包括: 第一范式(1NF&am…

182基于matlab的半监督极限学习机进行聚类

基于matlab的半监督极限学习机进行聚类,基于流形正则化将 ELM 扩展用于半监督,三聚类结果可视化输出。程序已调通,可直接运行。 182matlab ELM 半监督学习 聚类 模式识别 (xiaohongshu.com)

我的NPI项目之Android 安全系列 -- Keymaster到底是个什么

最近因为一直在调研独立secure element集成的工作,不巧的是目前使用的高通平台只有NFC-eSE的方案。高通目前也并不支持独立的eSE集成,codebase中并无相对应的代码。举个例子,目前使用的STM的一款eSE,但是这款eSE的开发STM还没有完…

Mint_21.3 drawing-area和goocanvas的FB笔记(三)

一、改变goocanvas线条自动画线时间间隔 通过系统SIGALRM信号触发,每秒画一条线对于慢温湿度等慢变信号可以应付,但对于快速信号1秒的间隔就太慢了。可以改变方式,通过另外的线程,完成要做的任务。 1. 线程的回调函数 myfunc 2…

串的定义及BF算法

定义 BF算法——朴素查找算法——也叫做串的模式匹配算法 其应用特别多,比如经常在一篇文章里面搜索一些东西,(比如文章里的某个内容,或某些关键字词出现的位置,次数等) 之前我们大多数情况下是用来搜索关…

在Ubuntu中安装pycharm的专业版且可以激活到2099年(保姆级教学,值得借鉴与信任)

一、进入官网,下载Pycharm2021.3版本 1.官网如下 https://www.jetbrains.com/pycharm/2.在浏览器中进入官网后,点击Download 3.再点击右下角的Other versions 4.选择Version 2021.3下的2021.3-Linux(tar.gz)进行下载 二、安装Pycharm2021.3 1.先将该压…

还在手动Word转PPT?快来试试这些一键生成工具!

在我们日常的工作和学习中,将Word转化成PPT的需求时常出现,尤其是当我们需要进行演讲或者报告时。这不仅能使我们的演讲更具视觉冲击力,也有助于我们更好地传达信息。 那么,如何才能轻松地将Word转换成PPT呢?下面将为…

MWC 2024 | 紫光展锐推出业界首款全面支持5G R16宽带物联网特性的芯片平台V620

要点: 紫光展锐V620支持5/4/3/2G全网通。支持NR 2CC和LTE 5CC,在SA网络下,其5G下行速率可达4.67Gbps,上行速率高达1.875Gbps,相比紫光展锐上一代产品提升100%。紫光展锐V620率先支持5G TSN,把5G应用于工业…

汽车设计的视觉盛宴:艺术家的渲染效果图集锦

对于那些对汽车渲染艺术充满热情的朋友来说,"至臻汽车"渲染效果图总是心之向往。本回,我们精心准备了第十届3dmodels年度汽车渲染比赛的佳作,收录了来自全球的顶级创作者的精彩作品。每张作品都代表了艺术家对精细质感的深究及对极…

基于springboot+vue的流浪宠物管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

【每日刷题】数组-LC56、LC238、随想录1、LC560

1. LC56 合并区间 题目链接 Arrays.sort先让intervals里的子数组按照子数组的第一个数字值从小到大排列。开一个新数组,newInterval,存放合并好的子数组让intervals的当前子数组i的第一个数字与newInterval的当前子数组index的最后一个数字比较大小&am…

软文推广带来的收录排名提升,助你在搜索引擎中脱颖而出

互联网营销是一种不受时间和空间限制的营销方式,是一些中小企业成本低、效果好的推广方式。 行业做软文推广,最重要的是选择合适的软文推广平台,现在市场上有很多软文推广平台,这使得很多企业难以选择,此时企业需要学会…

回溯算法套路③排列型回溯+N皇后【基础算法精讲 16】

46 . 全排列 链接 : . - 力扣&#xff08;LeetCode&#xff09; 思路 : 那么怎么确定选了那个数呢? 这里设置一个used表示i选没选过 ; class Solution { public:vector<vector<int>> ans;vector<int> path;void backtrack(vector<int>nums,vect…

常见漏洞的流量特征

1、SQL注入漏洞 查看url / Referer字段/User-Agent字段/cookie字段 出现一些特殊字符&#xff08;eg&#xff1a;单引号【‘】、双引号【“”】、括号【&#xff08;&#xff09;】、单引号括号【‘&#xff08;】、双引号括号【“&#xff08;】等一些常见的特殊的字符&#…

ansible执行速度慢问题解决过程

ansible执行速度慢问题解决过程 一、初见端倪二、问题分析三、解决问题更多技术博客,请关注微信公众号:运维之美 接到项目反馈,客户环境使用我们提供工具部署产品,在主机添加步骤卡了很久,实施同学没有办法,将问题上升给我们。 环境信息:kylin10 架构:arm 一、初见…

【NR 定位】3GPP NR Positioning 5G定位标准解读(四)

目录 前言 6 Signalling protocols and interfaces 6.1 支持定位操作的网络接口 6.1.1 通用LCS控制平面架构 6.1.2 NR-Uu接口 6.1.3 LTE-Uu接口 6.1.4 NG-C接口 6.1.5 NL1接口 6.1.6 F1接口 6.1.7 NR PC5接口 6.2 终端协议 6.2.1 LTE定位协议&#xff08;LPP&#x…

python二级常见题目

一.常见语法 jieba—第三方中文分词函数库 jieba—第三方中文分词函数库_jieba库函数-CSDN博客 Python基础——format格式化 Python基础——format格式化_python format-CSDN博客 format()方法的使用超全_format方法-CSDN博客 Python中random函数用法整理 Python中random…

如何在CentOS部署JumpServer堡垒机并实现无公网ip环境远程访问

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…