メインコンテンツへスキップ

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

·563 文字
icysamon
著者
icysamon
自らの手で生み出す、アイデアを形にする「ものづくり」が大好きです。

はじめに
#

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 環境変数の設定
#

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 ライブラリのインクルド
#

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

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

# 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 を追加します。

#include "FreeRTOS.h"
#include "task.h"

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

// 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 と言うタスク関数を作成します。

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 のディレイを設定します。

最後にはメイン関数で以下の内容を書きます。

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

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

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

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

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