部内向けスキルアップ研修 「組込みOS自作入門」

Similar documents
PowerPoint プレゼンテーション

Microsoft PowerPoint - Kozos12step_07_

動機 もう6学期だし真面目に勉強しようと思った 真面目に授業聞いてみたけどよくわからなかった Amazonみてたら OS自作 という文字列を発見 話し聞いてもよくわからないしもはや自分で作っちゃえばいいんじゃない 駒場祭付近暇だしそこで 一気に作っちゃおう

Microsoft PowerPoint - Kozos12step_

04-process_thread_2.ppt

PowerPoint プレゼンテーション

Microsoft PowerPoint - OS03.pptx

TFTP serverの実装

PowerPoint プレゼンテーション

1. A/D 入力について分解能 12bit の A/D コンバータ入力です A/D 入力電圧とディジタル値との対応は理論上 入力電圧 0V : 0 入力電圧 +3V : 4095 です 実際はオフセットと傾きがあり ぴったりこの数値にはなりません 2. A/D 入力に使用する信号 STM32L_A

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

Slide

アジェンダ Renesas Synergy TM プラットフォーム構成 ThreadX とは ThreadX の状態遷移 ThreadX とμITRONの機能比較 まとめ ページ 2

OS

TOPPERS 活用アイデア アプリケーション開発 コンテスト 部門 : 活用アイデア部門アプリケーション開発部門 作品のタイトル : Toppers_JSP と Scicos_lab / (Scilab でも可 ) による 組込みメカトロニクス制御シミュレーション 作成者 : 塩出武 ( シオデタ

05-scheduling.ppt

Microsoft PowerPoint - 6.pptx

slide5.pptx

memo

Microsoft PowerPoint - kougi7.ppt

CPUスケジューリング

Microsoft PowerPoint - 10Com2.ppt

命令セットの構成例 a) 算術 演算命令 例 )ADD dest, source : dest dest + source SUB dest, source : dest dest - source AND dest, source : dest dest AND source SHR reg, c

ユーティリティ 管理番号 内容 対象バージョン 157 管理情報バッチ登録コマンド (utliupdt) のメッセージ出力に対し リダイレクトまたはパイプを使用すると メッセージが途中までしか出 力されないことがある 267 転送集計コマンド (utllogcnt) でファイル ID とホスト名の組

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

PowerPoint Presentation

(Microsoft PowerPoint - \221g\202\335\215\236\202\335\203\\\203t\203g\203E\203F\203A\215H\212w No02\201i\224z\225z\227p\201j.pptx)

1. 新規プロジェクト作成の準備新規プロジェクトのためのフォルダを用意して そこにプロジェクトを作成します [ 新しいフォルダー ] をクリックして希望のフォルダに新しいフォルダを作成します この例では TrST_F401N_BlinkLD2 というフォルダを作成しました TrST_F401N_Bl

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

今週の進捗

スレッドとプロセス

出 アーキテクチャ 誰が 出 装置を制御するのか 1

1 Atollic TrueSTUDIO( GR-PEACH TOPPERS/ASP ASP GR-PEACH mbed ( git

tri_s_tg12864_vcp の説明 2014/02/05 飛石伝ひ CPU 基板 の LCD TG12864 の表示プログラムです 漢字表示 (JIS208) を行うことができます USB の VCP ( 仮想 COM ポート ) を使用して非同期シリアル通信により 表示試験を行うことができ

1. UART について UART は Universal Asynchronous Receiver Transmitter の頭文字をとったもので 非同期シリアル通信と呼ばれます シリアル通信とは 一本の信号線でデータをやりとりするために 1bit ずつデータを送出することをいいます データを受

Microsoft PowerPoint - 05.pptx

Micro Focus Enterprise Developer チュートリアル メインフレーム COBOL 開発 : MQ メッセージ連携 1. 目的 本チュートリアルでは CICS から入力したメッセージを MQ へ連携する方法の習得を目的としています 2. 前提 使用した OS : Red H

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

Driver Specification for JX65x, 67x, 598

自己紹介 湯浅陽一 1999 年より Linux kernel 開発に参加 MIPS アーキテクチャのいくつかの CPU へ Linux kernel を移植

Microsoft PowerPoint - 11_4-4-5pagerepl.pptx

4. 環境変数の設定実行にあたり 次のように環境変数を設定する必要があります 1)SJIS ロケールの指定コマンド例 )export LANG=ja_JP.sjis 2)MQ 環境の指定コマンド例 ). /opt/mqm/bin/setmqenv s 3)COBOL 実行環境の指定コマンド例 ).

