FreeRTOS 中主函数 while 循环与任务创建的紧密联系

在嵌入式开发领域,FreeRTOS 是一款被广泛应用的轻量级实时操作系统,为开发者提供了高效的多任务调度机制。对于初学者来说,理解主函数中的 while 循环与通过 xTaskCreate 创建的任务之间的关系,是掌握 FreeRTOS 系统架构的关键一步。

主函数中的 while 循环

在基于 FreeRTOS 的 STM32 应用程序中,主函数中包含一个独特的 while 循环,其功能与传统的程序主循环有所不同。它的主要职责是在系统启动阶段完成硬件初始化和任务创建操作。

int main(void)
{// 硬件初始化(时钟、GPIO、外设等)// 创建任务xTaskCreate(Task1, "Task 1", 1000, NULL, 1, NULL);xTaskCreate(Task2, "Task 2", 1000, NULL, 1, NULL);// 启动调度器vTaskStartScheduler(); // 从这里开始,RTOS开始调度任务// 如果调度器启动失败(通常不会发生),进入死循环while (1){}
}

在调用 vTaskStartScheduler() 启动调度器之前,这个循环确保了硬件资源得到正确配置,为后续任务的运行提供了必要的物理环境。例如,对时钟系统的配置决定了整个系统的运行速度,GPIO 的初始化则为与外部设备的数据交互做好准备。

系统运行正常时,一旦调度器成功启动,主函数中的 while 循环就不再对任务调度产生直接影响。它仅作为一个后备机制存在,以防调度器启动失败,避免程序出现未定义行为,确保系统稳定运行。

xTaskCreate 与任务创建

xTaskCreate 是 FreeRTOS 提供的关键 API,用于将用户定义的任务函数及其相关配置整合到系统中。

xTaskCreate(Task1, "Task 1", 1000, NULL, 1, NULL);
  • Task1 是用户定义的任务函数,包含该任务的具体执行逻辑。
  • “Task 1” 为任务名称,便于调试时识别。
  • 1000 表示分配给该任务的堆栈大小,单位通常是字。
  • 1 是任务优先级,优先级数值越小,任务优先级越高。
  • 第四个参数 NULL 可用于传递任务函数的参数。
  • 最后一个参数 NULL 用于返回任务句柄,方便后续对任务的操作。

当 xTaskCreate 被调用时,它会将任务添加到 FreeRTOS 的任务就绪队列中。调度器启动后,FreeRTOS 内核会根据任务优先级和调度策略(默认为可抢占式优先级调度算法)选择任务执行。优先级高的任务会优先获得 CPU 资源,确保系统的实时性和可靠性。

主函数 while 循环与任务的关系

主函数中的 while 循环与通过 xTaskCreate 创建的任务之间存在着紧密的协作关系。

时间顺序关系

在程序启动的早期阶段,主函数中的 while 循环先执行,完成硬件初始化和任务创建操作。这些任务在主函数的 while 循环之外创建,充分利用了主函数的执行流,确保任务在调度器启动前被注册到系统中。

功能分工关系

  • 主函数 while 循环:它为系统的启动提供必要的前期准备工作环境和调度器启动的触发机制。在其运行期间,主要负责硬件资源的配置和任务的注册,为后续任务的调度和执行奠定了基础。
  • xTaskCreate 创建的任务:一旦调度器启动,任务调度权就交由 FreeRTOS 内核管理。各个任务依据自身优先级和调度策略,在适当的时机被执行,实现了系统的多任务并行处理和实时响应。

调度权交接关系

调用 vTaskStartScheduler() 是调度权交接的关键节点。在此之前,主函数的 while 循环控制着程序的执行流程;在此之后,FreeRTOS 内核接管任务调度,主函数的 while 循环不再参与任务的调度决策。

总结

在 FreeRTOS 中,主函数中的 while 循环与通过 xTaskCreate 创建的任务相互配合,共同推动系统的启动和运行。主函数的 while 循环在前期完成硬件初始化和任务创建,为调度器的启动做好准备工作。而 xTaskCreate 创建的任务则在调度器启动后,按照设定的优先级和调度策略,由 FreeRTOS 内核进行调度和执行,实现系统的多任务并行处理和实时响应。

理解这种关系对于深入掌握 FreeRTOS 的系统架构和任务调度机制至关重要。只有清晰地认识到主函数和任务之间的分工与协作,才能更好地设计和优化基于 FreeRTOS 的嵌入式应用程序,充分发挥其在实时性、可靠性和资源利用率方面的优势。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter基础(前端教程⑦-Http和卡片)

