STM32CubeMX学习笔记(29)——FreeRTOS实时操作系统使用(消息队列)

发布者:爱笑的猫咪最新更新时间:2025-02-10 来源: jianshu关键字:STM32CubeMX  FreeRTOS  实时操作系统  消息队列 手机看文章 扫描二维码
随时随地手机看文章

一、FreeRTOS简介

FreeRTOS 是一个可裁剪、可剥夺型的多任务内核,而且没有任务数限制。FreeRTOS 提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等。

FreeRTOS 是用 C 和汇编来写的,其中绝大部分都是用 C 语言编写的,只有极少数的与处理器密切相关的部分代码才是用汇编写的,FreeRTOS 结构简洁,可读性很强!最主要的是非常适合初次接触嵌入式实时操作系统学生、嵌入式系统开发人员和爱好者学习。

最新版本 V9.0.0(2016年),尽管现在 FreeRTOS 的版本已经更新到 V10.4.1 了,但是我们还是选择 V9.0.0,因为内核很稳定,并且网上资料很多,因为 V10.0.0 版本之后是亚马逊收购了FreeRTOS之后才出来的版本,主要添加了一些云端组件,一般采用 V9.0.0 版本足以。

  • FreeRTOS官网:http://www.freertos.org/

  • 代码托管网站:https://sourceforge.net/projects/freertos/files/FreeRTOS/

二、新建工程

1. 打开 STM32CubeMX 软件,点击“新建工程”


2. 选择 MCU 和封装


3. 配置时钟
RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)


选择 Clock Configuration,配置系统时钟 SYSCLK 为 72MHz
修改 HCLK 的值为 72 后,输入回车,软件会自动修改所有配置


4. 配置调试模式
非常重要的一步,否则会造成第一次烧录程序后续无法识别调试器
SYS 设置,选择 Debug 为 Serial Wire

三、SYS Timebase Source

在 System Core 中选择 SYS ,对 Timebase Source 进行设置,选择 TIM1 作为HAL库的时基(除了 SysTick 外都可以)。

在基于STM32 HAL的项目中,一般需要维护的 “时基” 主要有2个:

  1. HAL的时基,SYS Timebase Source

  2. OS的时基(仅在使用OS的情况下才考虑)

而这些 “时基” 该去如何维护,主要分为两种情况考虑:

  • 裸机运行:
    可以通过 SysTick(滴答定时器)或 (TIMx)定时器 的方式来维护 SYS Timebase Source,也就是HAL库中的 uwTick,这是HAL库中维护的一个全局变量。在裸机运行的情况下,我们一般选择默认的 SysTick(滴答定时器) 方式即可,也就是直接放在 SysTick_Handler() 中断服务函数中来维护。

  • 带OS运行:
    前面提到的 SYS Timebase Source 是STM32的HAL库中的新增部分,主要用于实现 HAL_Delay() 以及作为各种 timeout 的时钟基准。

    在使用了OS(操作系统)之后,OS的运行也需要一个时钟基准(简称“时基”),来对任务和时间等进行管理。而OS的这个 时基 一般也都是通过 SysTick(滴答定时器) 来维护的,这时就需要考虑 “HAL的时基” 和 “OS的时基” 是否要共用 SysTick(滴答定时器) 了。

    如果共用SysTick,当我们在CubeMX中选择启用FreeRTOS之后,在生成代码时,CubeMX一定会报如下提示:

强烈建议用户在使用FreeRTOS的时候,不要使用 SysTick(滴答定时器)作为 “HAL的时基”,因为FreeRTOS要用,最好是要换一个!!!如果共用,潜在一定风险。


四、FreeRTOS

4.1 参数配置

在 Middleware 中选择 FREERTOS 设置,并选择 CMSIS_V1 接口版本


CMSIS是一种接口标准,目的是屏蔽软硬件差异以提高软件的兼容性。RTOS v1使得软件能够在不同的实时操作系统下运行(屏蔽不同RTOS提供的API的差别),而RTOS v2则是拓展了RTOS v1,兼容更多的CPU架构和实时操作系统。因此我们在使用时可以根据实际情况选择,如果学习过程中使用STM32F1、F4等单片机时没必要选择RTOS v2,更高的兼容性背后时更加冗余的代码,理解起来比较困难。

