UdonLibrary 1.0.0
機械システム研究部 C++ ライブラリ
読み取り中…
検索中…
一致する文字列を見つけられません
PIO

RP2040 には 2 つの CPU コアに加えて、ステートマシンという補助的なコアが 8 つ内蔵されています。

ステートマシンは CPU とは独立して動作するため、常に入力ピンを監視するようなシビアな制御に有用です。通常のコアと異なり、機械語を用いて命令を書きます。

8 つのステートマシンはそれぞれ個別の命令を実行できるわけではありません。ステートマシンは 2 つの PIO ブロックに分けられており、実行命令を格納するメモリが PIO ブロック単位にのみ存在するためです。

PioClockBegin

PIO を用いて特定のピンからクロック信号を出力します。通信用コントローラーの外部クロックとしての使用を想定しています。

#include <Udon.hpp>
void setup()
{
Udon::PioClockBegin(2, 16'000'000); // 2 ピンに 16MHz のクロックを出力
}
void loop() {}

戻り値から出力開始に成功したか取得できます。ステートマシンもしくは命令メモリの空きがない場合、失敗します。

AllocateStateMachine

空きステートマシンを検索し、命令のロードを行う関数です。ライブラリ内部で使用する想定の関数です。

戻り値から割り当てられたステートマシンの情報を取得できます。

#include <Udon.hpp>
// pioasm が生成
static const struct pio_program squarewave_program = {
...
};
void setup()
{
if (const Udon::Optional<StateMachine> sm = Udon::Pio::AllocateStateMachine(squarewave_program))
{
... // クロック分周期などを設定
pio_sm_set_enabled(sm->pio, sm->index, true); // ステートマシン起動
}
else
{
// 割り当て失敗
}
}
void loop() {}
オプショナル型
Definition Optional.hpp:62

StateMachine 構造体は以下のように定義されています。

struct StateMachine
{
PIO pio; // pio0 or pio1
int index; // state machine index 0~3
int offset; // offset of the program
};

ステートマシンもしくは命令メモリの空きがない場合、Udon::nullopt を返し割り当てに失敗します。例えば以下のように 8 つより多くのステートマシンを使用しようとした場合失敗します。

const auto result1 = AllocateStateMachine(squarewave_program); // ステートマシン: 1 命令メモリ: PIO0
const auto result2 = AllocateStateMachine(squarewave_program); // ステートマシン: 2 命令メモリ: PIO0
const auto result3 = AllocateStateMachine(squarewave_program); // ステートマシン: 3 命令メモリ: PIO0
const auto result4 = AllocateStateMachine(squarewave_program); // ステートマシン: 4 命令メモリ: PIO0
const auto result5 = AllocateStateMachine(squarewave_program); // ステートマシン: 5 命令メモリ: PIO1
const auto result6 = AllocateStateMachine(squarewave_program); // ステートマシン: 6 命令メモリ: PIO1
const auto result7 = AllocateStateMachine(squarewave_program); // ステートマシン: 7 命令メモリ: PIO1
const auto result8 = AllocateStateMachine(squarewave_program); // ステートマシン: 8 命令メモリ: PIO1
const auto result9 = AllocateStateMachine(squarewave_program); // nullopt

同じ命令であれば同じ PIO 内のステートマシンに割り当てられますが、以下のように異なる命令と組み合わせる場合、使用できるステートマシンの数が大きく制限されます。

const auto result1 = AllocateStateMachine(hogehoge_program); // ステートマシン: 1 命令メモリ: PIO0
const auto result2 = AllocateStateMachine(squarewave_program); // ステートマシン: 5 命令メモリ: PIO1
const auto result3 = AllocateStateMachine(squarewave_program); // ステートマシン: 6 命令メモリ: PIO1
const auto result4 = AllocateStateMachine(squarewave_program); // ステートマシン: 7 命令メモリ: PIO1
const auto result5 = AllocateStateMachine(squarewave_program); // ステートマシン: 8 命令メモリ: PIO1
const auto result6 = AllocateStateMachine(squarewave_program); // nullopt
const auto result1 = AllocateStateMachine(hogehoge_program); // ステートマシン: 1 命令メモリ: PIO0
const auto result2 = AllocateStateMachine(hugahuga_program); // ステートマシン: 5 命令メモリ: PIO1
const auto result3 = AllocateStateMachine(squarewave_program); // nullopt