改版履歴 版数改版内容 新規作成 Page 1

Microsoft PowerPoint - OS02.pptx

コンピュータ工学Ⅰ

Operating System プロセスのスケジューリング

RH850の割り込み/例外実現方法 CC-RHアプリケーションガイド

プログラミング実習I

2.RL78 での割り込み処理 ( 割り込み受け付け ) マスクが解除された (xxmk ビットが 0 の ) 割り込み要求信号は 2 つの用途で使用されます 一つ目は,CPU のスタンバイ状態の解除です この動作は, 割り込み優先順位とは全く無関係で, マスクされていない (xxmk=0 の )

DumpCollection IT Exam Training online / Bootcamp PDF and Testing Engine, study and practice

ブート領域、フラッシュ領域の分割方法 RL78ファミリ用Cコンパイラ CC-RL

この手の問題を診断する際に Simics は完璧なツールなのですが 実行するためには 問題が発生するプログラムを Simics に取り込まなければなりません すなわち Simics 上で Simics を実行するのです まず Simics 内部に開発ホストの複製を作成します これは何も難しいことでは

Taro-リストⅠ(公開版).jtd

プログラミング及び演習 第1回 講義概容・実行制御

スライド 1

Microsoft PowerPoint - OS07.pptx

コンピュータ工学Ⅰ

Microsoft PowerPoint - No6note.ppt

S1C17 Family Application Note S1C17 シリーズ PORT 多重割り込みアプリケーションノート Rev.1.0

POSIXプログラミング Pthreads編

Microsoft PowerPoint pptx[読み取り専用]

1. 使用する信号 1.1. UART 信号 UART 通信に使用する信号と接続相手との接続は以下の通りです UART 信号表 番号 CPU 機能名 CPU 信号名 基板コネクタピン番号 方向 接続相手の信号名 1 USART1_TX PA9 CN > RxD 2 USART1_R

TOPPERS活用アイデア・アプリケーション開発

また RLF 命令は 図 2 示す様に RRF 命令とは逆に 各ビットを一つずつ 左方向に回転 ( ローテイト ) する命令である 8 ビット変数のアドレスを A とし C フラグに 0 を代入してから RLF A,1 を実行すると 変数の内容が 左に 1 ビットシフトし 最下位ビット (LSB)

Microsoft PowerPoint - lec10.ppt

UIOUSBCOM.DLLコマンドリファレンス

ご利用のコンピュータを設定する方法 このラボの作業を行うには 事前設定された dcloud ラボを使用するか 自身のコンピュータをセットアップします 詳細については イベントの事前準備 [ 英語 ] とラボの設定 [ 英語 ] の両方のモジュールを参照してください Python を使用した Spar

PowerPoint プレゼンテーション - 物理学情報処理演習

目次 LS-DYNA 利用の手引き 1 1. はじめに 利用できるバージョン 概要 1 2. TSUBAME での利用方法 使用可能な LS-DYNA の実行 4 (1) TSUBAMEにログイン 4 (2) バージョンの切り替え 4 (3) インタラ

CLUSTERPRO MC ProcessSaver 2.3 for Windows はじめての ProcessSaver 第 5 版 2018 年 6 月 日本電気株式会社 日頃より弊社製品をご愛顧いただきありがとうございます このたび お客様にご利用いただく ProcessSaver でのプロセ

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Microsoft PowerPoint - OS02.ppt

Microsoft Word - 中間試験 その1_解答例.doc

計算機システム概論

テキストファイルの入出力1

プログラミング入門1

Microsoft Word - ExtFlashROM.doc

Microsoft PowerPoint - 06.pptx

< F2D837C E95CF CF68A4A94C5816A2E6A>

ex04_2012.ppt

Microsoft PowerPoint - NxLec ppt

Webデザイン論

情報処理 Ⅱ 2007 年 11 月 26 日 ( 月 )

KDDI ペーパーレスFAXサービス

スライド 1

Microsoft PowerPoint - OS12.pptx

Microsoft PowerPoint - prog06.ppt

SpeC記述のC記述への変換 (SpecCによるソフトウェア記述の実装記述への変換)

memo

2015_collabo_04

スライド 1

slide4.pptx

02: 変数と標準入出力

Microsoft PowerPoint - OpenMP入門.pptx

CLUSTERPRO MC ProcessSaver 2.3 for Windows 導入ガイド 第 5 版 2018 年 6 月 日本電気株式会社

Application Note Application Note No. ESC-APN Document No.: ESC-APN adviceluna Linux デバッグ手順 (MIPS コア編 ) はじめに adviceluna Linux デバッグ手順 ( 以

ex05_2012.pptx

MS916 バッチ操作ガイド FW バージョン 0.52 向け バッチ操作の基本 MS916 のバッチ操作について バッチ操作では 読取ったバーコードデータはすべて 不揮発性のメモリ (1MB ROM JAN-13 約 50,000 件 ) に保存されます メモリに保存されたデータは任意のタイミング

Transcription:

部内向けスキルアップ研修 組込み OS 自作入門 2013 年 12 月 8th ステップ担当 : 松元

本日の内容 スレッドを実装します スレッドとは? OS とは? もくもく会 スレッドで動作するコマンド応答プログラム 必要に応じてプログラムの説明

たとえばこんな動作をさせる 以下の機能を持つ 0.1 秒ごとにLED 点滅 1 秒ごとに液晶パネルに時刻表示 シリアルからのコマンドに応答 一定時間ごとにサービスを実行できるかチェックする ( ビジー ループ ) 8.1.1 OS はなぜ必要なのか?

メイン ループ 0.1 秒経過? LED を点滅 1 秒経過? 液晶パネルに時刻表示 シリアル受信? ダンプ出力を追加 入力コマンドを実行 8.1.1 OS はなぜ必要なのか?

問題点 ダンプするデータが大きい場合 処理に時間がかかる LED 点滅 時計表示がとまってしまう 一定回数ごとにメイン ループに戻る 8.1.1 OS はなぜ必要なのか?

メイン ループより呼び出し ダンプ処理 ダンプ処理中? 前回の状態を復旧して再開 データ分繰り返す データ出力 一定回数? データがなくなるまで メイン ループへ 状態を保存 メイン ループへ

dump 関数 定期的にメイン ループに戻る 戻る前に実行中の状態を保存 関数の先頭で 前回の中断状態からの再開か調べる 再開の場合 保存された状態を復旧 8.1.1 OS はなぜ必要なのか?

まとめると 時間のかかる処理 回数が特定できないループ処理 では 中断 再開処理が必要 処理が複雑化してバグが発生しやすい 8.1.1 OS はなぜ必要なのか?

やりたいこと 定期的な処理の切り替え 処理状態の中断 保存 再開 サービス単位に区切る ( タスク ) 処理を共通化 スレッド化 8.1.2 タスクとスレッド

スレッドとは タスクごとに独立して動作させる 並行処理 CPU の処理時間を非常に短い単位に分割し 複数のスレッドに順番に割り当てることによって 複数の処理を同時に行っているようにみせる 8.1.2 タスクとスレッド

用語 システム コール OS に対するサービス要求 スケジューリング 次に動作すべきスレッドを選択 ディスパッチ 選択されたスレッドの処理再開 8.1.2 タスクとスレッド

ディスパッチ 中断時に処理状態を保存 スタックはスレッドごとに持つ 再開時にスタック ポインタを再開するスレッドのスタックのものに切り替える 8.1.2 タスクとスレッド

用語 コンテキスト / コンテキスト情報 スレッドの処理中断時に保存が必要な CPU の状態 スタック ポインタ プログラム カウンタなどの各種レジスタ値 コンテキスト切替え / コンテキスト チェンジ スレッドのディスパッチのために そのスレッドのコンテキストを読み込むこと 8.1.2 タスクとスレッド

用語 アプリケーション プログラム OS 上でタスクとして独立して動作するプログラム コア / カーネル OS の中核 基本プログラム 8.1.3 アプリケーション プログラムとは何か?

OS/ 割込み / スレッド OS は割込みの延長で動作し スレッドを管理する 1. 割込みハンドラからスレッドのコンテキスト保存 2. スケジューリング 3. スレッドのコンテキストを復旧 ( ディスパッチ ) 8.1.4 スレッドの切替え契機

システム コール OS は資源を管理するための機能を持つ OS は割込みの延長 スレッドとは切り離されている スレッド側から明示的に割込みを発生 システム コール命令を実行 システム コール割込みが発生 システム コール割込みハンドラで応答 8.1.5 システム コール

もくもく会の前に kz_start() スレッド生成用スレッドを開始 レディー キュー 8.2 OS の実装

レディー キュー スレッドごとにタスク コントロール ブロック (TCB) を生成 タスクの情報を格納 実行可能なスレッドのタスク コントロール ブロックをつなぐ ( レディー キュー ) TCB nextポインタ TCB nextポインタ TCB nextポインタ NULL readyque head tail 各種パラメータ 各種パラメータ 各種パラメータ 8.2 OS の実装

レディー キュー 実行中のスレッド ( カレント スレッド ) の実行に区切りがついたら レディー キューの末尾に追加 ラウンドロビン スケジューリング カレントスレッド TCB nextポインタ TCB nextポインタ TCB nextポインタ NULL NULL 各種パラメータ 各種パラメータ 各種パラメータ readyque head tail 8.2 OS の実装

用語 キュー / 先入れ先出し /FIFO 最初に入ってきたものを最初に処理する構造 キューイング / エンキュー キューへ挿入 デキュー キューからの抜き出し スタック : 後入れ先出し /LIFO 8.2 OS の実装

もくもく会 スレッドで動作するコマンド応答プログラム 教科書 p.290~ のソースコードリストを参照 ブート ローダー OS ld.scr intr.s startup.s を修正 kozos.h kozos.c syscall.h syscall.c test08_1.c を追加 ld.scr startup.s defines.h main.c Makefile を修正 8.2 OS の実装

プログラムの実行 ブートローダー OS make make image make write make コンソールで確認 load kozosを転送 run echo test exit 8.3 プログラムの実行

コードを追ってみよう startup.s より main() が呼ばれる (P.325) kz_start(start_threads, "start", 0x100, 0, NULL); (P.317) 割込みハンドラの登録 setintr(softvec_type_syscall, syscall_intr); setintr(softvec_type_softerr, softerr_intr); current = (kz_thread *)thread_run(func, name, stacksize, argc, argv); dispatch(&current->context);

割込みハンドラの登録 (P.313) setintr(softvec_type_syscall, syscall_intr); setintr(softvec_type_softerr, softerr_intr); 割込みベクタの登録 softvec_setintr(type, thread_intr);(p.263) SOFTVECS[type] = handler; 割込みハンドラの登録 handlers[type] = handler;

コードを追ってみよう startup.s より main() が呼ばれる (P.325) kz_start(start_threads, "start", 0x100, 0, NULL); (P.317) 割込みハンドラの登録 setintr(softvec_type_syscall, syscall_intr); setintr(softvec_type_softerr, softerr_intr); current = (kz_thread *)thread_run(func, name, stacksize, argc, argv); dispatch(&current->context);

thread_run() (P.306) タスク コントロール ブロックを設定 thp->init.func = func; スタックを設定 スレッドの戻り先 :thread_end() スレッドの開始位置 :thread_init() 汎用レジスタ thread_init() に渡す引数 (ER0):thp レディー キューに接続

コードを追ってみよう startup.s より main() が呼ばれる (P.325) kz_start(start_threads, "start", 0x100, 0, NULL); (P.317) 割込みハンドラの登録 setintr(softvec_type_syscall, syscall_intr); setintr(softvec_type_softerr, softerr_intr); current = (kz_thread *)thread_run(func, name, stacksize, argc, argv); dispatch(&current->context);

thread_run() (P.306) タスク コントロール ブロックを設定 thp->init.func = func; start_threads スタックを設定 スレッドの戻り先 :thread_end() スレッドの開始位置 :thread_init() 汎用レジスタ thread_init() に渡す引数 (ER0):thp レディー キューに接続 ER0: 引数 ER1 ER6 開始位置 戻り先

コードを追ってみよう startup.s より main() が呼ばれる (P.325) kz_start(start_threads, "start", 0x100, 0, NULL); (P.317) 割込みハンドラの登録 setintr(softvec_type_syscall, syscall_intr); setintr(softvec_type_softerr, softerr_intr); current = (kz_thread *)thread_run(func, name, stacksize, argc, argv); レディー キューに登録 dispatch(&current->context); スレッドを実行

スレッドを実行 dispatch() (P.296) 引数 : スレッドのスタック ポインタ (ER0) 汎用レジスタの値を復旧 (ER0~ER6) rte プログラム カウンタとCCRの値を復旧

もう一度 thread_run() (P.306) タスク コントロール ブロックを設定 thp->init.func = func; start_threads スタックを設定 スレッドの戻り先 :thread_end() スレッドの開始位置 :thread_init() 汎用レジスタ thread_init() に渡す引数 (ER0):thp レディー キューに接続 ER0: 引数 ER1 ER6 開始位置 戻り先

スレッドを実行 thread_init() (P.306) thp->init.func(thp->init.argc,thp->init.argv); start_threads thread_end(); start_threads() (P.325) kz_run(test08_1_main, command, 0x100, 0, NULL);

kz_run() (P.322) パラメータを設定 param.un.run.func = func; test08_1_main kz_syscall(kz_syscall_type_run, &param); current->syscall.type = type; current->syscall.param = param; asm volatile( trapa #0 ); トラップ割込みを発行 (P.318)

スレッドを実行 thread_init() (P.306) thp->init.func(thp->init.argc,thp->init.argv); start_threads thread_end(); start_threads() (P.325) kz_run(test08_1_main, command, 0x100, 0, NULL);

thread_end() (P.305) kz_exit() (P.323) kz_syscall(kz_syscall_type_exit, NULL); (P.318) current->syscall.type = type; current->syscall.param = param; asm volatile( trapa #0 ); トラップ割込みを発行

トラップ命令による割込み 割込みベクタ

もう一度割込みハンドラの登録 setintr(softvec_type_syscall, syscall_intr); setintr(softvec_type_softerr, softerr_intr); 割込みベクタの登録 softvec_setintr(type, thread_intr); SOFTVECS[type] = handler; 割込みハンドラの登録 handlers[type] = handler;

thread_intr() (P.316) handlers[type](); 割込みハンドラ実行 SOFTVEC_TYPE_SYSCALL syscall_intr SOFTVEC_TYPE_SOFTERR softerr_intr schedule(); dispatch();

syscall_intr() (P.315) syscall_proc(current->syscall.type, current->syscall.param); (P.314) getcurrent(); call_functions(); call_functions(type, p); (P.314) KZ_SYSCALL_TYPE_RUN の場合 thread_run(p->un.run.func,...); KZ_SYSCALL_TYPE_EXITの場合 thread_exit();

もう一度 thread_run() (P.306) タスク コントロール ブロックを設定 thp->init.func = func;??? スタックを設定 スレッドの戻り先 :thread_end() スレッドの開始位置 :thread_init() 汎用レジスタ thread_init() に渡す引数 (ER0):thp レディー キューに接続 ER0: 引数 ER1 ER6 開始位置 戻り先

syscall_intr() (P.315) syscall_proc(current->syscall.type, current->syscall.param); (P.314) getcurrent(); call_functions(); call_functions(type, p); (P.314) KZ_SYSCALL_TYPE_RUN の場合 thread_run(p->un.run.func,...); KZ_SYSCALL_TYPE_EXITの場合 thread_exit();

kz_run() (P.322) パラメータを設定 param.un.run.func = func; test08_1_main kz_syscall(kz_syscall_type_run, &param); current->syscall.type = type; current->syscall.param = param; asm volatile( trapa #0 ); トラップ割込みを発行 (P.318)

もう一度 thread_run() (P.306) タスク コントロール ブロックを設定 thp->init.func = func; test08_1_main スタックを設定 スレッドの戻り先 :thread_end() スレッドの開始位置 :thread_init() 汎用レジスタ thread_init() に渡す引数 (ER0):thp レディー キューに接続 ER0: 引数 ER1 ER6 開始位置 戻り先

thread_intr() (P.316) handlers[type](); 割込みハンドラ実行 SOFTVEC_TYPE_SYSCALL syscall_intr SOFTVEC_TYPE_SOFTERR softerr_intr schedule(); スケジューリング dispatch(); スレッドを実行

スレッドを実行 thread_init() (P.306) thp->init.func(thp->init.argc,thp->init.argv); test08_1_main test08_1_main() (P.326) コンソールからのコマンドに応答するアプリケーション プログラム

もうひとつのトラップ割込み

thread_end() (P.305) kz_exit() (P.323) kz_syscall(kz_syscall_type_exit, NULL); (P.318) current->syscall.type = type; current->syscall.param = param; asm volatile( trapa #0 ); トラップ割込みを発行

syscall_intr() (P.315) syscall_proc(current->syscall.type, current->syscall.param); (P.314) call_functions(); call_functions(type, p); (P.314) KZ_SYSCALL_TYPE_RUN の場合 thread_run(p->un.run.func,...); KZ_SYSCALL_TYPE_EXIT の場合 thread_exit(); (P.307) 終了メッセージを表示タスク コントロール ブロックをクリア

まとめ OS の仕組み ( スレッド ) スレッドで動作するコマンド応答プログラムの作成 OS の原型が完成!

次回の開催予定 9th ステップ 優先度スケジューリング 日時 :1 月 15 日 ( 水 )13:00~ 場所 : 技術支援室 担当 : 谷口さん