在 Config parameters 进行具体参数配置。

Kernel settings:

  • USE_PREEMPTION: Enabled:RTOS使用抢占式调度器;Disabled:RTOS使用协作式调度器(时间片)。

  • TICK_RATE_HZ: 值设置为1000,即周期就是1ms。RTOS系统节拍中断的频率,单位为HZ。

  • MAX_PRIORITIES: 可使用的最大优先级数量。设置好以后任务就可以使用从0到(MAX_PRIORITIES - 1)的优先级,其中0位最低优先级,(MAX_PRIORITIES - 1)为最高优先级。

  • MINIMAL_STACK_SIZE: 设置空闲任务的最小任务堆栈大小,以字为单位,而不是字节。如该值设置为128 Words,那么真正的堆栈大小就是 128*4 = 512 Byte。

  • MAX_TASK_NAME_LEN: 设置任务名最大长度。

  • IDLE_SHOULD_YIELD: Enabled 空闲任务放弃CPU使用权给其他同优先级的用户任务。

  • USE_MUTEXES: 为1时使用互斥信号量,相关的API函数会被编译。

  • USE_RECURSIVE_MUTEXES: 为1时使用递归互斥信号量,相关的API函数会被编译。

  • USE_COUNTING_SEMAPHORES: 为1时启用计数型信号量, 相关的API函数会被编译。

  • QUEUE_REGISTRY_SIZE: 设置可以注册的队列和信号量的最大数量,在使用内核调试器查看信号量和队列的时候需要设置此宏,而且要先将消息队列和信号量进行注册,只有注册了的队列和信号量才会在内核调试器中看到,如果不使用内核调试器的话次宏设置为0即可。

  • USE_APPLICATION_TASK_TAG: 为1时可以使用vTaskSetApplicationTaskTag函数。

  • ENABLE_BACKWARD_COMPATIBILITY: 为1时可以使V8.0.0之前的FreeRTOS用户代码直接升级到V8.0.0之后,而不需要做任何修改。

  • USE_PORT_OPTIMISED_TASK_SELECTION: FreeRTOS有两种方法来选择下一个要运行的任务,一个是通用的方法,另外一个是特殊的方法,也就是硬件方法,使用MCU自带的硬件指令来实现。STM32有计算前导零指令吗,所以这里强制置1。

  • USE_TICKLESS_IDLE: 置1:使能低功耗tickless模式;置0:保持系统节拍(tick)中断一直运行。假设开启低功耗的话可能会导致下载出现问题,因为程序在睡眠中,可用ISP下载办法解决。

  • USE_TASK_NOTIFICATIONS: 为1时使用任务通知功能,相关的API函数会被编译。开启了此功能,每个任务会多消耗8个字节。

  • RECORD_STACK_HIGH_ADDRESS: 为1时栈开始地址会被保存到每个任务的TCB中(假如栈是向下生长的)。

Memory management settings:

  • Memory Allocation: Dynamic/Static 支持动态/静态内存申请

  • TOTAL_HEAP_SIZE: 设置堆大小,如果使用了动态内存管理,FreeRTOS在创建 task, queue, mutex, software timer or semaphore的时候就会使用heap_x.c(x为1~5)中的内存申请函数来申请内存。这些内存就是从堆ucHeap[configTOTAL_HEAP_SIZE]中申请的。

  • Memory Management scheme: 内存管理策略 heap_4。

Hook function related definitions:

  • USE_IDLE_HOOK: 置1:使用空闲钩子(Idle Hook类似于回调函数);置0:忽略空闲钩子。

  • USE_TICK_HOOK: 置1:使用时间片钩子(Tick Hook);置0:忽略时间片钩子。

  • USE_MALLOC_FAILED_HOOK: 使用内存申请失败钩子函数。

  • CHECK_FOR_STACK_OVERFLOW: 大于0时启用堆栈溢出检测功能,如果使用此功能用户必须提供一个栈溢出钩子函数,如果使用的话此值可以为1或者2,因为有两种栈溢出检测方法。

