Raspberry Pi Picoでプログラミング ⑤ プログラミングの環境整備とLチカ
Lチカから始めます。すでにソースはpico/pico-examples/blinkにあります。入っているのは、
- blink.c
- CMakeLists.txt
の二つです。blink.cは普通のLEDを点滅させるソース・プログラムです。最初に、CMakeLists.txtの中身を見ます。cmakeは、いろいろな環境でビルドをするためのツール名です。複数の設定ファイルが求められますが、このCMakeLists.txtは、実行ファイルを作るために必要な記述が入っています。
#①
add_executable(blink
blink.c
)
#② Pull in our pico_stdlib which pulls in commonly used features
target_link_libraries(blink pico_stdlib)
#③ create map/bin/hex file etc.
pico_add_extra_outputs(blink)
#④ add url via pico_set_program_url
example_auto_set_url(blink)
最初のブロック①は、コンパイルしてできあがる実行プログラムの名称と、そのソースです。ソースはここでは一つですが、ヘッダ・ファイルや、分割した場合別のソースを列挙します。
次のブロック②は、リンクするライブラリ類を記述します。blinkは本体、pico_stdlibは標準ライブラリです。I2Cなどを使うときは、そのライブラリ名を列挙します。
三つめ③は、コンパイルしたときにいろいろな実行ファイルやmapの出力ができるが、そのファイル名をblink.xxxにするようにという指示と思われます。しかし、解説が見つかりません。
四つめ④は、想像ですがGitHubなどに公開するときの記述らしいので、当初、不要だと思います。削除します。
●pico/worksで作業をする
/picoフォルダの中に、何もない作業用のフォルダworksを作ります。
/home/pi/pico/pico-examplesから、
- pico_sdk_import.cmake
- cmakeフォルダ
- blinkフォルダ
- CMakeLists.txt
らを、/home/pi/pico/worksにコピーします。
buildフォルダを作ります。ソース・プログラムのディレクトリに実行ファイルを作るのではなく、buildフォルダ内に、オブジェクトや実行ファイルを保存するフォルダが作られます。
画面の左側がworksフォルダです。
pico_sdk_import.cmakeは、ライブラリ類が入ったsdkへのpathが書かれています。
●CMakeLists.txtの修正
worksフォルダにあるCMakeLists.txt(二つ目になる)をテキスト・エディタで開き、次のように必要なフォルダの記述だけにします。
- cmakeのバージョン
- sdkのpath
- プロジェクト名、使用するC/C++のバージョン
- プロジェクトのpath
- sdkの初期化
- # Add blink example以降に、makeを作るフォルダ名を列挙
ここまでは、元のpico-examplesにあった内容と同じです。
最後の行が、今回作成するLチカのフォルダの指定です。
cmake_minimum_required(VERSION 3.12)
# Pull in SDK (must be before project)
include(pico_sdk_import.cmake)
project(pico_examples C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(PICO_EXAMPLES_PATH ${PROJECT_SOURCE_DIR})
# Initialize the SDK
pico_sdk_init()
# Add blink example
add_subdirectory(cmake)
add_subdirectory(blink)
ターミナルで、buildフォルダにおります(/home/pi/pico/works/build/)。もちろん空っぽです。このディレクトリで、
cmake ..
たくさんのファイルができます。
新しくできたblinkにおります。makeを実行するのに必要なMakefileができています。
●ビルド
makeします。
pi@rasi01:~/pico/works/build/blink $ make -j4
Scanning dependencies of target ELF2UF2Build
Scanning dependencies of target bs2_default
[ 0%] Creating directories for 'ELF2UF2Build'
[ 0%] Building ASM object pico-sdk/src/rp2_common/boot_stage2/CMakeFiles/bs2_default.dir/compile_time_choice.S.obj
[ 2%] Linking ASM executable bs2_default.elf
[ 2%] Built target bs2_default
Scanning dependencies of target bs2_default_padded_checksummed_asm
[ 5%] Generating bs2_default.bin
[ 5%] Generating bs2_default_padded_checksummed.S
[ 8%] No download step for 'ELF2UF2Build'
[ 8%] Built target bs2_default_padded_checksummed_asm
[ 8%] No patch step for 'ELF2UF2Build'
[ 10%] No update step for 'ELF2UF2Build'
[ 13%] Performing configure step for 'ELF2UF2Build'
-- The C compiler identification is GNU 8.3.0
-- The CXX compiler identification is GNU 8.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/pi/pico/works/build/elf2uf2
[ 16%] Performing build step for 'ELF2UF2Build'
Scanning dependencies of target elf2uf2
[ 50%] Building CXX object CMakeFiles/elf2uf2.dir/main.cpp.o
[100%] Linking CXX executable elf2uf2
[100%] Built target elf2uf2
[ 18%] No install step for 'ELF2UF2Build'
[ 18%] Completed 'ELF2UF2Build'
[ 18%] Built target ELF2UF2Build
Scanning dependencies of target blink
[ 18%] Building C object blink/CMakeFiles/blink.dir/blink.c.obj
[ 24%] Building C object blink/CMakeFiles/blink.dir/home/pi/pico/pico-sdk/src/rp2_common/hardware_gpio/gpio.c.obj
[ 24%] Building C object blink/CMakeFiles/blink.dir/home/pi/pico/pico-sdk/src/rp2_common/pico_stdlib/stdlib.c.obj
...
...
[ 89%] Building ASM object blink/CMakeFiles/blink.dir/home/pi/pico/pico-sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S.obj
[ 91%] Building ASM object blink/CMakeFiles/blink.dir/home/pi/pico/pico-sdk/src/rp2_common/pico_standard_link/crt0.S.obj
[ 91%] Building CXX object blink/CMakeFiles/blink.dir/home/pi/pico/pico-sdk/src/rp2_common/pico_standard_link/new_delete.cpp.obj
[ 94%] Building C object blink/CMakeFiles/blink.dir/home/pi/pico/pico-sdk/src/rp2_common/pico_standard_link/binary_info.c.obj
[ 97%] Building C object blink/CMakeFiles/blink.dir/home/pi/pico/pico-sdk/src/rp2_common/pico_stdio_uart/stdio_uart.c.obj
[ 97%] Building C object blink/CMakeFiles/blink.dir/home/pi/pico/pico-sdk/src/rp2_common/pico_stdio/stdio.c.obj
[100%] Linking CXX executable blink.elf
[100%] Built target blink
正常に終了したようです。
●書き込み
Resetボタンを押したまま、BOOTSELボタンを押し、Resetボタンを離してから、BOOTSELボタンを離します。これでマウントができます。RPI-RP2というドライブ名です。
RPI-RP2ドライブへ、blink.uf2をドラッグします。
●ソースの修正
blink.cをテキスト・エディタで開き、修正します。
/**
* Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "pico/stdlib.h"
int main() {
#ifndef PICO_DEFAULT_LED_PIN
#warning blink example requires a board with a regular LED
#else
const uint LED_PIN = PICO_DEFAULT_LED_PIN;
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
while (true) {
gpio_put(LED_PIN, 1);
sleep_ms(2500);
gpio_put(LED_PIN, 0);
sleep_ms(2500);
}
#endif
}
250msを2500msに変更して保存します。makeします。修正のあったものだけがコンパイルされ、実行に必要なライブラリとリンクされます。
pi@rasi01:~/pico/works/build/blink $ make -j4
[ 5%] Built target bs2_default
[ 5%] Performing build step for 'ELF2UF2Build'
[ 8%] Built target bs2_default_padded_checksummed_asm
[100%] Built target elf2uf2
[ 10%] No install step for 'ELF2UF2Build'
[ 10%] Completed 'ELF2UF2Build'
[ 18%] Built target ELF2UF2Build
Scanning dependencies of target blink
[ 18%] Building C object blink/CMakeFiles/blink.dir/blink.c.obj
[ 21%] Linking CXX executable blink.elf
[100%] Built target blink
Resetボタンを押したまま、BOOTSELボタンを押し、Resetボタンを離してから、BOOTSELボタンを離します。RPI-RP2ドライブがマウントされました。
RPI-RP2ドライブへ、blink.uf2をドラッグします。
ゆっくりの点滅になりました。