news 2026/10/18 14:03:17

STM32上跑FreeRTOS:实时任务调度全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32上跑FreeRTOS:实时任务调度全解析

一、前言

STM32F103ZET6上边可以架什么操作系统?

答:可以架FreeRTOS()系统和RT-Thread等,不可以架Linux,因为没有Linux需要的存储单元。

RTOS(Real Time Operation System):实时操作系统。

围绕FreeRTOS学会使用各种API

正点原子开发板:http://www.openedv.com/docs/boards/stm32/zdyz_stm32f103_warshipV4.html

任务的管理:任务的创建、删除、挂起、恢复

任务之间的通信:事件标记组、队列、信号量、任务通知(轻量信号量)

(一)任务的执行方式

1.轮询方式

int main(){ while(1){ feed(); } }

如果我们在轮询一件事情的时候遇见第二件事情,解决方式有:

(1)前后台(通常是裸机系统)

前台去写中断函数,后台进行轮询。

//后台喂饭 int main(){ while(1){ feed(); } } //前台 void 中断(){ while(1){ message(); } }
(2)状态机

让函数短一些,可以将一个函数拆分成若干个小步骤。

void feed(){ static int flag=1; //c的静态常量存储在静态存储区 switch(flag){ case 1: 盛饭; flag++; break;//每次运行的时间只有1s。下一秒再进另一个函数运行1s在退回来 case 2: 舀饭; flag++; break; case 3: .... break; } } void message(){ .... } int main(){ feed(); message(); //启动调度器,让操作系统的内核启动起来,让cpu自己去工作 start_scheduler(); }

二、嵌入式实时操作系统概述

2.1 什么是操作系统?

最底层的软件,用来控制和管理硬件的,为用户的应用程序提供服务。

2.2 什么是实时操作系统?

当外界事件或数据产生时候,能够接受并以足够快的速度处理,其处理结果又能在规定时间内来内阁制生产过程或对处理系统做出快速响应。

和非实时系统的区别?

非实时的系统的任务中没有时间限制。

2.3 操作系统的基本功能

(1)任务管理

任务(进程)是程序的一次执行。

(2)CPU管理

CPU管理的含义在于多任务OS对CPU的分配,分配对CPU的所有权。

(3)内存管理

根据内存占用大小的不同去分配内存。

(4)文件管理

对文件进行新建、修改、 删除回收等

可抢占型:原任务可以被中间唤起的任务中断,去执行唤起的任务,完成后再执行原任务

不可抢占型:时间片轮转,原任务不能被唤起的任务抢占,只有执行完原任务才能够执行下一个任务

通常优先级相同的情况下用时间片轮转的方式进行任务。优先级不同就是可抢占型,高优先级打断低优先级。

2.4 实时操作系统的基本特征

(1)实时操作系统首先是多任务操作系统

(2)多级中断机制

(3)优先级调度机制

裸机:前后台形式,通常是前台中断服务函数,后台是大的while(1)循环(应用程序)

痛点:

①实时性比较差

②delay(空等待,cpu不执行其他代码)

③结构臃肿(实现功能放在无限循环)

RTOS:实时操作系统,强调实时性

优点:

①分而治之:实现功能划分为多个任务

②延时函数:任务调度

③抢占式:高优先级任务抢占低优先级任务

⑤任务堆栈:每个人物都有自己的栈空间

寻找更高优先级的任务,寻找到并直接跳到最高优先级任务去执行,每一个任务切换的时机,必然是切换到最高优先级的任务,体现了它的实时性。

三个原则

①高优先级的任务绝对不能够一直运行!!(低优先级没有运行的机会)

②中断的优先级高于任何一个任务(可以打断任何任务,想让一个任务优先级很高,不如直接做成中断)。

③任务的优先级可以设置成相同的

三、FreeRTOS 基础知识

3.1 任务的调度(算法)

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

(算法是由写操作系统内核工程师完成的,即内核源码)

(1)抢占式调度(针对优先级不同的任务)※

高优先级抢占低优先级。

(在Free RTOS中,优先级越高,数字越大)

①任务优先级高先执行

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

③被抢占的任务进入等待

(2)时间片调度※

当优先级相同情况下,由时间片调度,遇见阻塞直接跳到下一个任务。

(FreeRTOS 的时间片1ms轮转一次)

Systick(滴答定时器)

(3)协程式调度(已经不常见了)

当前执行任务会一直运行,同时高优先级的任务不会抢占低优先级任务。

3.2 任务的状态(分时操作系统)

(1)运行态:正在执行的任务一定处于运行态(STM32中同一时刻只有一个任务处于运行态,因为只有一个内核)

(2)就绪态:所有任务创建自动进入就绪态;能被运行,但还没被运行,相当于ready的状态。

(3)阻塞态:因为延时或者等待外部事件的发生而导致运行态无法运行

(4)挂起态:类似于暂停,调用vTaskSuspend()进入挂起态,需要用vTaskResume()进行解除,之后进入就绪态。

注意:

①只有就绪态可转变成运行态

②其他状态的任务想要运行,必须要先变成就绪态

③任务创建完成,该任务自动变成就绪态

④让运行态变成阻塞态可以用延时或者添加运行条件

除了运行态,其他三个状态都会有对应的任务状态列表:

·就绪列表 pxReadyTasksLists

·阻塞列表 pxDelayedTasksLists

·挂起列表 xSuspendedTasksLists

会从高优先级一个一个地去寻找任务

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/18 14:01:35

STM32F030多点温度采集:DS18B20单总线时序与ROM搜索代码解析

简介:STM32F030多点温度采集系统源码包,为物联网嵌入式开发人员提供一套基于DHT20传感器与移远BC260Y-CN NB-IoT模块的完整代码实现,主要解决低功耗环境下多点温度数据采集、本地显示与云平台接入问题。压缩包共24个文件,包括10个…

作者头像 李华
网站建设 2026/10/18 13:59:07

Axure浏览器调试插件原理与实战避坑指南

简介:本资源是专为Axure原型设计师与前端协作人员提供的Chrome浏览器扩展插件,解决Axure本地原型无法实时预览、快速分享及跨工具协同的痛点,适用于中初级产品/交互设计师、UI开发工程师等需高频验证交互逻辑的场景。压缩包为25KB的ZIP文件&a…

作者头像 李华
网站建设 2026/10/18 13:57:32

Tomcat 8 绿色版实战:免安装配置与部署避坑指南

简介:面向 Java Web 初学者与轻量级应用开发者,这份绿色版 Tomcat 8 压缩包无需安装,解压即可运行,便于在本地快速搭建 JSP/Servlet 调试环境,也适合中小型系统及并发访问不高的项目作为服务器使用。压缩包共 645 个文…

作者头像 李华
网站建设 2026/10/18 13:57:11

深度学习口罩识别系统落地实战:从模型选型到CPU部署全流程

帮客户做门禁系统升级那段时间,我一直被一个问题烦着:园区出入口装了普通网络摄像头,管理员不可能二十四小时盯屏幕,又要求对每一个进出的人做口罩佩戴判断。这种需求听起来不复杂,但真正动手时才发现,做一…

作者头像 李华
网站建设 2026/10/18 13:56:13

Unity调用原生安卓入门:JNI、AAR与AndroidJavaClass实战指南

简介:这份工具集面向希望打通 Unity 与原生安卓交互的开发者,尤其适合刚接触 JNI 与 Android 插件封装、需要可运行参考案例的入门到进阶人群。内容围绕 Unity 调用原生安卓的常见需求展开,涵盖 UnityActivity、UnityAppContext、PackageMana…

作者头像 李华
网站建设 2026/10/18 13:56:07

第五章 C++20标准的改进(代码说明)

// cpp20_demo.cpp // 编译: g -stdc20 -pthread cpp20_demo.cpp -o cpp20_demo // 运行: ./cpp20_demo#include <iostream> // 输入输出 #include <format> // C20 格式化库 #include <concepts> // C20 概念 #include <ranges> …

作者头像 李华