delay与vtaskdelay的区别?

        FreeRTOS中,delayvTaskDelay都是用于延时任务的操作,但它们的应用场景和实现方式有所不同。详细了解这两者对于正确使用FreeRTOS进行嵌入式开发非常重要。本文将深入探讨FreeRTOS中的延时机制,尤其是delayvTaskDelay的区别。

FreeRTOS中的延时机制

        FreeRTOS是一种实时操作系统(RTOS),支持任务调度、多任务管理、信号量、消息队列等功能。任务延时是其中一个常用功能,用于使任务暂停执行一段时间,从而为其他任务让出CPU时间。

在FreeRTOS中,任务延时通常有两种方式:

  1. 空闲延时(Busy Waiting/Delay):任务在延时期间一直循环等待。
  2. 调度延时(Task Delay/vTaskDelay):任务在延时期间挂起,调度器将CPU时间分配给其他任务。

delayvTaskDelay的区别

1. delay函数

  delay通常指在裸机编程(Bare Metal Programming)中使用的延时方法,如通过循环计数器实现的延时。它的实现方式是忙等待(Busy Waiting),即在延时时间内,CPU会一直执行一个空循环,消耗时间。这种方法的实现比较简单,适用于没有操作系统的环境。

void delay(uint32_t milliseconds) {
    uint32_t start = current_time_in_milliseconds();
    while (current_time_in_milliseconds() - start < milliseconds);
}
特点
  • 实现简单:通过循环计数器或者定时器实现。
  • CPU占用高:在延时期间,CPU无法执行其他任务。
  • 适用于裸机系统:通常用于不带操作系统的嵌入式系统。

2. vTaskDelay函数

  vTaskDelay是FreeRTOS提供的一个API,用于使任务进入阻塞状态,延时指定的时间后再恢复执行。它是基于系统节拍(tick)的,即延时的单位是操作系统的时钟节拍数。使用vTaskDelay,任务会挂起一段时间,调度器可以将CPU时间分配给其他任务,这样有效地提高了系统资源的利用率。

void vTaskDelay(const TickType_t xTicksToDelay) {
    // 函数内部会根据节拍计数器进行任务的延时
}
特点
  • 系统友好:利用调度器进行任务管理,节省CPU时间。
  • 时间准确:基于系统节拍(tick)进行延时。
  • 依赖操作系统:只能在FreeRTOS等操作系统环境下使用。

实例比较

假设我们有一个需要每秒闪烁一次LED的任务,我们可以通过delayvTaskDelay来实现。

使用delay

void blinkLED() {
    while (1) {
        toggleLED();
        delay(1000); // 毫秒延时
    }
}

使用vTaskDelay

void blinkLED(void *pvParameters) {
    for (;;) {
        toggleLED();
        vTaskDelay(pdMS_TO_TICKS(1000)); // Tick延时
    }
}

vTaskDelayUntil的使用

        除了vTaskDelay,FreeRTOS还提供了vTaskDelayUntil,用于使任务在指定的周期性时间到达时恢复执行。这种方法适用于需要精确定时任务,例如定期采集数据。

void vTaskDelayUntil(TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement);

示例

void periodicTask(void *pvParameters) {
    TickType_t xLastWakeTime = xTaskGetTickCount();
    const TickType_t xFrequency = pdMS_TO_TICKS(1000); // 每秒

    for (;;) {
        // 执行任务
        vTaskDelayUntil(&xLastWakeTime, xFrequency);
    }
}
  • delay:通过忙等待实现,适用于裸机系统或非常简单的任务调度场景。
  • vTaskDelay:通过调度器实现任务延时,适用于多任务环境,提高系统资源利用效率。

        在FreeRTOS中,delayvTaskDelay的主要区别在于实现方式和应用场景:选择哪种延时方式取决于具体应用需求和系统设计。对于实时性要求较高的嵌入式系统,vTaskDelay通常是更优的选择,因为它能有效管理任务调度,提升系统性能。


http://www.niftyadmin.cn/n/5536481.html

相关文章

【高阶数据结构】B-数、B+树、B*树的原理

文章目录 B树的概念及其特点解析B树的基本操作插入数据插入数据模拟 分析分裂如何维护平衡性分析B树的性能 B树和B*树B树B树的分裂B树的优势 B*B*树的分裂 总结 B树的概念及其特点 B树是一颗多叉的平衡搜索树&#xff0c;广泛应用于数据库和 文件系统中&#xff0c;以保持数据…

如何将 Apifox 的自动化测试与 Jenkins 集成?

CI/CD &#xff08;持续集成/持续交付&#xff09; 在 API 测试 中的主要目的是为了自动化 API 的验证流程&#xff0c;确保 API 发布到生产环境前的可用性。通过持续集成&#xff0c;我们可以在 API 定义变更时自动执行功能测试&#xff0c;以及时发现潜在问题。 Apifox 支持…

【架构-20】死锁

什么是死锁&#xff1f; 死锁(Deadlock)是指两个或多个线程/进程在执行过程中,由于资源的互相占用和等待,而陷入一种互相等待的僵局,无法继续往下执行的情况。 产生死锁的四个必要条件: &#xff08;1&#xff09;互斥条件(Mutual Exclusion)&#xff1a;至少有一个资源是非共享…

太速科技-FMC209-基于FMC的4路125MAD输入、2路1GDA输出子卡

FMC209-基于FMC的4路125MAD输入、2路1GDA输出子卡 一、板卡概述 本子卡基于FMC连接器实现4路125M采样率AD输出&#xff0c;两路1G采样率DA输出子卡&#xff0c;板卡默认由FMC连接器12V供电&#xff0c;支持外参考时钟&#xff0c;外输入时钟&#xff0c;外触发。 …

掌握MySQL基础命令:数据更新操作详细操作(数据的增删改)

MySQL数据修改是指使用SQL语句&#xff08;如UPDATE、INSERT、DELETE&#xff09;对数据库表中的数据进行更改、添加或删除的操作&#xff0c;常见的操作包括更新表中的记录、插入新记录以及删除现有记录 。 一、数据插入 1插入完整的数据记录 2插入非完整的数据记录 3插入多…

数据预处理:统计关联性分析/数据清洗/数据增强/特征工程实例

专栏介绍 1.专栏面向零基础或基础较差的机器学习入门的读者朋友,旨在利用实际代码案例和通俗化文字说明,使读者朋友快速上手机器学习及其相关知识体系。 2.专栏内容上包括数据采集、数据读写、数据预处理、分类\回归\聚类算法、可视化等技术。 3.需要强调的是,专栏仅介绍主…

flutter开发实战-解决release下Error: SocketException: Failed host lookup问题

flutter开发实战-解决release下Error: SocketException: Failed host lookup问题 当在开发App过程中&#xff0c;在Debug下接口访问正常&#xff0c;但是通过flutter build apk lib/main.dart --release打包后安装&#xff0c;发现Android手机上无法请求数据&#xff0c;报Err…

不到 5 元的随身 WiFi 刷 Debian 系统 做轻量家庭服务器

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 前不久在某宝均价 5 元买了两个随身 WiFi,拆机看了看丝印都是 MSM8916 ,正好是红米 2 同款的骁龙 410 的芯片,可以刷个 Debian 当作家庭服务器来跑一些轻量的服务。 不过手气不是很好,两个都是 512M + 4G 的配置…