admin 管理员组

文章数量: 1184232

       今天我们将探讨FreeRTOS中的两个非常重要的函数:任务挂起和恢复函数。在实际的嵌入式系统开发中,我们常常需要在特定条件下暂停某些任务的执行,而在满足某些条件后再恢复这些任务的执行。这就像我们日常生活中的“暂停”和“继续”按钮。无论是为了节省资源,还是为了确保系统的稳定性,这两个操作都是至关重要的。通过理解和掌握任务的挂起与恢复,我们可以更灵活和高效地管理系统中的任务,确保各个任务能够协调运作,从而实现更稳定、更高效的系统表现。接下来,我们将深入了解如何使用这两个函数,以及它们在实际应用中的场景和注意事项。

目录

一、任务挂起与恢复函数

二、任务挂起函数

三、任务恢复函数(任务中恢复)

四、FreeRTOS 中断优先级概述

五、任务恢复函数(中断中恢复)

六、任务挂起与恢复API函数解析(选学)

6.1 任务挂起函数vTaskSuspend( )

6.2 (任务中调用)任务恢复函数vTaskResume( )

6.3(中断中调用)任务恢复函数xTaskResumeFromISR( )

七、任务挂起与恢复实验

八、任务挂起与任务恢复函数的使用场景

8.1 .临界区保护

8.2 资源管理

8.3 任务间同步


一、任务挂起与恢复函数

二、任务挂起函数

使用前先使能API函数

三、任务恢复函数(任务中恢复)

使用前先使能API函数

四、FreeRTOS 中断优先级概述

         FreeRTOS 的配置文件 FreeRTOSConfig.h 中有两个关键宏定义:

configMAX_SYSCALL_INTERRUPT_PRIORITY  //定义了可以使用 FreeRTOS API 的最高中断优先级。
configKERNEL_INTERRUPT_PRIORITY      //定义了 FreeRTOS 内核的优先级

       我们知道,Stm32一共有10个系统中断(内核中断),FreeRTOS便可以对这些系统中断进行管理;

       第一个宏其实代表的是FreeRTOS可以管理的中断的最高的优先级;在 ARM Cortex-M 微控制器上,优先级数值越低,优先级越高。configMAX_SYSCALL_INTERRUPT_PRIORITY 通常设置为一个中等优先级数值。例如,如果 FreeRTOS 管理的最高优先级为 5,则 configMAX_SYSCALL_INTERRUPT_PRIORITY 可以设置为 5。

解释:中断优先级与 FreeRTOS API

        如果在中断服务程序(ISR)中调用 FreeRTOS 的 API 函数,该 ISR 的优先级必须小于或者等于 configMAX_SYSCALL_INTERRUPT_PRIORITY。这意味着中断优先级数值必须大于等于 configMAX_SYSCALL_INTERRUPT_PRIORITY 的值。

         如果 ISR 的优先级高于 configMAX_SYSCALL_INTERRUPT_PRIORITY(即数值低于 configMAX_SYSCALL_INTERRUPT_PRIORITY),在该 ISR 中调用 FreeRTOS API 函数可能会导致不可预期的行为,例如任务切换不正确或系统崩溃。这是因为 FreeRTOS 的调度器和其他 API 函数不是为在高优先级中断上下文中执行而设计的,即该中断不受FreeRTOS的管理。

#define configMAX_SYSCALL_INTERRUPT_PRIORITY 5

// 假设这是一个中断服务程序,优先级为6
void MyISR(void) {
    BaseType_t xHigherPriorityTaskWoken = pdFALSE;

    // 恢复任务,只有优先级为6或更低的中断才能调用该函数
    vTaskResumeFromISR(xTaskHandle);

    // 如果恢复的任务优先级较高,可以请求上下文切换
    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}

五、任务恢复函数(中断中恢复)

使用前先使能API函数

本文标签: 挂起 基础 FreeRTOS