ESP32 入門到精通 – 使用 FreeRTOS


簡介

ESP32 是一個功能強大的微控制器,SDK 使用了 ESP-IDF(Espressif IoT Development Framework)可以有效地開發嵌入式應用程序。而 FreeRTOS 是一個即時操作系統(RTOS),常用於嵌入式系統中來實現多任務處理。

FreeRTOS 功能

FreeRTOS 是一個輕量級的即時操作系統,專為微控制器設計,具有以下特點:

1. 多任務調度:支持多個任務並行運行。
2. 時間管理:提供延遲和定時功能。
3. 資源管理:包括互斥量(Mutex)、信號量(Semaphore)、隊列(Queue)等,用於任務間通信和同步。
4. 低功耗:支持低功耗管理,適合電池供電設備。

ESP32 IDF 中使用 FreeRTOS

在 ESP32 的 ESP-IDF 中,FreeRTOS 是內建的一部分。開發者可以利用 ESP-IDF 提供的 API 來創建和管理 FreeRTOS 任務。

安裝 VSCode 和 ESP-IDF VSCode 擴展

確保你已經安裝和配置好了 ESP-IDF 開發環境。您也可以參考 ESP32 入門到精通 – 在 VSCode 安裝 ESP-IDF 插件 這篇文章。

新建 ESP32 專案

利用在 VSCode 的 IDF 插件來新建一個 ESP32 專案可參考 ESP32 入門到精通 – 如何用 VSCode 創建 ESP32 專案

範例 main.c

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/timers.h"
#include "esp_system.h"
#include "esp_log.h"

// Timer handles
TimerHandle_t timer1Handle = NULL;
TimerHandle_t timer2Handle = NULL;

// Timer1 callback
void timer1Callback(TimerHandle_t xTimer) {
    ESP_LOGI("Timer1", "Timer 1 callback called");
}

// Timer2 callback
void timer2Callback(TimerHandle_t xTimer) {
    ESP_LOGI("Timer2", "Timer 2 callback called");
}

void app_main() {
    // Create Timer 1 with a period of 1000 ms (1 second)
    timer1Handle = xTimerCreate("Timer1", pdMS_TO_TICKS(1000), pdTRUE, (void *)0, timer1Callback);
    if (timer1Handle != NULL) {
        xTimerStart(timer1Handle, 0); // Start the timer
    }

    // Create Timer 2 with a period of 2000 ms (2 seconds)
    timer2Handle = xTimerCreate("Timer2", pdMS_TO_TICKS(2000), pdTRUE, (void *)0, timer2Callback);
    if (timer2Handle != NULL) {
        xTimerStart(timer2Handle, 0); // Start the timer
    }

    // Main program does not need further actions, can delete itself
    vTaskDelete(NULL);
}
這段代碼創建了兩個軟體定時器 Timer1 和 Timer2,這些定時器每秒觸發一次,分別調用 Timer1Callback 和 Timer2Callback 並列印消息到串列埠。這是一個基本的軟體定時器應用範例,可以幫助開發者理解和使用 FreeRTOS 的軟體定時器功能。

編譯和燒錄

在 VSCode 中找到 "ESP32-IDF : Build, Flash and Monitor" ICON 執行和燒錄。

查看結果

我們可以查看 ESP_LOGI 在終端機的列印結果,如下...
I (2301) Timer1: Timer 1 callback called
I (3301) Timer2: Timer 2 callback called
I (3301) Timer1: Timer 1 callback called
I (4301) Timer1: Timer 1 callback called
I (5301) Timer2: Timer 2 callback called
I (5301) Timer1: Timer 1 callback called
I (6301) Timer1: Timer 1 callback called
I (7301) Timer2: Timer 2 callback called
I (7301) Timer1: Timer 1 callback called
I (8301) Timer1: Timer 1 callback called
I (9301) Timer2: Timer 2 callback called
I (9301) Timer1: Timer 1 callback called

結論

這個例子展示了如何使用 FreeRTOS 的軟體定時器來實現定時操作,這是一種有效的方法來在嵌入式系統中管理定時事件。