目標
RaspberryPiPico で動作する実行イメージを生成する。
RaspberryPiPicoは実行イメージである".uf2"ファイルを書き込めば動作する。このファイルを作成するための手順を環境構築から記載した。
想定する動作環境
動作環境は以下の通り
- OS: Ubuntu 22.04 LTS
- VM: VMWare Workstation 16 Player, WSL2
- PC: 普通のWindows10
※WSL2上のUbuntuでもVM上でも両方動きました。
環境構築
環境構築をしていきます。
大まかな手順は以下の通り。
- SDKモジュールとパッケージのダウンロード
- 環境変数の設定
必要なパッケージやSDKモジュールのダウンロード
ビルドに必要なパッケージをインストールする。
$ sudo apt update
$ sudo apt install -y git build-essential gcc cmake gcc-arm-none-eabi
RaspberryPi Pico のSDKをインストールする。今回は/opt以下に入れるので、sudoを用いる。
$ sudo git clone https://github.com/raspberrypi/pico-sdk.git /opt/pico-sdk
$ sudo git -C /opt/pico-sdk submodule update --init
SDKがダウンロードされたかチェックする。
~$ ls /opt/pico-sdk
cmake docs LICENSE.TXT README.md tools
CMakeLists.txt external pico_sdk_init.cmake src
CONTRIBUTING.md lib pico_sdk_version.cmake test
環境変数の設定
環境変数"PICO_SDK_PATH"にSDKのパスを設定する。
"/etc/profile.d/pico-sdk.sh"を作成する。このシェルスクリプトは、起動時に自動的に実行される。"export ..."で環境変数を登録する。
export PICO_SDK_PATH=/opt/pico-sdk
ここで再起動する。
もしくは"source /etc/profile"コマンドで環境変数が反映される。(文字の色づけが失われるかも)
再起動したら(もしくは、sourceしたら)、環境変数のせっていが反映されていることを確認する。
$ echo $PICO_SDK_PATH
/opt/pico-sdk
環境構築の初期設定は終わり。
コードを書いていく&ビルドする
コードを書いてビルドする手順の概略は以下の通り
- プロジェクトを入れるディレクトリを作ってそこに移動する
- ソースコードを書く
- CMakeLists.txtを書く
- buildディレクトリを作成して移動する
- cmakeする
- buildする
- ".uf2"(RaspberryPiPicoに書き込むファイル)ができている
プロジェクトを入れるディレクトリを作る
コードをまとめるプロジェクト用のディレクトリをつくる。プロジェクトという単位で管理されるわけじゃないが、わかりやすさのためにまとめた方が良い。
ビルド用のディレクトリを作成する。
$ mkdir helloworld
$ cd helloworld/
コードを書く
ソースコードを作成する。ファイル名はhello.cとする。まずは、ファイルがひとつの場合を紹介する。
#include <stdio.h>
#include <pico/stdlib.h>
int main()
{
stdio_init_all();
while (true) {
printf("Hello world\n");
sleep_ms(500);
}
}
CMakeList.txtを作成する。
CMakeList.txtを、ソースコードと同じディレクトリに作成する。変更のポイントは以下の通り。基本的にココだけ帰ればOK。
- このサンプルの1行目の"set(APP_NAME "に続く"helloworld"がアプリ名。実行イメージのファイル名となる。この場合、"helloworld.uf2"が作成される。".uf2"のファイル名を変えたい場合はココを変える。なお、プロジェクトのディレクトリ名と同じでなくても良い。
- このサンプルの2行目の"set(SOURCE_FILES "に続いてソースコードのファイル名を指定する。この例では、ソースコードがひとつだけだが、ソースコードが複数ある場合、全てのソースファイル名をスペースで区切ってここに列挙する。
set(APP_NAME helloworld) #最終的にできあがるファイル名を指定
set(SOURCE_FILES hello_w.c) #ソースコードを指定。複数ある場合はスペースで区切って指定
cmake_minimum_required(VERSION 3.13)
include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)
project(${APP_NAME} C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
pico_sdk_init()
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
pico_add_extra_outputs(${PROJECT_NAME})
target_link_libraries(${PROJECT_NAME} pico_stdlib)
pico_enable_stdio_usb(${PROJECT_NAME} 1)
pico_enable_stdio_uart(${PROJECT_NAME} 0)
ここまでの成果を確認する。"CMakeLists.txt"と"hello_w.c"がある。
$ pwd
/home/hoge/helloworld
$ ls
CMakeLists.txt hello_w.c
build ディレクトリを作成する & cmake する & make する
ビルドの中間ファイルと実行イメージ".uf"ファイルを格納するディレクトリを作成する。名前は"build"とする。
ディレクトリ"build"を作成する。
$ mkdir build
$ cd build/
cmakeする。最後に"Build files have been written to..."と出てくればOK。
$ cmake ../
PICO_SDK_PATH is /opt/pico-sdk
PICO platform is rp2040.
:(省略)
-- Configuring done
-- Generating done
-- Build files have been written to: /home/hoge/helloworld/build
ビルドするための環境ができあがったことを確認する。"Makefile"があればOK。
$ ls
CMakeCache.txt cmake_install.cmake generated pico-sdk
CMakeFiles elf2uf2 Makefile pioasm
makeでビルドする。
$ make
makeが終わったら、lsで確認する。ファイル名の末尾が".uf2"が出来ていればOK。(この場合は"helloworld.uf2)
このファイルをRaspberryPiPicoに書き込む。
$ ls
CMakeCache.txt generated helloworld.elf.map pico-sdk
CMakeFiles helloworld.bin helloworld.hex pioasm
cmake_install.cmake helloworld.dis helloworld.uf2
elf2uf2 helloworld.elf Makefile
その他
ソースコードを書き換えたら
ソースコードを書き換えたら、"build"ディレクトリに移動して、cmakeしてmakeする。
$ pwd
/home/hoge/helloworld/build
$ cmake ../
$ make
CMakeLists.txtを書き換えたら
CMakeList.txtを書き換えたら、"build"ディレクトリごと削除してまた作れば良い。
$ pwd
/home/hoge/helloworld/build
$ cd ../
$ rm -rf build/
$ mkdir build
$ cd build
$ cmake ../
複数のソースコードがある場合、ソースコードが増えた場合
このサンプルのCMakeLists.txtの 2行目の"hello_w.c"につづいて、ソースコードのファイル名を指定すればいい
ヘッダファイルは記載しなくても良い(と思う)。
set(APP_NAME helloworld) #最終的にできあがるファイル名を指定
set(SOURCE_FILES hello_w.c hoge1.c hoge2.c) #ソースコードを指定。複数ある場合はスペースで区切って指定
cmake_minimum_required(VERSION 3.13)
(省略)
新しいプロジェクト(アプリ)を作りたい場合
- プロジェクト用のディレクトリを作る
- ソースコードを作る
- CMakeLists.txtを作る
- buildディレクトリを作る&移動する
- cmakeした後makeする
- ".uf2"ができている
以上