Run time and task stats gathering related definitions:

  • GENERATE_RUN_TIME_STATS: 启用运行时间统计功能。

  • USE_TRACE_FACILITY: 启用可视化跟踪调试。

  • USE_STATS_FORMATTING_FUNCTIONS: 与宏configUSE_TRACE_FACILITY同时为1时会编译下面3个函数prvWriteNameToBuffer()、vTaskList()、vTaskGetRunTimeStats()。

Co-routine related definitions:

  • USE_CO_ROUTINES: 启用协程。

  • MAX_CO_ROUTINE_PRIORITIES: 协程的有效优先级数目。

Software timer definitions:

  • USE_TIMERS: 启用软件定时器。

Interrupt nesting behaviour configuration:

  • LIBRARY_LOWEST_INTERRUPT_PRIORITY: 中断最低优先级。

  • LIBRARY_LOWEST_INTERRUPT_PRIORITY: 系统可管理的最高中断优先级。

4.2 创建队列Queue

在 Tasks and Queues 进行配置。

创建一个消息队列TestQueue,

  • Queue Name: 队列名称

  • Queue Size: 队列能够存储的最大单元数目,即队列深度

  • Queue Size: 队列中数据单元的长度,以字节为单位

  • Allocation: 分配方式:Dynamic 动态内存创建

  • Buffer Name: 缓冲区名称

  • Buffer Size: 缓冲区大小

  • Conrol Block Name: 控制块名称

4.3 创建任务Task

我们创建两个任务,一个消息接收任务,一个消息发送任务。

  • Task Name: 任务名称

  • Priority: 优先级,在 FreeRTOS 中,数值越大优先级越高,0 代表最低优先级

  • Stack Size (Words): 堆栈大小,单位为字,在32位处理器(STM32),一个字等于4字节,如果传入512那么任务大小为512*4字节

  • Entry Function: 入口函数

  • Code Generation Option: 代码生成选项

  • Parameter: 任务入口函数形参,不用的时候配置为0或NULL即可

  • Allocation: 分配方式:Dynamic 动态内存创建

  • Buffer Name: 缓冲区名称

  • Conrol Block Name: 控制块名称


五、KEY

5.1 参数配置

在 System Core 中选择 GPIO 设置。

在右边图中找到按键对应引脚,选择 GPIO_Input。

六、UART串口打印

查看 STM32CubeMX学习笔记(6)——USART串口使用


七、生成代码

输入项目名和项目路径

选择应用的 IDE 开发环境 MDK-ARM V5

每个外设生成独立的 ’.c/.h’ 文件
不勾:所有初始化代码都生成在 main.c
勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。


点击 GENERATE CODE 生成代码


八、创建队列

8.1 相关API说明

8.1.1 osMessageQId

队列ID。例如,对osMessageCreate的调用返回。可用作参数到osMessageDelete以删除队列。


/// Message ID identifies the message queue (pointer to a message queue control block).

/// note CAN BE CHANGED: b os_messageQ_cb is implementation specific in every CMSIS-RTOS.

typedef QueueHandle_t osMessageQId;


8.1.2 osMessageCreate

使用动态内存的方式创建一个新的队列。

函数osMessageQId osMessageCreate (const osMessageQDef_t *queue_def, osThreadId thread_id)
参数queue_def: 引用由osMessageQDef定义的队列

thread_id: 线程ID或NULL
返回值成功返回队列ID,失败返回0

8.1.3 osMessageDelete

队列删除函数是根据消息队列ID直接删除的,删除之后这个消息队列的所有信息都会被系统回收清空,而且不能再次使用这个消息队列了。

函数osStatus osMessageDelete (osMessageQId queue_id)
参数queue_id:  消息队列ID,表示的是要删除哪个想队列
返回值错误码

8.2 示例


osMessageQId TestQueueHandle;


/* 创建 Test_Queue */ 

/* Create the queue(s) */

/* definition and creation of TestQueue */

osMessageQDef(TestQueue, 16, uint32_t);/* 第2参数:消息队列的长度,第3参数:消息的大小 */

TestQueueHandle = osMessageCreate(osMessageQ(TestQueue), NULL);

九、消息发送与接收

9.1 相关API说明

9.1.1 osMessagePut

用于向队列尾部发送一个队列消息。消息以拷贝的形式入队,而不是以引用的形式。可用在中断服务程序中。

