FreeRTOS系统中如何保障一段程序完整执行完

在FreeRTOS中,确保一段程序完整执行完可以通过以下几种方式实现:

1. 使用互斥锁(Mutex)

  • 作用:防止高优先级任务抢占,确保当前任务独占资源。

  • 实现

    SemaphoreHandle_t xMutex;
    
    void TaskFunction(void *pvParameters) {
        xSemaphoreTake(xMutex, portMAX_DELAY);
        // 关键代码段
        xSemaphoreGive(xMutex);
    }

2. 关闭中断

  • 作用:防止中断打断任务执行。

  • 实现

    void CriticalFunction(void) {
        taskENTER_CRITICAL();
        // 关键代码段
        taskEXIT_CRITICAL();
    }

3. 关闭调度器

  • 作用:防止任务切换,确保当前任务独占CPU。

  • 实现

    void CriticalFunction(void) {
        vTaskSuspendAll();
        // 关键代码段
        xTaskResumeAll();
    }

4. 提高任务优先级

  • 作用:防止其他任务抢占当前任务。

  • 实现

    void TaskFunction(void *pvParameters) {
        vTaskPrioritySet(NULL, HIGH_PRIORITY);
        // 关键代码段
        vTaskPrioritySet(NULL, NORMAL_PRIORITY);
    }

5. 使用任务通知

  • 作用:同步任务执行,确保任务按顺序完成。

  • 实现

    void TaskA(void *pvParameters) {
        // 关键代码段
        xTaskNotifyGive(TaskB_Handle);
    }
    
    void TaskB(void *pvParameters) {
        ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
        // 关键代码段
    }

6. 使用队列

  • 作用:通过队列同步任务执行。

  • 实现

    QueueHandle_t xQueue;
    
    void TaskA(void *pvParameters) {
        // 关键代码段
        xQueueSend(xQueue, &data, portMAX_DELAY);
    }
    
    void TaskB(void *pvParameters) {
        xQueueReceive(xQueue, &data, portMAX_DELAY);
        // 关键代码段
    }

7. 使用事件组

  • 作用:同步多个任务的执行。

  • 实现

    EventGroupHandle_t xEventGroup;
    
    void TaskA(void *pvParameters) {
        // 关键代码段
        xEventGroupSetBits(xEventGroup, BIT_0);
    }
    
    void TaskB(void *pvParameters) {
        xEventGroupWaitBits(xEventGroup, BIT_0, pdTRUE, pdTRUE, portMAX_DELAY);
        // 关键代码段
    }

8. 使用软件定时器

  • 作用:在指定时间后执行代码,确保不被打断。

  • 实现

    TimerHandle_t xTimer;
    
    void TimerCallback(TimerHandle_t xTimer) {
        // 关键代码段
    }
    
    void TaskFunction(void *pvParameters) {
        xTimerStart(xTimer, portMAX_DELAY);
    }

9. 使用任务挂起和恢复

  • 作用:挂起其他任务,确保当前任务独占CPU。

  • 实现

    void TaskFunction(void *pvParameters) {
        vTaskSuspend(TaskB_Handle);
        // 关键代码段
        vTaskResume(TaskB_Handle);
    }

10. 使用临界区

  • 作用:防止任务切换和中断打断。

  • 实现

    void CriticalFunction(void) {
        portENTER_CRITICAL();
        // 关键代码段
        portEXIT_CRITICAL();
    }

总结

  • 互斥锁:防止高优先级任务抢占。

  • 关闭中断:防止中断打断。

  • 关闭调度器:防止任务切换。

  • 提高任务优先级:防止其他任务抢占。

  • 任务通知:同步任务执行。

  • 队列:同步任务执行。

  • 事件组:同步多个任务。

  • 软件定时器:在指定时间执行代码。

  • 任务挂起和恢复:挂起其他任务。

  • 临界区:防止任务切换和中断打断。

根据具体需求选择合适的方法,确保关键代码段完整执行

你可能感兴趣的:(FreeRTOS,开发语言,单片机,嵌入式硬件,c语言,stm32)