Raspberry Pi Pico - FreeRTOS の配置と LED タスクの設定

Raspberry Pi Pico で FreeRTOS を実行した。

事前準備

Raspberry Pi Pico C SDK の開発環境が必要である。

この記事の内容は主に VS Code を使っている。

FreeRTOS 配置

GitHub - raspberrypi/pico-examples/freertos/FreeRTOS_Kernel_import.cmake, FreeRTOSConfig_examples_common.h, FreeRTOSConfig.h 三つのファイルを自分のプロジェクトにコピーしてください。

ここでは、FreeRTOSConfig.hFreeRTOSConfig_examples_common.h の設定を参考している。

CMakeLists.txt で FreeRTOS の配置をする必要があるため、以下の内容を追加または変更してください。

FreeRTOS-Kernel 環境変数の設定

1
set(FREERTOS_KERNEL_PATH ${USERHOME}/.pico-sdk/FreeRTOS-Kernel CACHE PATH "Path to FreeRTOS Kernel")

${USERHOME}/.pico-sdk/FreeRTOS-Kernel を自分のパスに変更してください。

FreeRTOS-kernel をインストールしていない方はこちらでダウンロードしてください。

https://github.com/FreeRTOS/FreeRTOS-Kernel

FreeRTOS Kernel ライブラリのインクルド

1
2
# FREERTOS: include FreeRTOS Kernel libraries
include(FreeRTOS_Kernel_import.cmake)

共通依存ライブラリのリンク

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# pull in common dependencies
target_link_libraries(blink 
    pico_stdlib
    FreeRTOS-Kernel-Heap4
)
if (PICO_CYW43_SUPPORTED)
    target_link_libraries(blink 
    pico_cyw43_arch_none
    FreeRTOS-Kernel-Heap4
)
endif()

以上の変更を完了後、プロジェクトをコンパイルしてください。

LED タスクの設定

メインファイルで基本設定の上で FreeRTOS.htask.h を追加してください。

1
2
#include "FreeRTOS.h"
#include "task.h"

LED の操作について、こちらは blink demo の関数 pico_set_led(bool led_on) を使っている。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// Turn the led on or off
void pico_set_led(bool led_on) {
#if defined(PICO_DEFAULT_LED_PIN)
    // Just set the GPIO on or off
    gpio_put(PICO_DEFAULT_LED_PIN, led_on);
#elif defined(CYW43_WL_GPIO_LED_PIN)
    // Ask the wifi "driver" to set the GPIO on or off
    cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, led_on);
#endif
}

次からは自分で書いた部分。

led_task と言うタスク関数を作成してください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
void led_task() {
    int rc = pico_led_init();
    hard_assert(rc == PICO_OK);
    while (true) {
        pico_set_led(true);
        vTaskDelay(pdMS_TO_TICKS(1000));
        pico_set_led(false);
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

ここでは、1000ms のディレイを設定する。

最後にはメイン関数で以下の内容を書いてください。

1
2
3
4
5
int main() {
    stdio_init_all();
    xTaskCreate(led_task, "LED Task", 256, NULL, 1, NULL);
    vTaskStartScheduler();
}

stdio_init_all - すべて標準 stdio タイプを初期化する。

xTaskCreate - 新しいタスクを作成する。

vTaskStartScheduler - RTOS スケジュールを実行する。

LED が正常に1秒ごとに動かした。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。