🍓

RaspberryPi Pico C/C++ SDKのライブラリ概要

2021/02/28に公開

Raspberry Pi Pico C/C++ SDKpico-sdk/1.0.1のChapter 2を読みつつのメモ書きです。以下RaspberryPi Picoのことは特に断りがない限りpicoと記載します。

pico-sdkの構造

pico-sdkにより提供されている各ライブラリはsrc/rp2_commonに格納されています。

CMakeのINTERFACEとして実装されておりそれらの構造をまねることでライブラリを自作できるでしょう。

なおsrc/hostには同ライブラリのエミュレーションが格納されていてWindows, Linux, macOSホスト側で簡単なpicoのプログラムのテストに使えます。

高次のライブラリ

名前がpico_*にマッチするライブラリは高次な機能を提供するライブラリで、アラームやタイマーなど時間に関するものや、マルチコアやその同期をサポートするもの、その他にユーティリティやデータ構造に関するものがまとまっています。

以下に一覧を示しますが説明は名前から類推したもので、内容を調査したわけではありません。

Name Description
pico_bit_ops/ ビット操作関連
pico_bootrom/ ブート関連
pico_cxx_options/ C++関連
pico_divider/ 割り算
pico_double/ 倍精度浮動小数
pico_fix/ ??? (未調査)
pico_float/ 単精度浮動小数
pico_int64_ops/ ??? (未調査)
pico_malloc/ ヒープメモリ
pico_mem_ops/ メモリ操作
pico_multicore/ マルチコア
pico_platform/ ??? (未調査)
pico_printf/ printf
pico_runtime/ 後述予定
pico_standard_link/ 後述予定
pico_stdio/ stdio(インターフェース)
pico_stdio_semihosting/ stdio(???)
pico_stdio_uart/ stdio(UART実装)
pico_stdio_usb/ stdio(USBシリアル実装)
pico_stdlib/ stdlib
pico_unique_id/ ユニークID

ランタイムサポートライブラリ

pico_runtimeおよびpico_standard_linkがこれにあたります。また両ライブラリはpico_stdlibに含まれます。

pico_runtimeは以下の機能を提供します。

  • ランタイムの開始と初期化
  • 浮動小数点の精度選択(およびそのハードウェアサポート)
  • コンパクト(?)なprintfのサポートとstdoutのマッピング
  • %演算子のサポート(およびそのハードウェアサポート)
  • runtime_init()で最小限のハードウェアの初期化(PLLやクロックなど)と、constructor属性付の関数の呼び出しの後main()関数の呼び出し

pico_standard_linkはデフォルトのcrt0などを含むブートに必要な手続きをカプセル化しています。

ハードウェアサポートライブラリ

名前がhardware_*にマッチするライブラリはpicoに実装された各ペリフェラルにアクセスするためのAPIを提供しています。これらのAPIはハードウェア操作のためにレジスタを直接触る代わりとなる関数群を提供します。

提供される機能としてはADC, clock, divider, DMA, flash, GPIO, I2C, interpolator, IRQ, PIO, PLL, PWM, reset, RTC, SPI, timer, UART, vreg, watchdog, xoscがあります。

これらのハードウェアサポートライブラリは実行時コストが最小になるように意図されています。RP2040においてこれらのライブラリはrp2040/hardware_*にあるstructs及びregsにのみ依存しています。

claimingライブラリ

ペリフェラルの利用を調停するためのライブラリのようです。複数のコンポーネントを組み合わせてプログラムを作る際に、DMAなど限られたリソースを正しく使うにはこのhardware_claimライブラリを用いて、どのリソースの利用するかを調停すると良さそうです。

hardware structsライブラリ

各ペリフェラルにアクセスするのに使うメモリマップドI/Oのメモリレイアウトを定義しています。

hardware registersライブラリ

RP2040の全レジスタ(=メモリマップドI/O? アドレス等?)を定義しており、RP2040のハードウェアデザインから生成されるものです。

関数名のルール

  • ライブラリ名がprefixになる。例: dma_
  • その後に動詞が続く。get_, set_, is_あたりが最も一般的
  • 後置詞:
    • なし - ブロックしない
    • _blocking - 終わるまでブロック
    • _blocking_until - 終わるか特定の時刻になるまでブロック
    • _timeout_ms, _timeout_us - 終わるか指定時間経過するまでブロック(ミリ秒およびマイクロ秒)

Discussion