函数osStatus osMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec)
参数queue_id: 目标队列ID。这个句柄即是调用 osMessageCreate() 创建该队列时的返回值

info: 发送数据的指针。其指向将要复制到目标队列中的数据单元。由于在创建队列时设置了队列中数据单元的长度,所以会从该指针指向的空间复制对应长度的数据到队列的存储区域。

millisec: 队列空时,阻塞超时的最大时间。如果该参数设置为 0,函数立刻返回。超时时间的单位为系统节拍周期,常量 portTICK_PERIOD_MS 用于辅助计算真实的时间,单位为 ms。如果 INCLUDE_vTaskSuspend 设置成 1,并且指定延时为 portMAX_DELAY 将导致任务无限阻塞(没有超时)。
返回值错误码

9.1.2 osMessageGet

用于从一个队列中接收消息并把消息从队列中删除。接收的消息是以拷贝的形式进行的,所以我们必须提供一个足够大空间的缓冲区。具体能够拷贝多少数据到缓冲区,这个在队列创建的时候已经设定。可用在中断服务程序中。

函数osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec)
参数queue_id: 被读队列ID。这个句柄即是调用 osMessageCreate() 创建该队列时的返回值

millisec: 队列空时,阻塞超时的最大时间。如果该参数设置为 0,函数立刻返回。超时时间的单位为系统节拍周期,常量 portTICK_PERIOD_MS 用于辅助计算真实的时间,单位为 ms。如果 INCLUDE_vTaskSuspend 设置成 1,并且指定延时为 portMAX_DELAY 将导致任务无限阻塞(没有超时)。
返回值错误码

9.1.3 osMessagePeek

osMessagePeek() 也是从从队列中接收数据单元,不同的是并不从队列中删出接收到的单元。osMessagePeek() 从队列首接收到数据后,不会修改队列中的数据,也不会改变数据在队列中的存储序顺。可用在中断服务程序中。

函数osEvent osMessagePeek (osMessageQId queue_id, uint32_t millisec)
参数queue_id: 被读队列ID。这个句柄即是调用 osMessageCreate() 创建该队列时的返回值

millisec: 队列空时,阻塞超时的最大时间。如果该参数设置为 0,函数立刻返回。超时时间的单位为系统节拍周期,常量 portTICK_PERIOD_MS 用于辅助计算真实的时间,单位为 ms。如果 INCLUDE_vTaskSuspend 设置成 1,并且指定延时为 portMAX_DELAY 将导致任务无限阻塞(没有超时)。
返回值错误码

9.2 示例

9.2.1 阻塞式发送与接收

/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/

#include 'main.h'

#include 'cmsis_os.h'


/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include

#include

/* USER CODE END Includes */


/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */


/* USER CODE END PTD */


/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */


/* USER CODE END PD */


/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */


/* USER CODE END PM */


/* Private variables ---------------------------------------------------------*/

UART_HandleTypeDef huart1;

DMA_HandleTypeDef hdma_usart1_rx;

DMA_HandleTypeDef hdma_usart1_tx;


osThreadId defaultTaskHandle;

osThreadId ReceiveHandle;

osThreadId SendHandle;

osMessageQId TestQueueHandle;

/* USER CODE BEGIN PV */


/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_DMA_Init(void);

static void MX_USART1_UART_Init(void);

void StartDefaultTask(void const * argument);

void ReceiveTask(void const * argument);

void SendTask(void const * argument);


/* USER CODE BEGIN PFP */


/* USER CODE END PFP */


/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */


/* USER CODE END 0 */


/**

  * @brief  The application entry point.

  * @retval int

  */

int main(void)

