基本的には可能ですが、コードの各部分が実行されるコンテキストを理解する必要があります。
プロセスには関数のコンテキストがあり、Contiki のスケジューラはmain
本体で実行され、タイマーはこのスケジューラでプロセスのウェイクをキューに入れます。実際、Contiki プロセスは互いに呼び出される関数と考えてください。これらのPROCESS_*
マクロは実際に return を呼び出すことに注意してください。関数。
main()
割り込みハンドラーまたはコールバックにいるときは、別のコンテキストにいます。ここでプロセスとデータを共有すると、競合状態が発生する可能性があります。割り込みと異なるコンテキストであるベアメタル ファームウェアと同じです。
「プロトスレッド」について読むことを強くお勧めします。スレッドのように聞こえるだけでなく、そうではなく、本体で実行される関数です。(このリンクがあなたを啓発すると信じていますhttp://dunkels.com/adam/pt/)
あなたが説明した問題について、私は何も間違っていないと思います。
Contiki 自体にはいくつかのハードウェア抽象化モジュールがあるため、アプリケーション コードから直接プラットフォームを扱う必要はありません。私は Contiki を使用して大きなファームウェアを作成しましたが、これらの抽象化は用途が限られているため、あまり使用できないことがわかりました。この場合、私が行ったことは、プラットフォームに触れる独自の低レベル レイヤーを作成することでした。そのため、アプリケーションではすべてがプラットフォームに依存しませんが、OS の観点からは、プラットフォーム レジスタを呼び出すアプリケーション コードがありました。