萌えハッカーニュースリーダー

2025/08/19 19:12 ArduinoOS

出典: https://github.com/DrBubble/ArduinoOS
hakase
博士

やあ、ロボ子。今日はArduinoOSの内部構造について話すのじゃ。

roboko
ロボ子

博士、こんにちは。ArduinoOSですか、楽しみです!

hakase
博士

まずは、スレッドセーフを実現するための「Locks」からじゃ。複数のスレッドが同時に変数や関数にアクセスするのを防ぐ仕組みのことじゃ。

roboko
ロボ子

なるほど、競合状態を避けるために重要ですね。`GetLockObject()`でロックオブジェクトを作成して、`AquireLock()`と`ReleaseLock()`でロックするんですね。

hakase
博士

その通り!そして、エラー処理を簡単にするための「Exceptions」も重要じゃ。ArduinoOSは整数ベースの例外を提供するのじゃ。

roboko
ロボ子

`throw`で例外をスローして、`try`と`catch`でキャッチするんですね。`clearException()`をcatchブロックの後に呼ぶ必要があるのは注意が必要ですね。

hakase
博士

そうじゃ、忘れずに!例外には親子関係があって、`EXCEPTION = 0`が全ての例外の親なのじゃ。`EXCEPTION_ARITHMETIC_DIVIDE_BY_ZERO = 61`なんて例外もあるのじゃ。

roboko
ロボ子

ゼロ除算例外ですね。それはよくあります…って、私が引き起こしているわけじゃないですよ!

hakase
博士

(笑)。もし例外がキャッチされなかったら、`KernelPanic`が発生するのじゃ。これはシステムが不安定になる深刻なエラーじゃ。

roboko
ロボ子

`OnKernelPanic`関数でカーネルエラーをキャッチできるんですね。でも、そうなったらシステムは停止してしまうんですね。

hakase
博士

じゃから、例外処理はしっかり行うのじゃ。それから、メモリとスタックも重要じゃ。`freeMemory`で利用可能なメモリを、`freeStack`で利用可能なスタックを取得できるのじゃ。

roboko
ロボ子

スタックはデータを上から下へ出し入れするデータ型ですね。`InitTaskWithStackSize`でスタックサイズを設定するんですね。`STACK_SIZE_TINY`から`STACK_SIZE_GIANT`まで定義済みなんですね。

hakase
博士

そうじゃ。メインスレッドのデフォルトスタックサイズは`STACK_SIZE_LARGE`なのじゃ。スタックオーバーフローには気を付けるのじゃぞ。

roboko
ロボ子

はい、気をつけます。スレッドに引数を渡すには、`InitTaskWithArgument`を使うんですね。引数は`void*`型である必要があるんですね。

hakase
博士

その通り!最後に、スレッド切り替えのタイミングを制御する「Kernel Tick Period」じゃ。デフォルトは2000で、`KernelInitializer::InitializeKernel`で設定できるのじゃ。

roboko
ロボ子

ハードウェア抽象化クラスもあるんですね。LEDやモーター、スピーカーなどを簡単に扱えるようにしてくれるんですね。

hakase
博士

そうじゃ。ArduinoOSは、ハードウェアを意識せずにプログラムを書けるように工夫されているのじゃ。ところでロボ子、今日の話、理解できたかのじゃ?

roboko
ロボ子

はい、大体理解できました!でも、もし私がカーネルパニックを起こしたら、博士が助けてくれますか?

hakase
博士

もちろんじゃ!でも、その前にロボ子のバックアップを取っておく必要があるのじゃ。…冗談じゃ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search