読者です 読者をやめる 読者になる 読者になる

不確定特異点

広く深く、ところどころ超深く

コンテキスト切り替えの仕組み

OS ARM C

Cortex-M コアのコンテキスト切り替えについて、uros に実装した仕組みについてまとめておきます。(自分でもいつか忘れそうなので…) コンテキスト情報とは? タスクのスタック領域は full-descending スタック(スタックポインタが最後に push したデータ…

リソースアクセスプロトコルのまとめ

OS

マルチタスク環境において複数のタスクがリソースを共有し合うと、 優先度逆転 デッドロック という問題が起こります。これらを解決するためのリソースアクセスプロトコルについて、代表的なものをまとめてみました。 Non-Preemptive Protocol (NPP) Highest…

軽量 RTOS の開発 (9)

RTOS に乗せる静的オブジェクト用のコンフィギュレータを作ってみました。JSON をパースして C 言語の構造体リテラルに変換するだけの Common Lisp スクリプトです。 tanakahx/urosgithub.com Roswell スクリプト Common Lisp でスクリプトを書くと、他人に…

軽量 RTOS の開発 (8)

OS ARM C

前回アラームの実装が完了した段階で、OSEK の主要な機能はおおむね実装できたので、次はフットプリントの最適化を進めます。 タスクのエントリポイント、優先度、スタック領域等、静的に確保するデータは const にすることで Read Only リージョンに割り当…

優先度逆転とかコンフィギュレータとか

OS

優先度逆転 セマフォ等の同期オブジェクトを使った場合に、優先度の高いタスクがそれよりも優先度の低いタスクに実行権を奪われて、本来の優先度が逆転してしまうという、同期機構による優先度逆転現象には古典的な回避アルゴリズムがあり、RTOS を作るから…

軽量 RTOS の開発 (7)

OS ARM C

今日はアラーム機能を実装しました。 tanakahx/urosgithub.com アラーム機能とは、ある一定時間が経ったときに、タスクを起こしたり(アクティベーション)、イベントフラグを立てたり、コールバック関数を呼ぶという機能です。そもそも OS は時間をどう計る…

軽量 RTOS の開発 (6)

OS ARM C

今日はあまり進捗がなかったです…。というのも、カーネルとユーザタスクが一緒くたになっていたので、インタフェースを整えるべく、のほほんとリファクタリングしてたのですが、あるところで修正前後の挙動が保存されなくなってしまい、そのバグ取りではまっ…

軽量 RTOS の開発 (5)

OS ARM C

今日はリソース管理機能の追加をしてみました。OSEK/VDX でいうリソースとは、実質的にはミューテックスだと思われますが、あるタスクがリソースを確保したら、別のタスクはそのリソースを得ることはできず、そのタスクが解放するまでは待ち状態になる、とい…

軽量 RTOS の開発 (4)

OS ARM C

イベントフラグの実装をしてみました。OSEK/VDX のように、各タスクはイベントオブジェクトを持ち、wait_event() で待ち状態に入ります。このとき、起床条件にあたるビットパタンを指定します。続いて、別のタスクが set_event() によりイベントをセットしま…

μITRON と OSEK/VDX

OS

勉強のために既存の RTOS の仕様を確認しよう、というわけで、最近は μITRON と OSEK/VDX について調べてました。μITRON は対象となるシステム向けにプロファイルが規定されており、OSEK/VDX は車載システムに特化した RTOS です。なので、車載向けで比較し…

なぜ RTOS を使うのか?

OS

複数のコンテキストの独立性(保守性)と応答性を保つため、というのが現状の個人的な見解です。いま組み込み向けの OS のプロトタイプを実験的に作っているのですが、そもそもどういうときに OS が必要になるのか?という視点を忘れがちになりそうなので、…

軽量 RTOS の開発 (3)

OS ARM C

タスクを特権モードではなくユーザモードで動作させるのは、ちょっとしたトリックを使うと簡単に実現できました。例外発生により割り込みがかかると、LR レジスタには EXC_RETURN という特殊な値が格納されます。この EXC_RETURN の値は、例外発生時点に復帰…

軽量 RTOS の開発 (2)

OS ARM C

SysTick タイマ Cortex-M コアには SysTick というタイマが内蔵されてます。今回はこの SysTick タイマによる割り込みを受けて、タスクを切り替えられるようにしてみました。 SysTick タイマはリロード値から開始して 0 になるまでダウンカウントしていき、0…

軽量 RTOS の開発 (1)

OS ARM C

軽量 RTOS の開発メモを記録していきます。 以前考えたように、メモリ割り当てアルゴリズムは K&R malloc でも事足りそうなので、組み込んでみました。ちょっと違うのが、K&R ではヒープ領域が足りなくなったら sbrk で拡張してますが、軽量 RTOS では sbrk …

メモリ割り当てアルゴリズム (2)

組み込みRTOS用のメモリ割り当て処理を作るにあたり目標を考えてみます。 省メモリであること 高速であること 組み込み用途ではメモリ制約が厳しいため、フラグメンテーションを押さえつつ小規模かつ高速なアルゴリズム性能にするためのバランスが難しそうで…

メモリ割り当てアルゴリズム (1)

uros という組み込み用途を想定したARM用のOSを書いてます。といっても、まだタスクの生成と単純なタスクディスパッチが出来る程度で、割り込み処理は SVC(スーパバイザコール) のみ、しかもタスクを切り替えるタイミングも陽にシステムコールを実行するとい…