{

  /* USER CODE BEGIN 1 */


  /* USER CODE END 1 */


  /* MCU Configuration--------------------------------------------------------*/


  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();


  /* USER CODE BEGIN Init */


  /* USER CODE END Init */


  /* Configure the system clock */

  SystemClock_Config();


  /* USER CODE BEGIN SysInit */


  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_DMA_Init();

  MX_USART1_UART_Init();

  /* USER CODE BEGIN 2 */


  /* USER CODE END 2 */


  /* USER CODE BEGIN RTOS_MUTEX */

  /* add mutexes, ... */

  /* USER CODE END RTOS_MUTEX */


  /* USER CODE BEGIN RTOS_SEMAPHORES */

  /* add semaphores, ... */

  /* USER CODE END RTOS_SEMAPHORES */


  /* USER CODE BEGIN RTOS_TIMERS */

  /* start timers, add new ones, ... */

  /* USER CODE END RTOS_TIMERS */


  /* Create the queue(s) */

  /* definition and creation of TestQueue */

  osMessageQDef(TestQueue, 16, uint32_t);

  TestQueueHandle = osMessageCreate(osMessageQ(TestQueue), NULL);


  /* USER CODE BEGIN RTOS_QUEUES */

  /* add queues, ... */

  /* USER CODE END RTOS_QUEUES */

[1] [2]
关键字:STM32CubeMX  FreeRTOS  实时操作系统  消息队列 引用地址:STM32CubeMX学习笔记(29)——FreeRTOS实时操作系统使用(消息队列)

上一篇:STM32CubeMX学习笔记(46)——USB接口使用(HID自定义设备)
下一篇:STM32CubeMX学习笔记(51)——读写内部Flash

推荐阅读最新更新时间:2026-03-24 20:23

STM32与FreeRTOS中的消息队列详解
01 一、概述 队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任务间传递信息,实现了任务接收来自其他任务或中断的不固定长度的消息,任务能够从队列里面读取消息,当队列中的消息是空时,读取消息的任务将被阻塞,用户还可以指定阻塞的任务时间 xTicksToWait,在这段时间中,如果队列为空,该任务将保持阻塞状态以等待队列数据有效。 当队列中有新消息时,被阻塞的任务会被唤醒并处理新消息;当等待的时间超过了指定的阻塞时间,即使队列中尚无有效数据,任务也会自动从阻塞态转为就绪态。 消息队列是一种异步的通信方式。通过消息队列服务,任务或中断服务例程可以将一条或多条消息放入消息队列中。同样,
[单片机]
STM32与<font color='red'>FreeRTOS</font>中的<font color='red'>消息</font><font color='red'>队列</font>详解
Small RTOS51中消息队列的一处隐患
引 言 Small RTOS5l是一款专门为80C5l系列单片机设计的实时操作系统(实际上应该称其为实时内核),大部分代码用C语言编写,易于移植,十分适合于资源紧张的8位机。同时,它也是学习嵌入式操作系统原理极好的入门材料。本人就是在学习完SmallRTOS5l的基础上进一步学习了著名的uC/0S-II,受益颇多。 1 问题描述 在将Smau RTOS51应用于实验室某项目时,发现了一个奇怪的问题。简单说来,就是一个以无条件方式申请消息的任务竟然在没有取到消息的情况下,以指示“等待超时”的代码返回了。 在这里,首先解释一下任务申请消息的两种方式:无条件方式和超时方式。所谓五条件方式是指任务申请消息时,如果暂时没有消
[嵌入式]
Small RTOS51中消息队列的一处隐患
引 言 Small RTOS5l是一款专门为80C5l系列单片机设计的实时操作系统(实际上应该称其为实时内核),大部分代码用C语言编写,易于移植,十分适合于资源紧张的8位机。同时,它也是学习嵌入式操作系统原理极好的入门材料。本人就是在学习完SmallRTOS5l的基础上进一步学习了著名的uC/0S-II,受益颇多。 1 问题描述 在将Smau RTOS51应用于实验室某项目时,发现了一个奇怪的问题。简单说来,就是一个以无条件方式申请消息的任务竟然在没有取到消息的情况下,以指示“等待超时”的代码返回了。 在这里,首先解释一下任务申请消息的两种方式:无条件方式和超时方式。所谓五条件方式是指任务申请消息时,如果暂时没有消
[应用]
使用STM32CubeMx工具编写FreeRTOS的demo程序
CubeMX的基础使用方法,可以参看我之前发的一个视频STM32打印数据到串口助手。 环境 STM32CubeMX KEIL5 STM32F103 开始试验 新建工程 打开CubeMx软件,点击File- NewProject。 选择使用的控制器型号。 选择系统时钟源 设置时钟 如下图,在右边红框处输入72,直接按回车键即可,CubeMX会帮你配置好。 选择调试环境 这里要选择Serial wire,否则程序只能下载一次。 设置管脚 使能FreeRTOS 添加任务 点击“Tasks and Queues”,添加Task1和Task2两个任务。 配置工程 生成并打开工程 在源码“Task”字样处添
[单片机]
使用<font color='red'>STM32CubeMx</font>工具编写<font color='red'>FreeRTOS</font>的demo程序
ThreadX——IPC应用之消息队列
一、应用简介 消息队列是RTOS中常用的一种数据通信方式,常用于任务与任务之间或是中断与任务之间的数据传递。在裸机系统中我们通常会使用全局变量的方式进行数据传递,比如在事件发生后在中断中改变数据和设置标志,然后在主循环中轮询不同的标志是否生效来对全局数据执行不同的操作,执行完毕后清除相关标志。但是这种方式需要不断地轮询标志状态,使得CPU的利用率并不高。而使用RTOS的消息队列则具有任务阻塞机制,当没有需要处理的消息时任务挂起等待消息,此时其他任务占用CPU执行其他操作,当有消息放入队列时任务恢复运行进行消息接收和处理。这种消息处理机制相比裸机而言大大地提高了CPU利用率。 ThreadX的消息队列支持“消息置顶通知”功能,也
[单片机]
ThreadX——IPC应用之<font color='red'>消息</font><font color='red'>队列</font>
STM32CubeMX学习笔记——FreeRTOS_任务挂起与继续
Github https://github.com/HaHaHaHaHaGe/Planof2019_half/tree/master/Course_Project/FreeRTOS/Class02_SuspendResume 简介 任务挂起与继续的作用,用于暂停运行某些任务与继续运行某些任务。就像用视频播放器看电影的播放按键与暂停按键一样简单。 在STM32CubeMX上配置FreeRTOS非常的简单,几乎不需要做任何操作,只需要勾选 移植FreeRTOS就成功了,关于在非Cube上的RTOS配置文件内的相关内容,也在下方的Configuration栏中给好了 所有的配置都可以在这里完成 任务创建 有别于在没有
[单片机]
<font color='red'>STM32CubeMX</font>学习笔记——<font color='red'>FreeRTOS</font>_任务挂起与继续
STM32CubeMX FreeRTOS二值信号量实验
系统:linux mint xfce 64bit 软件: 1、SW4STM32 2、STM32CubeMX 3、开发板:STM32F407VET6核心 二值信号量作用: (1)任务间同步 (2)中断与任务间同步 本次实验二值信号量的作用是中断与任务间同步,使用STM32CubeMX配置的freertos其API进行了封装,是CMSIS格式的API,关于二值信号量的操作函数如下图所示 实验效果:串口发送5个字节长度的字符串后,触发接收中断,同时发生二值信号量osSemaphoreRelease(myBinarySem01Handle) ,然后在任务函数1里面打印出相关信息已经字符串。 (1)配置RCC(外部晶振8M),SYS(s
[单片机]
<font color='red'>STM32CubeMX</font> <font color='red'>FreeRTOS</font>二值信号量实验
了解消息队列遥测传输协议 (MQTT) 在工业自动化行业的应用
消息队列遥测传输 (MQTT) 的历史 MQTT 由 Andy Stanford-Clark 与 IBM 和 Arlen Nipper 于 1999 年开发,用于通过卫星将石油管道上的测量设备连接到他们的 SCADA(监督控制和数据采集)系统。他们开发这个协议是因为他们需要一些轻量级、带宽资源丰富且消耗很少功耗的协议来通过卫星链路。 2014年,MQTT正式成为OASIS(结构化信息标准促进组织)开放标准。它旨在保持开源实现,以确保在机器对机器 (M2M) 行业中得到广泛采用。 2019年,OASIS发布了官方更新的MQTT 5.0标准。5.0 版包括诸多新功能:例如原因代码、共享订阅、消息到期和主题别名。 如今,
[嵌入式]
了解<font color='red'>消息</font><font color='red'>队列</font>遥测传输协议 (MQTT) 在工业自动化行业的应用
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved