More Related Content
Similar to TOPPERS/SSPを用いた教育訓練カリキュラムカーネルの自作およびカスタマイズ @ソフトウェア講演会名古屋 (20)
TOPPERS/SSPを用いた教育訓練カリキュラムカーネルの自作およびカスタマイズ @ソフトウェア講演会名古屋
- 5. RTOS 自作講習会の概要
標準 ITRON ガイドブック(作り方の章)
特に専門用語の解説をしっかり
TOPPERS/SSP( オープンソース μITRON) を
ベース(シュリンク版というものを利用)
ボードで実際に演習を交えて実施(雑誌付録ボー
ド RX62n)+E1 デバッガ
ソースコードをステップベースで解説していきま
す。
(SSP は省ステップなので可能)
SSP 本来の機能からカーネル機能拡張(待ち状態
を追加)作業を演習実施。 dly_tsk を実装してい
きます。
- 7. カーネルコード解説
sta_ker() から始まる。
マルチタスクになる前段
階の処理
ブート一回目だけの処理
としてカーネルオブジェ
クトの生成がある。
SSP はカーネルオブジェ
クトといってもタスクの
み
TCB の初期設定をする。
最後にディスパッチャを
呼ぶ
void
sta_ker(void)
{
initialize_object();
kerflg = true;
intnest = 0;
dispatcher();
}
- 8. カーネルコード解説 2
ディスパッチャ部分
これは、途中で待ちになら
ない SSP 特有のディスパ
ッチ処理。
優先度の高いタスクにプリ
エンプトはするが、待ち状
態にはならないから、タス
クの高いタスクが終了して
から低いタスクの起動はこ
ういう単純な呼び出しでよ
い。
さらに SSP はスタック共
有型なのでスタックを切り
替える必要はない。
- 10. カーネルコード解説 4
ER
act_tsk(ID tskid)
{
ER ercd;
uint_t tskpri;
LOG_ACT_TSK_ENTER(tskid);
CHECK_TSKCTX_UNL();
CHECK_TSKID_SELF(tskid);
tskpri = get_ipri_self(tskid);
t_lock_cpu();
if (test_dormant(tskpri)) {
if(make_active(tskpri)) {
run_task(tskpri);
}
ercd = E_OK;
}
else {
ercd = E_QOVR;
}
t_unlock_cpu();
error_exit:
LOG_ACT_TSK_LEAVE(ercd);
return(ercd);
}
- 11. カーネルコード解説 5
最後は、ユーザーからの OS 呼び出しである。
タスクの起動で、基本はまずレディーキューに指
定したタスクの TCB をキューイングする
カーネルの最後(遅延ディスパッチで)今の最優
先タスクを動かす。
SSP は単純にサブルーチンコールしかしていない
ので、
タスクは常に頭から動くが、プリエンプトされて
復帰するケースは
自タスクよりも高いタスクを起動した場合。
起動されたタスクが終了した時点で、タスク起動
後に戻ればいいのでサブルーチンコールするのと
同じ作りで実現している
- 12. タスクスイッチの例 ( 追加ペー
ジ)
タスク 2 が RUN 中に、 act_tsk() でタス
ク 1 を起動
タスク 1 が優先度が高い場合
タスク 1 がサブルーチンコールされる動き
タスク2 中断
実行
タスク1
時間
act_tsk(task1)
呼び出し
- 14. 割込み時のタスクスイッチの例(追加ペ
ージ)
Task2 が RUN 中に割り込みが発生
割込みハンドラで iact_tsk(task1) を呼び
出
Task1 が優先度高い
0 1 2 3 4 5
割り込み処理
Task2
割り込み発生
Task1
時間
Copyright (C) Reserved 2010 Embedded Systems Co.,
割り込み発生 iact_tsk(task1)
Running
Ready
Dormant
- 16. シュリンク版
SourceForge に公開
http://sourceforge.jp/projects/shrink-sp-rx62n/
本物との違い
割込みベクターの登録およびスタートアップの削
除 OS なし環境を流用
なぜ作ったか?
SSP カーネルの簡潔な処理に比較して割り込みベ
クタ関係の処理の難度が高く、コード量も多い。
カーネルを学ぶために必要な部分だけ残した。そ
れで動くことが必要と考えた
- 17. TOPPERS/SSP のカスタマイズ フル改造編
(1)待ち状態を持つカーネルの設計
(2)実装
イ.コンテキストの保存と復元
ロ.サービスコール部の作成
(3) dly_tsk の追加
イ.実装に必要な項目の整理
ロ.指定時間待ちの実装 (dly_tsk)
(4)評価・改善
イ.制作したカーネルを用いる際の問題点の把握
ロ.問題点の改善
- 21. longjmp/setjmp の限界
RTOS のコンテキスト保存
は、 longjmp/setjmp だけでは、すべて
の場合に対応できません。
少なくとも戻り値が、 R1 レジスタが保存
されないことがある。
割り込みには対応できない
割り込み部でレジスタ保存 / 復帰を補完す
る必要がある。
- 22. Longjmp/setjmp の考え方
Setjmp はコンパイラが把握
OS 呼び出しの場合は、 setjmp を使い、これ
はコンパイラが把握できる。 Setjmp から戻る場
合は、レジスタ一式が復帰して jmp してくるが
保存を必要としない一部のレジスタを壊しても続
行できる。
割込みはコンパイラが把握できない
割り込みの場合はコンパイラが把握していない
ため、どこでどのレジスタを壊していいというこ
とがなくなる。