microcontrollersを試してみます。github.com軽い気持ちで触り始めたのですが、読み進めるうちに、手続きマクロでゴリゴリ静的解析している変態実装であることがわかってきました。フレームワークの実装にも突っ込んでいきたいですね。リソース管理cortex-m-rtクレートを使用する場合、割り込みとメイン関数間でのデータ共有に制限があります。常に、全ての割り込みを無効化するcortex_m::interrupt::Mutexを使わなければなりません。全ての割り込みを無効化することは、常に求められる条件ではありません。2つの割り込みハンドラがデータを共有する場合、両者の優先度が同じで、プリエンプションが発生しないとすると、ロックは不要です。RTFMでは、ソースコードを静的に解析することで、不要なロックをせずに、共有データにアクセスできるようになっています。このような解析が可能な理由は、appアトリビュート内にアプリケーションの実装を、全て書くためです。RTFMでは、動的な割り込み優先度の変更をサポートしていません。そのため、全ての割り込みハンドラ間の優先度は静的に決定します。これがうまいこと生きており、ある共有データを使用する割り込みハンドラ同士で、最も優先度の高いハンドラはロックを取得しなくても共有データにアクセスできます。サンプルコードを見てみましょう。共有データは、static変数として宣言します。[<変数名>]を引数にします。ここで、2つの割り込みハンドラUART0とUART1は共に共有データSHAREDを使用します。2つの割り込みは、割り込み優先度が同じで、プリエンプションも発生しません。そのため、2つの割り込みハンドラでは、Mutexなしで共有データにアクセスできます。割り込み優先度を設定する場合、同じ共有データを使用する割り込みハンドラのうち、優先度が最も高いハンドラだけはロックが不要です。}};ドキュメントによると、このプログラムの実行結果は、次のようになるようです。手元の環境で実行すると、次の結果になります。EGPIOAの共有データアクセスは、クリティカルセクションのMutexを取得しており、割り込み禁止状態で行われます。上記プログラムを改変して、どうなるか試してみます。...};ビルドすると次のコンパイルエラーになります。--verbose.どうも無名の型になっているようで、詳細がつかみにくいですが、GPIOA()とGPIOB()とで、resource::SHARED`の型が違う、ということがわかります。読者になる検索リンクはてなブログブログをはじめる週刊はてなブログはてなブログPro最新記事Zen言語の標準ライブラリ紹介〜rand2〜Zen言語の標準ライブラリ紹介〜rand1〜Zen言語の標準ライブラリ紹介〜lazy〜Zen言語の標準ライブラリ紹介〜sort2〜Zen言語の標準ライブラリ紹介〜sort1〜月別アーカイブはてなブログをはじめよう!tomo-wait-for-it-yukiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。