当前位置: 首页 > news >正文

FreeRTOS创建多线程详解

文章目录

    • 简介
    • 参数说明
    • 任务堆栈
    • 任务优先级

简介

【xTaskCreate】是FreeRTOS中用于创建线程的函数,其最简单的使用方法为

void task();
static TaskHandle_t hTask;
xTaskCreate(task, ( const char * ) "Task", configMINIMAL_STACK_SIZE,NULL, tskIDLE_PRIORITY, &hTask);
vTaskStartScheduler();

调用之后,xTaskCreate将创建一个新的线程来执行task函数,并将task函数的任务控制块存放在句柄hTask中。【vTaskStartScheduler】则用于任务调度,表示开始执行所有的任务。

参数说明

【xTaskCreate】的函数原型如下

BaseType_t xTaskCreate(TaskFunction_t pxTaskCode,const char *const pcName,const uint16_t usStackDepth,void *const pvParameters,UBaseType_t uxPriority,TaskHandle_t *const pxCreatedTask);

其中

  • 【pxTaskCode】指向任务函数的指针,在实际使用中,可以是无返回值的函数。
  • 【pcName】任务名,最大长度为【configMAX_TASK_NAME_LEN】,默认为10
  • 【usStackDepth】任务堆栈大小,以字为单位。【configMINIMAL_STACK_SIZE】默认为200。
  • 【pvParameters】传递给任务函数的参数,如果没有就填 NULL
  • 【uxPriority】任务优先级,最大值为(configMAX_PRIORITIES-1)
  • 【pxCreatedTask】任务句柄,任务成功创建后,用于保存任务控制块

在示例和参数介绍中,我们用到了一些宏,这些宏被定义在【FreeRTOSConfig.h】和【task.h】中

//FreeRTOSConfig.h
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 200)
#define configMAX_PRIORITIES (8)// task.h
#define tskIDLE_PRIORITY			( ( UBaseType_t ) 0U )

任务堆栈

所谓任务堆栈,就是当执行某条任务时,用于保存函数运行状态的空间。这些状态信息包括返回地址、函数参数、内部局部变量等。当然,xTaskCreate并不支持带有返回值的函数,为了从任务函数中得到一些变量,可将其存放在全局变量中,并在任务的结尾添加【vTaskDelete】来销毁当前任务,示例如下

#include "FreeRTOS.h"
#include "task.h"int taskReturnValue = 0;
void vTask(void *pvParameters)
{int result = 42; // 假设任务的返回值是 42taskReturnValue = result;vTaskDelete(NULL);
}

任务优先级

基于操作系统实现的并行,实际上是伪并行,或者说是并发。即并不是多个任务在同时运行,而是多个任务交替执行,只不过CPU的频率远远高于人的反应速度,所以在人类看来,就好像在并行工作一样。

由于是多个任务交替执行,交替占用CPU,所以在实际使用FreeRTOS多任务功能时,就存在一个如何分配CPU使用时间的问题,这就是任务优先级的作用。

FreeRTOS的默认调度方式为抢占式调度,在这种模式下,优先级越高的任务越先执行,当某个高优先级任务就绪后,会立即抢占低优先级任务的资源,开始执行。在【FreeRTOSConfig.h】中定义了【configMAX_PRIORITIES】这个宏,表示任务的最高优先级,可以据此来调度任务。

此外,在【FreeRTOSConfig.h】中还定义了【configUSE_PREEMPTION】宏,用于调整调度策略,1表示抢占式调度,0为非抢占式。

#define configUSE_PREEMPTION 1
http://www.dtcms.com/a/329028.html

相关文章:

  • 基于微信小程序的工作日报管理系统/基于asp.net的工作日报管理系统
  • USB批量传输数据为端点最大数据包(比如512字节)整数倍时接收端收不到数据
  • Linux系统文件完整性检查工具AIDE在生产环境中推送钉钉告警
  • 音视频处理新纪元:12款AI模型的语音转录和视频理解能力横评
  • MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
  • 前端css学习笔记4:常用样式设置
  • 2025盛夏AI热浪:八大技术浪潮重构数字未来
  • RC4算法实现
  • 前后端分离项目在云服务器的部署
  • java实现sql解析器 JSQLParser
  • 16-docker的容器监控方案-prometheus实战篇
  • 30 HTB Soccer 机器 - 容易
  • 【Android】四种不同类型的ViewHolder的xml布局
  • 双写一致性问题如何解决?
  • Python 元类基础:从理解到应用的深度解析
  • 机器翻译:学习率调度详解
  • 小电视视频内容获取GUI工具
  • 长篇音频制作(小说自动配音)完整教程
  • 嵌入式 - linux软件编程: 目录 IO及时间相关的函数接口
  • 《Python学习之基础语法1:从零开始的编程之旅》
  • Verilog功能模块--SPI主机和从机(02)--SPI主机设计思路与代码解析
  • 电商项目微服务架构拆分实战
  • 使用TexLive与VScode排版论文
  • 内容索引之word转md工具 - markitdown
  • 华为 HCIE 大数据认证中 Linux 命令行的运用及价值
  • 【linux】--U盘挂载
  • 【CV 目标检测】③——目标检测方法
  • 2025_07_安装Jmeter,创建一个登录请求
  • python的游戏评级论坛系统
  • 云计算-OpenStack 实战运维:从组件配置到故障排查(含 RAID、模板、存储管理,网络、存储、镜像、容器等)