LoginSignup
5
5

More than 3 years have passed since last update.

ESP32 + Amazon FreeRTOS で自分のプロジェクトを作成

Posted at

はじめに

こちらの続きです。
ESP32にAmazon FreeRTOSを入れてAWS-IoTにつなぐ(Windows, Toolchain 8.4.0)

Amazon FreeRTOSを入手してデモを動かすところまではできましたが、その後、自分のプロジェクトを作るところでつまづいたので、その記録です。Hello Worldを出力することだけします。今回はAWS IoTにつなぎません。

こちらを参考に進めます。
Using FreeRTOS in your own CMake project for ESP32

【今回の環境】

フォルダ構成

こうしました。

C:\IoT\
 └ ESP-FreeRTOS\
    ├ Tools\                   ... Toolkit
    ├ FreeRTOS\                ... Amazonからダウンロードしたもの
    └ Projects\
       └ 01_hello_world\      ... 今回のプロジェクト
          ├ CMakeLists.txt
          └ src\
             └ main.c

プログラム

mainプログラムは、ESP-IDFに付属のhello_worldを参考に、シンプルなものを用意。
https://github.com/espressif/esp-idf/blob/master/examples/get-started/hello_world/main/hello_world_main.c

01_hello_world\src\main.c
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"

void app_main()
{
    printf("Hello world!\n");

    for (int i = 10; i >= 0; i--) {
        printf("Restarting in %d seconds...\n", i);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
    printf("Restarting now.\n");
    fflush(stdout);
    esp_restart();
}

CMakeFiles.txtは、AWSのドキュメントに載っていたものを参考に以下のようにしました。

01_hello_world\CMakeLists.txt
cmake_minimum_required(VERSION 3.13)

project(hello_world)

add_executable(hello_world src/main.c)

# Tell IDF build to link against this target.
set(IDF_PROJECT_EXECUTABLE hello_world)

# Add FreeRTOS as a subdirectory. AFR_BOARD tells which board to target.
set(AFR_BOARD espressif.esp32_devkitc CACHE INTERNAL "")
add_subdirectory(../../FreeRTOS FreeRTOS)

ビルド(Try & Error)

ビルドしてみます。

C:\IoT\ESP-FreeRTOS\Projects\01_hello_world> cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=../../FreeRTOS/tools/cmake/toolchains/xtensa-esp32.cmake -GNinja
-- The C compiler identification is GNU 5.2.0
-- The CXX compiler identification is GNU 5.2.0
-- The ASM compiler identification is GNU
(...snip...)
-- Configuring done
-- Generating done
-- Build files have been written to: C:/IoT/ESP-FreeRTOS/Projects/01_hello_world/build

C:\IoT\ESP-FreeRTOS\Projects\01_hello_world> cmake --build build
(...snip...)
[947/948] Linking CXX executable hello_world
FAILED: hello_world
cmd.exe /C "cd . && C:\IoT\ESP-FreeRTOS\Tools\tools\bin\xtensa-esp32-elf-g++.exe -mlongcalls -nostdlib @CMakeFiles\hello_world.rsp -o hello_world  && cd ."
FreeRTOS/esp-idf/freertos/libfreertos.a(tasks.c.obj):(.literal.xTaskIncrementTick+0x18): undefined reference to `vApplicationTickHook'
FreeRTOS/esp-idf/freertos/libfreertos.a(tasks.c.obj):(.literal.vTaskStartScheduler+0x18): undefined reference to `vApplicationGetIdleTaskMemory'
FreeRTOS/esp-idf/freertos/libfreertos.a(tasks.c.obj):(.literal.prvIdleTask+0x0): undefined reference to `vApplicationIdleHook'
FreeRTOS/esp-idf/freertos/libfreertos.a(tasks.c.obj): In function `xTaskIncrementTick':
C:/IoT/ESP-FreeRTOS/FreeRTOS/freertos_kernel/tasks.c:5248: undefined reference to `vApplicationTickHook'
C:/IoT/ESP-FreeRTOS/FreeRTOS/freertos_kernel/tasks.c:5248: undefined reference to `vApplicationTickHook'
FreeRTOS/esp-idf/freertos/libfreertos.a(tasks.c.obj): In function `vTaskStartScheduler':
C:/IoT/ESP-FreeRTOS/FreeRTOS/freertos_kernel/tasks.c:5248: undefined reference to `vApplicationGetIdleTaskMemory'
FreeRTOS/esp-idf/freertos/libfreertos.a(tasks.c.obj): In function `prvIdleTask':
C:/IoT/ESP-FreeRTOS/FreeRTOS/freertos_kernel/tasks.c:5248: undefined reference to `vApplicationIdleHook'
FreeRTOS/esp-idf/freertos/libfreertos.a(timers.c.obj):(.literal.xTimerCreateTimerTask+0x18): undefined reference to `vApplicationGetTimerTaskMemory'
FreeRTOS/esp-idf/freertos/libfreertos.a(timers.c.obj):(.literal.prvTimerTask+0x0): undefined reference to `vApplicationDaemonTaskStartupHook'
FreeRTOS/esp-idf/freertos/libfreertos.a(timers.c.obj): In function `xTimerCreateTimerTask':
C:/IoT/ESP-FreeRTOS/FreeRTOS/freertos_kernel/timers.c:338: undefined reference to `vApplicationGetTimerTaskMemory'
FreeRTOS/esp-idf/freertos/libfreertos.a(timers.c.obj): In function `prvTimerTask':
C:/IoT/ESP-FreeRTOS/FreeRTOS/freertos_kernel/timers.c:750: undefined reference to `vApplicationDaemonTaskStartupHook'
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

C:\IoT\ESP-FreeRTOS\Projects\01_hello_world>

いくつか関数定義が足りず、リンクでエラーが出ました。
それぞれFreeRTOSのデモ用のソースコードにあった関数定義をsrc\main.cにコピー。

関数 コピー元
vApplicationTickHook() vendors\espressif\boards\esp32\aws_demos\application_code\main.c
vApplicationIdleHook() vendors\espressif\boards\esp32\aws_demos\application_code\main.c
vApplicationDaemonTaskStartupHook() vendors\espressif\boards\esp32\aws_demos\application_code\main.c
vApplicationGetIdleTaskMemory() demos\demo_runner\aws_demo.c
vApplicationGetTimerTaskMemory() demos\demo_runner\aws_demo.c

再度ビルド。

C:\IoT\ESP-FreeRTOS\Projects\01_hello_world> cmake --build build
[0/2] Re-checking globbed directories...
[1/6] Performing build step for 'bootloader'
ninja: no work to do.
[4/4] Generating ../hello_world.bin
esptool.py v2.8

C:\IoT\ESP-FreeRTOS\Projects\01_hello_world>

上手くいったようなので、フラッシュしてモニタします。

C:\IoT\ESP-FreeRTOS\Projects\01_hello_world> cmake --build build --target flash
(...snip...)
Hard resetting via RTS pin...

C:\IoT\ESP-FreeRTOS\Projects\01_hello_world> python ..\..\FreeRTOS\vendors\espressif\esp-idf\tools\idf.py monitor
(...snip...)
Hello world!
Restarting in 10 seconds...
Restarting in 9 seconds...
Restarting in 8 seconds...
Restarting in 7 seconds...
Restarting in 6 seconds...
Restarting in 5 seconds...
Restarting in 4 seconds...
Restarting in 3 seconds...
Restarting in 2 seconds...
Restarting in 1 seconds...
Restarting in 0 seconds...
Restarting now.
ets Jun  8 2016 00:22:57
(...snip...)
Hello world!
Restarting in 10 seconds...
Restarting in 9 seconds...
Restarting in 8 seconds...
Restarting in 7 seconds...
(...以降繰り返し...)

うまく動きました。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5