1. 假设后端返回的数据格式{"code": 200,"data": [{"name": "张三","age": 25,"email": "zhangsanexample.com","avatar": "https://picsum.photos/200/200?random1","statu…

pytorch chunk 切块

目录 chunk切块 chunk​​​​​​​切块 import torch# 创建一个形状为 [2, 3, 4] 的张量 x torch.arange(6).reshape(2, 3) print("原始张量形状:", x.shape) print("x:", x) # 输出: 原始张量形状: torch.Size([2, 3, 4])# 沿着最后一个维度分割成 2 …

PCIe基础知识之Linux内核中PCIe子系统的架构

5.1 先验知识 驱动模型:Linux建立了一个统一的设备模型,分别采用总线、设备、驱动三者进行抽象,其中设备和驱动均挂载在总线上面,当有新的设备注册或者新的驱动注册的时候,总线会进行匹配操作(match函数),…

2.2 TF-A在ARM生态系统中的角色

目录2.2.1 作为ARM安全架构的参考实现2.2.2 与ARM处理器内核的协同关系2.2.3 在启动链中的核心地位2.2.4 与上下游软件的关系与底层固件的协作与上层软件的接口2.2.5 在ARM生态系统中的标准化作用2.2.6 典型应用场景2.2.1 作为ARM安全架构的参考实现 TF-A(Trusted …

Chrome 开发者警告:`DELETE err_empty_response` 是什么?jQuery AJAX 如何应对?

在Web开发的世界里,我们时常会遇到各种各样的错误信息,它们像一个个谜语,等待我们去破解。今天我们要聊的这个错误——DELETE err_empty_response,尤其是在使用 jQuery 的 $.ajax 发送 DELETE 请求时遇到,确实让人头疼。它意味着浏览器尝试删除某个资源,却收到了一个空荡…

python作业 1

1.技术面试题 (1)TCP与UDP的区别是什么? 答: TCP建立通信前有三次握手,结束通信后有四次挥手,数据传输的可靠性高但效率较低;UDP不需要三次握手就可传输数据,数据传输完成后也不需要…

centos7 java多版本切换

文章目录前言一、卸载原来的jdk二、下载jdk三、解压jdk三、配置环境变量四、切换JAVA环境变量前言 本来是为了安装jenkins,安装了对应的java,node,maven,git等环境,然后运行jenkins时候下载插件总是报错,我下载的jenkins是 2.346.1 版本&…

用Python和OpenCV从零搭建一个完整的双目视觉系统(四)

本系列文章旨在系统性地阐述如何利用 Python 与 OpenCV 库,从零开始构建一个完整的双目立体视觉系统。 本项目github地址:https://github.com/present-cjn/stereo-vision-python.git 在上一篇文章中,我们完成了相机标定这一最关键的基础步骤…

STM32-中断

中断分为两路:12345用于产生中断;678产生事件外设为NVIC设计流程:使能外设中断设置中断优先级分组初始化结构体编写中断服务函数初始化结构体:typedef struct {uint8_t NVIC_IRQChannel; 指定要使能或禁用的中断通道例如: TIM3_I…

Shader面试题100道之(61-80)

Shader面试题(第61-80题) 以下是第61到第80道Shader相关的面试题及答案: 61. 什么是UV展开?它在Shader中有什么作用? UV展开是将3D模型表面映射到2D纹理空间的过程,用于定义纹理如何贴合模型。在Shader中&a…

C#基础:Winform桌面开发中窗体之间的数据传递

1.主窗体using System; using System.Windows.Forms;public partial class MainForm : Form {public MainForm(){InitializeComponent();}// 打开二级窗体private void btnOpenSecondaryForm_Click(object sender, EventArgs e){// 创建二级窗体并订阅事件SecondaryForm second…

工程改Mvvm

导入CommunityToolKit vs2017只能导入7 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input;namespace WpfApp1.vi…

【HarmonyOS Next之旅】DevEco Studio使用指南(四十二) -> 动态修改编译配置

目录 1 -> 通过hook以及插件上下文实现动态配置 2 -> 在hvigorfile.ts中通过overrides关键字导出动态配置 3 -> 通过hook以及插件上下文动态配置构建配置 3.1 -> 修改每个hvigorNode中的build-profile.json5 3.2 -> 修改module.json5中的配置信息 3.3 -&g…

Android View事件分发机制详解

Android 的 View 事件分发机制是处理用户触摸(Touch)事件的核心流程,它决定了触摸事件如何从系统传递到具体的 View 并被消费。理解这个机制对于处理复杂的触摸交互、解决滑动冲突至关重要。 核心思想:责任链模式 事件分发遵循一个…

【CMake】自定义package并通过find_package找到

在一些场景下我们需要编写一些库,并希望其他程序可以找到这些库并引用。 CMake采用package这个概念来解决这个问题。 关于CMake的find_package文章有很多,但这些文章的内容大多不直观讲了一堆讲不到点子上,让人看了一头雾水。因此我想通过本文…

【MATLAB例程】AOA与TDOA混合定位例程,适用于二维环境、3个锚点的定位|附代码下载链接

本 MATLAB 程序实现了基于 Angle of Arrival (AOA) 与 Time Difference of Arrival (TDOA) 的二维定位方法,通过自适应融合与最小二乘优化,实现对未知目标的高精度估计。本例中固定使用了 3 个基站(锚点),算法框架支持…

磐维数据库panweidb集中式集群配置VIP【添加、删除和修改】

0 说明 panweidb集中式集群为了防止主备切换后应用连接无法切换到新主库,需要配置vip,应用可以只通过该ip与数据库连接,不用感知数据库在哪个节点上。 panweidb中配置 VIP主要依赖 CM 组件的 VIP 仲裁功能,通过回调脚本在主备切换…

python的保险业务管理与数据分析系统

前端开发框架:vue.js 数据库 mysql 版本不限 后端语言框架支持: 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 数据库工具:Navicat/SQLyog等都可以 保险行业…

R语言如何接入实时行情接口

目录 1. 安装必要的R包 2. 导入库 3. 连接WebSocket 4. 处理连接成功后的操作 5. 处理接收到的消息 6. 处理连接关闭和错误 7. 发送心跳数据 8. 自动重连机制 9. 启动连接和重连 总结 在数据分析和金融研究中,实时行情数据的获取至关重要,但市…

Redis数据安全性分析

Redis高可用与数据安全机制深度解析前置知识:Redis基础安装与使用(主从复制、哨兵集群、Cluster集群搭建)一、Redis性能压测工具 工具名称:redis-benchmark核心作用:快速基准测试Redis性能使用场景:评估不同…