2014-09-01 :-(
_ 読書メーター
2014年8月の読書メーター
読んだ本の数:5冊
読んだページ数:1826ページ
ナイス数:9ナイス
リーダーシップ入門 (日経文庫)
読了日:8月25日 著者:金井寿宏
イシューからはじめよ―知的生産の「シンプルな本質」の感想
課題を見つける、需要があるものをやる、優先度をつける、定量的に分析する
読了日:8月25日 著者:安宅和人
神楽坂G7 崖っぷちカフェ救出作戦会議 (集英社スーパーダッシュ文庫)の感想
しらび絵に釣られて買ったら著者が声優だったのか。ほんとに女性が書いたのかと思うくらいに若い男子の妄想が描かれているし戦隊モノを掴んでいる。あとがきも割りとアレ
読了日:8月20日 著者:水沢史絵
俺の教室にハルヒはいない (3) (角川スニーカー文庫)の感想
順調に進み学園ラブコメのようになっている
読了日:8月9日 著者:新井輝
されど罪人は竜と踊る〈12〉The One I Want (ガガガ文庫)の感想
ヨーカーンが全部持っていった/ガユスはどう見てもジヴに未練たらたらしてるので案の定
読了日:8月8日 著者:浅井ラボ
読書メーター
_ [QuickML]QuickML を設置するなどしていた
現在の DNS コンテンツサーバーにテキトーに A レコードだけでっち上げて QuickML ( 横着プログラミング 第5回: QuickML: 超お手軽なメーリングリスト) を起動させて動作確認してみたら動作した。当たり前だ
2014-09-03 :-(
2014-09-05 :-(
_ DNS 浸透いうな問題
_ はてぶで見かけても踏まないようにしているしブクマしないようにしている
- はちま
- やらおん
- 刃
_ Linuxでネットワークの監視を行えるモニタリングコマンド20選 | 俺的備忘録 〜なんかいろいろ〜
たぶん 2014Q2 の pkgsrc
#!/bin/sh pkg=" iftop bmon iptraf nload nethogs speedometer bwtop slurm tcptrack vnstat bwm-ng cbm pktstat netwatch trafshow ifstat dstat nmon glances saidar " for p in ${pkg}; do p_dir=/usr/pkgsrc/net/${p} [ -d ${p_dir} ] && echo ${p_dir} done
/usr/pkgsrc/net/iftop /usr/pkgsrc/net/bmon /usr/pkgsrc/net/nload /usr/pkgsrc/net/slurm /usr/pkgsrc/net/vnstat /usr/pkgsrc/net/trafshow
_ [NetBSD][翻訳]hubertf's NetBSD blog NetBSD running on OpenRISK 1000 CPUs
Matt Thomas posted that he has updated the NetBSD toolchain and build system to build the userland for the OpenRISK 1000 CPU, and will work on the kernel next. From Wikipedia:
Matt Thomas は、 OpenRISK 1000 CPU 用にユーザーランドをビルドするための NetBSD ツールチェインとビルドシステムをアップデートしたと 投稿した 。次バージョンのカーネルで動作するだろう。Wikipedia から引用。
``OpenRISC is the original flagship project of the OpenCores community. This project aims to develop a series of general purpose open source RISC CPU architectures. The first (and currently only) architectural description is for the OpenRISC 1000, describing a family of 32 and 64-bit processors with optional floating point and vector processing support.''
OpenRISC は OpenCores コミュニティによる旗艦プロジェクトである。このプロジェクトはオープンソースの汎用的な RISC CPU アーキテクチャを開発することを目的としている。最初の( そして最新の )アーキテクチャ記述は OpenRISC 1000 向けのもので、これは浮動小数点やベクトル処理も可能な 32 ビット、64 ビットプロセッサファミリーを記述できる。
To start playing, use Qemu v1.2 or have a look at the available Javascript emulator.
Qemu v1.2 を使うか、Javascript emulator で遊べる。
Who's the first to give me an URL of the emulator running NetBSD in my webbrowser? :)
NetBSD エミュレーターはよ
2014-09-08 :-(
2014-09-10 :-)
2014-09-12 :-(
2014-09-13 :-)
_ 午前
1100 起床 && 部屋掃除
_ area51.gr.jp サーバーを移動させた
友人宅にハウジングしてるのは変わらないんだが物理計算機から仮想計算機へ移動させることになった。それに伴い IP アドレスも変更されるので何日か前から名前設定など諸々作業していた。
- 新しいサーバーへ OS (NetBSD) をインストール
- pkgsrc 等をインストール
- 旧サーバーからデータ( /etc/rc.conf やら /usr/pkg/etc やら /home 等) をコピー
- 新サーバーを諸々設定( web, mail ... )
- 新サーバーで quickml 動作確認( Aレコードをでっち上げて動作させた )
ここまでやった段階で最後の問題は DNS を移行させることにかなりビビっていたんだけど結局それほど大変でもなかった。
作業手順はここの通り DNSサーバーの引っ越し~トラブル発生を未然に防ぐ手順とポイント~ (PDF)
- 新サーバーのゾーンデータを新サーバーへ設定
- 旧サーバーのゾーンデータを新サーバーへ設定
- レジストラのゾーンデータを新サーバーへ設定
あとは DNS 浸透()するまで待つ。
_ quickml の safe_open で死んでいた
サーバー移行に伴い
2014-09-13T21:32:23: Unknown Session Error: SystemExit: exit 2014-09-13T21:32:23: ["/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/utils.rb:72:in `exit'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/utils.rb:72:in `rescue in safe_open'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/utils.rb:62:in `safe_open'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/core.rb:410:in `write_ml_config'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/core.rb:141:in `init_ml_config'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/core.rb:99:in `initialize'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/core.rb:987:in `new'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/core.rb:987:in `block in process_recipient'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/core.rb:986:in `synchronize'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/core.rb:986:in `process_recipient'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/core.rb:1006:in `block in process'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/core.rb:1005:in `each'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/core.rb:1005:in `process'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/server.rb:249:in `process'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/server.rb:266:in `block in _start'" "/usr/pkg/lib/ruby/2.0.0/timeout.rb:66:in `timeout'" "/usr/pkg/lib/ruby/2.0.0/timeout.rb:97:in `timeout'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/server.rb:265:in `_start'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/server.rb:278:in `start'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/server.rb:316:in `process_session'" "/usr/pkg/lib/ruby/vendor_ruby/2.0.0/quickml/server.rb:298:in `block in accept'"]
ここの処理
class File def self.safe_open (filename, mode = "r") begin f = File.open(filename, mode) if block_given? yield(f) f.close else return f end rescue => e STDERR.printf "%s: %s\n", $0, e.message <=ここ exit(1) end end end
これ
% ls -l /var/quickml -rwxr-xr-x 1 root quickml 614 Sep 7 12:36 foo -rwxr-xr-x 1 root quickml 12 Sep 7 12:36 foo,charset -rwxr-xr-x 1 root quickml 146 Sep 7 12:36 foo,config -rwxr-xr-x 1 root quickml 6 Sep 7 12:36 foo,count
ダサい
% chown -R quickml:quickml /var/quickml
2014-09-14 :-)
_ [デジカメ][コンデジ][Cyber-shot][サイバーショット]SONY Cyber-shot DSC-TX30 を買った
@ヨドバシカメラ
コンデジを買ったのはずいぶん久しぶりだ。
試しに撮ってみた。
B00BQ6VK7E
_ [艦これ]艦これ 3-5 北方AL海域
北方海域戦闘哨戒「北方海域に敵増援の動きがある。中規模の水上打撃部隊を派遣し、敵増援を捕捉、これを撃破せよ!」
9/12 のメンテナンスで実装された新海域。夏イベントの AL 海域ふたたび。
ここ基準で 【艦これ】3-5攻略/周回 明石/まるゆ掘り : 艦これ周回主義 ゲージ削りは下ルート。最後のトドメは上ルート。ケージ破壊可能になると下ルートのボス前に軽空母が編成されて重巡が昼戦連撃してくるようになるのでかなりツラい。
バケツ 50 個くらい消費したんじゃないか。
- BE 大破撤退 - 利根 五月雨 夕立 ヴェールヌイ 時雨 長波
- BG 大破撤退 - 夕張 五月雨 夕立 ヴェールヌイ 時雨 長波
- BGK S勝利 球磨
- BG 大破撤退
- B 大破撤退
- BGK S勝利 飛鷹
- BG 大破撤退
- BGK S勝利
- BG 大破撤退 重巡昼戦連撃
- B 大破撤退
- ADB 大破撤退 - 大井 川内 那珂 伊401 伊58 伊168
- ACFK S勝利 長良 クリア - 伊勢 比叡 金剛 伊401 伊58 伊168
2014-09-15 :-)
_ 買い物
iTunes Store
- ウラオモテ・フォーチュン 月刊少女野崎くん ED
- 花ハ踊レヤいろはにほ ハナヤマタ ED
- ミライファンファーレ 未来少女たち 普通の女子校生が【ろこどる】やってみた。OP/ED
_ [μITRON][TOPPERS/JSP][コードリーディング]μITRON 実装 TOPPERS/JSP を読む
コードはこちら
TOPPERSプロジェクト/ダウンロード の 完全版 を貰う。
eclipse にインポートしてコードリーディング
なおダウンロードしたソースコードは文字エンコードが EUC-JP のようなので eclipse ではデフォルトだとデコードできず文字化けする。
プロジェクト - プロパティ - リソース - テキストファイルエンコーディングを EUC-JP と記入する suz-lab - blog: EclipseでEUC-JPを使うには
_ [セマフォ][μITRON][TOPPERS/JSP][コードリーディング]μITRON 実装 TOPPERS/JSP を読む - セマフォ
セマフォには
- バイナリセマフォ
- 計数セマフォ
の 2 つがある。
みんな大好き wdic より
バイナリセマフォ
バイナリセマフォは0か1のどちらかの値しか持たないセマフォで、重要度の高い処理のブロックに用いられる。
フラグは初期化によって最初1はセットされ、特定のプロセスが処理開始時にAPIを呼びフラグをデクリメント(−1)し、処理の終了と共にAPIを呼びインクリメント(+1)する。
他のプロセスがこれを同時に処理しようとすると、フラグが0になっているためにデクリメントに失敗して処理がブロックされ、そのプロセスはOSレベルで休止状態にされる。後に処理が完了しフラグが1に戻ると、プロセスキューに溜められた休止中のプロセスがOSによって順にチェックされ、処理が再開される。
汎用セマフォ
汎用セマフォはカウンターであり、資源に一定の空き数がある場合に利用される。
基本的に値は資源の空き数に設定され、特定のプロセスが処理開始時に値のデクリメント(−1)を行ない、処理終了時にインクリメント(+1)を行なう。空き数を使い切り、デクリメントに失敗した場合のブロッキング処理はバイナリセマフォと同様である。
バイナリセマフォは同期処理によく使われる。
汎用セマフォは資源を独占処理するときに使われる。計数セマフォとかカウンティングセマフォなどともいう。
セマフォの実装 kernel\semaphore.c
この 3 つの処理を読む。cre_sem どこだよ
- semaphore_initialize セマフォ初期化
- wai_sem セマフォ獲得
- sig_sem セマフォ開放
汎用セマフォだろうとバイナリセマフォだろうとセマフォの実装は同一である。セマフォカウンタ値の初期値によって汎用セマフォなのかバイナリセマフォなのかを切り替える。初期値が 1 ならばバイナリセマフォ。そうでなければ汎用セマフォ。たぶん。
しかし初期値をどうやって設定するのかが分からん。「コンフィギュレーション」とやらがあるらしいので TOPPERS/JSP をファームウェアとして利用するときにユーザーの環境ごとに何か設定するようだ。
doc/user.txt より
3.4 同期・通信機能 3.4.1 セマフォ セマフォの最大資源数は,UINT型(unsigned int型に定義している)で表現で きる数値の範囲内である.すなわち,unsigned int型が 32ビットの場合は (2^32 - 1),16ビットの場合は (2^16 - 1) = 65535 である.TMAX_MAXSEM は 定義していない. (1) CRE_SEM セマフォの生成(静的API) (2) sig_sem, isig_sem セマフォ資源の返却 (3) wai_sem セマフォ資源の獲得 (4) pol_sem セマフォ資源の獲得(ポーリング) (5) twai_sem セマフォ資源の獲得(タイムアウトあり)
cxx_sample2.cfg というファイルに以下の記述がある。たぶんこれが初期値として使われる?
CRE_SEM(1, { TA_TFIFO, 1, 1 }); CRE_SEM(2, { TA_TFIFO, 1, 1 }); CRE_SEM(3, { TA_TFIFO, 1, 1 }); CRE_SEM(4, { TA_TFIFO, 1, 1 }); CRE_SEM(5, { TA_TFIFO, 1, 1 });
セマフォのデータ構造を見ていく。
/* * キューのデータ構造の定義 */ typedef struct queue { struct queue *next; /* 次エントリへのポインタ */ struct queue *prev; /* 前エントリへのポインタ */ } QUEUE;
/* * セマフォ初期化ブロック */ typedef struct semaphore_initialization_block { ATR sematr; /* セマフォ属性 */ UINT isemcnt; /* セマフォの資源数の初期値 */ UINT maxsem; /* セマフォの最大資源数 */ } SEMINIB;
/* * セマフォ管理ブロック */ typedef struct semaphore_control_block { QUEUE wait_queue; /* セマフォ待ちキュー */ const SEMINIB *seminib; /* セマフォ初期化ブロックへのポインタ */ UINT semcnt; /* セマフォ現在カウント値 */ } SEMCB;
/* * セマフォ管理ブロックのエリア(kernel_cfg.c) */ extern SEMCB semcb_table[];
ここからがセマフォのコード。
セマフォ初期化。ここの isemcnt が↑で登場した CRE_SEM に指定した初期値だろう。
void semaphore_initialize() { UINT i; SEMCB *semcb; for (semcb = semcb_table, i = 0; i < TNUM_SEM; semcb++, i++) { queue_initialize(&(semcb->wait_queue)); semcb->seminib = &(seminib_table[i]); semcb->semcnt = semcb->seminib->isemcnt; } }
セマフォ獲得
SYSCALL ER wai_sem(ID semid) { SEMCB *semcb; WINFO_WOBJ winfo; ER ercd; // CPUによっては空っぽ LOG_WAI_SEM_ENTER(semid); // ディスパッチ保留状態でないかのチェック CHECK_DISPATCH(); // セマフォIDが有効範囲内か確認 CHECK_SEMID(semid); // セマフォテーブルからIDに該当するセマフォを取得 semcb = get_semcb(semid); // CPUをロック。ここからの処理は不可分。CPUごとに実装が異なる。 t_lock_cpu(); // セマフォカウント値が 1 以上の場合はデクリメントするだけ if (semcb->semcnt >= 1) { semcb->semcnt -= 1; ercd = E_OK; } // セマフォ計数が 0 以下の場合は待機する else { wobj_make_wait((WOBJCB *) semcb, &winfo); // 最高優先度のタスクへディスパッチ dispatch(); ercd = winfo.winfo.wercd; } t_unlock_cpu(); exit: LOG_WAI_SEM_LEAVE(ercd); return(ercd); }
セマフォの返却
SYSCALL ER sig_sem(ID semid) { SEMCB *semcb; TCB *tcb; ER ercd; LOG_SIG_SEM_ENTER(semid); CHECK_TSKCTX_UNL(); CHECK_SEMID(semid); semcb = get_semcb(semid); // CPUをロック。ここからの処理は不可分。CPUごとに実装が異なる。 t_lock_cpu(); // セマフォ開放待ちのキューがある場合 if (!(queue_empty(&(semcb->wait_queue)))) { // キューの次のエントリを取り出す。ようするに deque している。 tcb = (TCB *) queue_delete_next(&(semcb->wait_queue)); // タスクの待機状態を解除。ディスパッチが必要な場合はタスクをディスパッチする。 if (wait_complete(tcb)) { dispatch(); } ercd = E_OK; } // 現在のセマフォカウント値が最大値を超えてなければカウントをインクリメント else if (semcb->semcnt < semcb->seminib->maxsem) { semcb->semcnt += 1; ercd = E_OK; } else { ercd = E_QOVR; } t_unlock_cpu(); exit: LOG_SIG_SEM_LEAVE(ercd); return(ercd); }
↑の関数で使われているマクロとかいろいろ
/* * ディスパッチ保留状態でないかのチェック(E_CTX) */ #define CHECK_DISPATCH() { \ if (sense_context() || t_sense_lock() || !(enadsp)) { \ ercd = E_CTX; \ goto exit; \ } \ }
#define CHECK_SEMID(semid) { \ if (!VALID_SEMID(semid)) { \ ercd = E_ID; \ goto exit; \ } \ }
#define VALID_SEMID(semid) \ (TMIN_SEMID <= (semid) && (semid) <= tmax_semid)
/* * セマフォIDからセマフォ管理ブロックを取り出すためのマクロ */ #define INDEX_SEM(semid) ((UINT)((semid) - TMIN_SEMID)) #define get_semcb(semid) (&(semcb_table[INDEX_SEM(semid)]))
/* * 同期・通信オブジェクトに対する待ち状態への移行 * * 実行中のタスクを待ち状態に移行させ,同期・通信オブジェクトの待ちキュー * につなぐ.また,待ち情報ブロック(WINFO)の wobjcb を設定する. * wobj_make_wait_tmout は,タイムイベントブロックの登録も行う. */ extern void wobj_make_wait(WOBJCB *wobjcb, WINFO_WOBJ *winfo); extern void wobj_make_wait_tmout(WOBJCB *wobjcb, WINFO_WOBJ *winfo, TMEVTB *tmevtb, TMO tmout);
/* * 最高優先順位タスクへのディスパッチ(cpu_support.S) * * dispatch は,タスクコンテキストから呼び出されたサービスコール処理 * 内で,CPUロック状態で呼び出さなければならない. */ extern void dispatch(void);
_ [イベントフラグ][μITRON][TOPPERS/JSP][コードリーディング]μITRON 実装 TOPPERS/JSP を読む - イベントフラグ
イベントの通知とその管理。イベントの種類をビットで管理する。
イベント個数が既知ならばこれで足りる。しかしイベント個数がユーザーでも拡張可能の場合(上限不明)はこれでは実現できない。たとえばフラグが 32 ビットだとすると高々 32 個ぶんのイベントしか管理できない。.NET の event 等のようなものと同じ機能であり、それをビットで管理している。
doc\user.txt より。1 つのイベントで複数タスクが待てないんだそうだ。
3.4.2 イベントフラグ 一つのイベントフラグで複数のタスクが待ち状態になれる機能はサポートして いない. FLGPTN型は,unsigned int型に定義している.よって TBIT_FLGPTN は, unsigned int型が 32ビットの場合は 32,16ビットの場合は 16 になる. (1) CRE_FLG イベントフラグの生成(静的API) flgatr に TA_WMUL が指定された場合の機能(イベントフラグで複数のタスク が待ち状態になれる)はサポートしていない. (2) set_flg, iset_flg イベントフラグのセット (3) clr_flg イベントフラグのクリア (4) wai_flg イベントフラグ待ち (5) pol_flg イベントフラグ待ち(ポーリング) (6) twai_flg イベントフラグ待ち(タイムアウトあり)
コードを読む kernel\eventflag.c
ソースファイル冒頭にデータ構造等がある。セマフォにあったデータ構造と処理に似ている。
イベントフラグがイベント ID ごとのテーブルになっており、イベントフラグごとにそのイベント待機するタスクキューがある。
/* * イベントフラグIDの最大値(kernel_cfg.c) */ extern const ID tmax_flgid; /* * イベントフラグ初期化ブロックのエリア(kernel_cfg.c) */ extern const FLGINIB flginib_table[]; /* * イベントフラグ管理ブロックのエリア(kernel_cfg.c) */ extern FLGCB flgcb_table[]; /* * イベントフラグの数 */ #define TNUM_FLG ((UINT)(tmax_flgid - TMIN_FLGID + 1)) /* * イベントフラグIDからイベントフラグ管理ブロックを取り出すためのマクロ */ #define INDEX_FLG(flgid) ((UINT)((flgid) - TMIN_FLGID)) #define get_flgcb(flgid) (&(flgcb_table[INDEX_FLG(flgid)])) /* * イベントフラグ待ち情報ブロックの定義 * * flgptn は,waiptn および wfmode と同時に使うことはないため,union * を使えばメモリを節約することが可能である. */ typedef struct eventflag_waiting_information { WINFO winfo; /* 標準の待ち情報ブロック */ WOBJCB *wobjcb; /* 待ちオブジェクトの管理ブロック */ FLGPTN waiptn; /* 待ちパターン */ MODE wfmode; /* 待ちモード */ FLGPTN flgptn; /* 待ち解除時のパターン */ } WINFO_FLG;
初期化の処理。これもセマフォで見たコードだ。
void eventflag_initialize(void) { UINT i; FLGCB *flgcb; for (flgcb = flgcb_table, i = 0; i < TNUM_FLG; flgcb++, i++) { queue_initialize(&(flgcb->wait_queue)); flgcb->flginib = &(flginib_table[i]); flgcb->flgptn = flgcb->flginib->iflgptn; } }
フラグの型は以下のとおり。UINT は 32 ビット以上なので 32 種類のイベントを管理できる。
typedef UINT FLGPTN; /* イベントフラグのビットパターン */
フラグセット。つまりイベント発火。
set_flg(ID flgid, FLGPTN setptn) { FLGCB *flgcb; TCB *tcb; WINFO_FLG *winfo; ER ercd; LOG_SET_FLG_ENTER(flgid, setptn); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); flgcb = get_flgcb(flgid); t_lock_cpu(); // イベントのビットを立てる flgcb->flgptn |= setptn; // イベントを待っているタスクキューがある場合 if (!(queue_empty(&(flgcb->wait_queue)))) { // イベントのタスクキューを取り出してそのタスクの待機を解除しディスパッチする tcb = (TCB *)(flgcb->wait_queue.next); winfo = (WINFO_FLG *)(tcb->winfo); if (eventflag_cond(flgcb, winfo->waiptn, winfo->wfmode, &(winfo->flgptn))) { queue_delete(&(tcb->task_queue)); if (wait_complete(tcb)) { dispatch(); } } } ercd = E_OK; t_unlock_cpu(); exit: LOG_SET_FLG_LEAVE(ercd); return(ercd); }
イベントフラグを待機する。
SYSCALL ER wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn) { FLGCB *flgcb; WINFO_FLG winfo; ER ercd; LOG_WAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn); CHECK_DISPATCH(); CHECK_FLGID(flgid); CHECK_PAR(waiptn != 0); CHECK_PAR((wfmode & ~TWF_ORW) == 0); flgcb = get_flgcb(flgid); t_lock_cpu(); // イベントのタスクキューが空でないとダメです if (!(queue_empty(&(flgcb->wait_queue)))) { ercd = E_ILUSE; } else if (eventflag_cond(flgcb, waiptn, wfmode, p_flgptn)) { ercd = E_OK; } else { winfo.waiptn = waiptn; winfo.wfmode = wfmode; // イベント待ち。現在のタスクを待機状態へ移行 wobj_make_wait((WOBJCB *) flgcb, (WINFO_WOBJ *) &winfo); // 最高優先度のタスクをディスパッチ dispatch(); ercd = winfo.winfo.wercd; if (ercd == E_OK) { *p_flgptn = winfo.flgptn; } } t_unlock_cpu(); exit: LOG_WAI_FLG_LEAVE(ercd, *p_flgptn); return(ercd); }
イベントのビットをクリア。& してるので操作するビットを間違えるとアウチなことになる。
SYSCALL ER clr_flg(ID flgid, FLGPTN clrptn) { FLGCB *flgcb; ER ercd; LOG_CLR_FLG_ENTER(flgid, clrptn); CHECK_TSKCTX_UNL(); CHECK_FLGID(flgid); flgcb = get_flgcb(flgid); t_lock_cpu(); flgcb->flgptn &= clrptn; ercd = E_OK; t_unlock_cpu(); exit: LOG_CLR_FLG_LEAVE(ercd); return(ercd); }
_ [データキュー][μITRON][TOPPERS/JSP][コードリーディング]μITRON 実装 TOPPERS/JSP を読む - データキュー
1 ワードのデータを送受信するためのキュー。1 ワードだけどポインタを乗せれば何でもイケる。
コードはこれ kernel\dataqueue.c
データキュー初期化
void dataqueue_initialize(void) { UINT i; DTQCB *dtqcb; for (dtqcb = dtqcb_table, i = 0; i < TNUM_DTQ; dtqcb++, i++) { queue_initialize(&(dtqcb->swait_queue)); dtqcb->dtqinib = &(dtqinib_table[i]); queue_initialize(&(dtqcb->rwait_queue)); dtqcb->count = 0; dtqcb->head = 0; dtqcb->tail = 0; } }
データキューへ送信
SYSCALL ER snd_dtq(ID dtqid, VP_INT data) { DTQCB *dtqcb; WINFO_DTQ winfo; TCB *tcb; ER ercd; LOG_SND_DTQ_ENTER(dtqid, data); CHECK_DISPATCH(); CHECK_DTQID(dtqid); dtqcb = get_dtqcb(dtqid); t_lock_cpu(); // データ受信待ちのタスクキューがあれば送信する。最高優先度のタスクをディスパッチ if ((tcb = send_data_rwait(dtqcb, data)) != NULL) { if (wait_complete(tcb)) { dispatch(); } ercd = E_OK; } // キューに積む else if (enqueue_data(dtqcb, data)) { ercd = E_OK; } // データ受信されるまでタスクを待機状態へする。最高優先度のタスクをディスパッチ else { winfo.data = data; wobj_make_wait((WOBJCB *) dtqcb, (WINFO_WOBJ *) &winfo); dispatch(); ercd = winfo.winfo.wercd; } t_unlock_cpu(); exit: LOG_SND_DTQ_LEAVE(ercd); return(ercd); }
データキューから受信。最初の処理の意図が分からん。
SYSCALL ER rcv_dtq(ID dtqid, VP_INT *p_data) { DTQCB *dtqcb; WINFO_DTQ winfo; TCB *tcb; VP_INT data; ER ercd; LOG_RCV_DTQ_ENTER(dtqid, p_data); CHECK_DISPATCH(); CHECK_DTQID(dtqid); dtqcb = get_dtqcb(dtqid); t_lock_cpu(); // データキューがあれば if (dequeue_data(dtqcb, p_data)) { // データを受信 if ((tcb = receive_data_swait(dtqcb, &data)) != NULL) { // またデータキューへ入れる? enqueue_data(dtqcb, data); if (wait_complete(tcb)) { // タスクディスパッチはいつもの流れ dispatch(); } } ercd = E_OK; } // データ受信 else if ((tcb = receive_data_swait(dtqcb, p_data)) != NULL) { if (wait_complete(tcb)) { dispatch(); } ercd = E_OK; } // データ無ければ受信待ちキューへ入れて待機状態へ移行 else { runtsk->tstat = (TS_WAITING | TS_WAIT_WOBJ); make_wait(&(winfo.winfo)); queue_insert_prev(&(dtqcb->rwait_queue), &(runtsk->task_queue)); winfo.wobjcb = (WOBJCB *) dtqcb; LOG_TSKSTAT(runtsk); dispatch(); ercd = winfo.winfo.wercd; if (ercd == E_OK) { *p_data = winfo.data; } } t_unlock_cpu(); exit: LOG_RCV_DTQ_LEAVE(ercd, *p_data); return(ercd); }
2014-09-17 :-(
_ 午後
1615 退勤
_ [メールボックス][ITRON][TOPPERS/JSP][コードリーディング]ITRON 実装 TOPPERS/JSP を読む - メールボックス
データへのポインタの線形リスト。受信前に再送信すると以前のデータは上書きされる。
データそのものではなく、データへのポインタをやりとりする。
doc\user.txt で機能を眺めてみる。
3.4.4 メールボックス T_MSG型は下記のように定義されている.T_MSG型のサイズは,ターゲットプロ セッサ/コンパイラのポインタのサイズに一致する. typedef struct t_msg { struct t_msg *next; } T_MSG; JSPカーネルでは,優先度別メッセージキューヘッダ領域は用いていない. TSZ_MPRIHD は定義していないが,定義するとしたら 0 となる. (1) CRE_MBX メールボックスの生成(静的API) mprihd に NULL 以外が指定された場合の機能(優先度別メッセージキューヘッ ダ領域の先頭番地を指定する)はサポートしていない. (2) snd_mbx メールボックスへの送信 (3) rcv_mbx メールボックスからの受信 (4) prcv_mbx メールボックスからの受信(ポーリング) (5) trcv_mbx メールボックスからの受信(タイムアウトあり)
コードはここ kernel\mailbox.c
メールボックス送信
SYSCALL ER snd_mbx(ID mbxid, T_MSG *pk_msg) { MBXCB *mbxcb; TCB *tcb; ER ercd; LOG_SND_MBX_ENTER(mbxid, pk_msg); CHECK_TSKCTX_UNL(); CHECK_MBXID(mbxid); mbxcb = get_mbxcb(mbxid); CHECK_PAR((mbxcb->mbxinib->mbxatr & TA_MPRI) == 0 || (TMIN_MPRI <= MSGPRI(pk_msg) && MSGPRI(pk_msg) <= mbxcb->mbxinib->maxmpri)); // リリカル不可分操作 始まります t_lock_cpu(); // タスクキューが空っぽじゃない場合 if (!(queue_empty(&(mbxcb->wait_queue)))) { // タスクをタスクキューへ追加 tcb = (TCB *) queue_delete_next(&(mbxcb->wait_queue)); ((WINFO_MBX *)(tcb->winfo))->pk_msg = pk_msg; if (wait_complete(tcb)) { // 起きろ dispatch(); } ercd = E_OK; } // 優先度付きキューならこっち else if ((mbxcb->mbxinib->mbxatr & TA_MPRI) != 0) { enqueue_msg_pri(&(mbxcb->head), pk_msg); ercd = E_OK; } else { // メッセージへのポインタをリストの末尾へ追加など pk_msg->next = NULL; if (mbxcb->head != NULL) { mbxcb->last->next = pk_msg; } else { mbxcb->head = pk_msg; } mbxcb->last = pk_msg; ercd = E_OK; } t_unlock_cpu(); exit: LOG_SND_MBX_LEAVE(ercd); return(ercd); }
メールボックス受信
SYSCALL ER rcv_mbx(ID mbxid, T_MSG **ppk_msg) { MBXCB *mbxcb; WINFO_MBX winfo; ER ercd; LOG_RCV_MBX_ENTER(mbxid, ppk_msg); CHECK_DISPATCH(); CHECK_MBXID(mbxid); mbxcb = get_mbxcb(mbxid); // CPU不可分しまっせ t_lock_cpu(); // メッセージボックスが空っぽじゃない場合 if (mbxcb->head != NULL) { // リストの先頭のメッセージへのポインタを取得 *ppk_msg = mbxcb->head; mbxcb->head = (*ppk_msg)->next; ercd = E_OK; } // メッセージボックスが空っぽの場合 else { // タスクを待機状態へ移行 wobj_make_wait((WOBJCB *) mbxcb, (WINFO_WOBJ *) &winfo); dispatch(); ercd = winfo.winfo.wercd; if (ercd == E_OK) { *ppk_msg = winfo.pk_msg; } } t_unlock_cpu(); exit: LOG_RCV_MBX_LEAVE(ercd, *ppk_msg); return(ercd); }
_ [メッセージバッファ][ITRON][TOPPERS/JSP][コードリーディング]ITRON 実装 TOPPERS/JSP を読む - メッセージバッファ
メールボックスとは異なり、データのコピーを線形リストに繋げる。コピーするぶん遅いが上書きの心配はない。
しかしTOPPERS/JSP に実装が見当たらん。
include\kernel_debug.h にタスク状態の定数はあるんだが使っている箇所がない。うーん。
#define TTW_SMBF 0x0100u /* メッセージバッファへの送信待ち */ #define TTW_RMBF 0x0200u /* メッセージバッファからの受信待ち */
2014-09-18 :-)
_ [沖縄][宮古島]沖縄紀行 1 日目
宮古島へ行ってきた。
沖縄紀行 2014-09-18 - an album on Flickr
勧誘された。
初日の宿 ホテル日航那覇グランドキャッスル
まずは夕飯。
今回は三脚を持参したのでライトアップされた首里城を見てきた。
終了間際に行ったので客が少ない。
2014-09-19 :-)
_ [沖縄][宮古島]沖縄紀行 2 日目
沖縄紀行 2014-09-19 - an album on Flickr
鍾乳洞を探検してきた おきなわワールド-文化王国
装備をととのえて出発する。
鍾乳洞の水は最初はまだ膝あたりだった。
徐々に胸元あたりまでくるようになる。
石にロープが結び付けられているのでこれを頼りに行く。
100年前だかに天井から落下した岩盤だそうな。石が成長してその重さに耐えられなくなり地震などの影響で落下するとか。この時に地震が発生したらどうなるんだろうかと戦々恐々としていた。
剥がれ落ちた部分。石がまた成長している。
鍾乳洞の最後に階段を登って地上へ出る。
こんとき脳内で「JUST ONE VICTORY」(TM NETWORK)が再生されていた。
暗く 長い洞窟を抜けだして見渡せば 永遠に生きるための勇気感じる その瞬間
{{
その後 旧海軍司令部壕 へ移動。この錨は、当初は卯月のものだったが盗まれてしまったので卯月の錨に似させて作ったものだそうだ。( 沖縄海軍慰霊之塔物語 )
艦これでは彼女である( via 卯月改 - 艦隊これくしょん -艦これ- 攻略 Wiki* )
移動して那覇空港の食堂でおひる。
宿へ移動。ホテルブリーズベイマリーナ|宮古島
部屋。
外を眺める。
2階なんだが2階のテラス( バルコニーか? )が最も広い。
眺める。
廊下には椅子などが退避してある。
眺める。
プライベートビーチ
晩飯。ビフテキである。
2014-09-20 :-)
_ [沖縄][宮古島]沖縄紀行 3 日目
沖縄紀行 2014-09-20 - an album on Flickr
朝焼け
朝飯
前浜ビーチ。まあ私くらいに訓練されていると お一人様海水浴くらいは出来るようになる。
来間大橋
おひる@古謝そば屋
東平安名崎。灯台にのぼってきた。
展望台
宮古島メガソーラー実証研究設備 発電設備っていいよねー やっぱ見学してなんぼよね。いや眺めただけですが。
晩飯。ビフテキである。昨日と同じ。
三脚を持参したので天の川撮影に挑戦した。必要な設定。
- F3.5
- TV 25秒
- 天候
曇り気味だったんだが雲が途切れたときにすかさず撮影するなどしていた。
2014-09-21 :-)
_ [沖縄][宮古島]沖縄紀行 4 日目
沖縄紀行 2014-09-21 - an album on Flickr
朝飯
川満マングローブ。FF12 のようだ。
砂山ビーチ。シュノーケリングじゃなくてもこれくらいは撮れる。
これこれ!こういうの撮りたかったんだよー
おひる@すむばり もずく丼だそうな。
雪塩 製塩工場見学は日曜日は営業していなかったというか見学できても割りとガッカリスポットだった。
池間大橋
池間島
- 周囲の道「PMが示した仕様」
- 中央の道「顧客が本当に欲しかった物」
島尻マングローブ
海中公園
海中を眺めるんだがあいにくの天気により視界不良(通常は20メートル先まで見れるが今日は5メートルまでだとか) 若干入場料が安かった。
対岸から海中公園を眺める。波が荒れている。
晩飯。ビフテキである。昨日と同じ。
2014-09-22 :-)
_ [ストラトス・フォー][沖縄][宮古島]沖縄紀行 5 日目
沖縄紀行 2014-09-22 - an album on Flickr
伊良部島と下地島へ行ってきた。ストラトス・フォー の舞台である。
朝飯
移動。
伊良部大橋 の工事をしていた。
舞台
おひる@さしばの里 主人公たちのバイト先のモデルだったそうだ
下地島空港
通り池
島から帰り。
バナナケーキのモンテドール で買い物。
ゲバラの額にバナナがある。
晩飯。ビフテキである。昨日と同じ。従業員がビールをくれた。
ref.
2014-09-23 :-)
_ [沖縄][宮古島]沖縄紀行 6 日目
沖縄紀行 2014-09-23 - an album on Flickr
朝焼け見れず。
「まあそんなときもあるさ」
朝飯
そして帰路へ。
宮古島から那覇へ。那覇空港でバスに乗った。
昼飯は那覇空港の食堂で買った弁当。
観光箇所を複数まわるとただ淡々とまわるだけになったのであまり彷徨かないほうがいいのかもしれんなあ。
2014-09-24 :-(
_ [國府田マリ子][ムササビ][川原湯温泉]川原湯温泉
東京新聞:川原湯温泉駅 ずっと記憶に 八ッ場ダムに水没 24日で終業、移転:群馬(TOKYO Web)
國府田マリ子 の歌に「ムサ君のお引っ越し~川原湯温泉に捧ぐ~」という歌がありまして。川原湯温泉のムササビのことを歌ったうたなんですが、はるか昔 偶然にも國府田マリ子ファンだった俺たちは川原湯温泉へ行ってムササビのぬいぐるみを買ってきたのであった。いや行ったのは一人なんですが。
1998年8月27日の日記より。当時は学生だった。いまの飲み連中の國府田マリ子クラスタとも出会っていない時期だった。
8/27(金)
「折角の連休なんだから何処かに旅行に逝ってこいよ。」
先日、バイト先の社員に言われたので、川原湯温泉に逝ってみることにした。
國府田さんのアルバム「だいすきなうた」に入っている「ムサ君のお引っ越し~川原湯温泉に捧ぐ~」で知ったのだけど、
この地域は平成18年にダムに沈んでしまうそうだ。そうなる前に一度逝っておきたかった。
因みにNHK「ひるどき日本列島」でも取り上げられていたね。
当日は「祭だから(宿の)部屋は空いてないよ。」と言うので、日帰りにした。祭?
大宮~高崎迄を新幹線で移動しようとしたのだが、気付いたら「越後湯沢」?
駅の外にはNAEBAという文字が見えるなあ。新幹線に急行とか各駅停車が有るとは知らなかった。
流石に若者は少ない。っていうか居ない。
昼から温泉に入っている人間は珍しいのか、入浴料金を払うときに珍しいものを見る様な目で見られた。
温泉街なので他に何も無い。取り合えず有名らしい「王湯」に入る。
寝不足だったためか、風呂を出たら吐き気がする。
温泉の建物と同じ処に有るソバ屋で昼飯。おお。手作りなためか歯応えが違う。
その後ムサ君グッズが有るという山木館に逝く。
ここは夜になるとムサ君が来る(夜行性)というので、ここに泊まりたかったが上記の通り満室らしい。残念。
取り合えず風呂に入って、ムサ君のぬいぐるみと、あとちょこちょこ菓子を買った。
一人の方が行動するには楽なのだけど、拙者の場合、旅は一人じゃない方が良いらしい。
いつもATフィールドを張っているから。
当時買ったのがこれ
2014-09-25 :-(
2014-09-26 :-(
_ 午後
1615 退勤
2014-09-28 :-)
_ [氷菓][舞台探訪][加茂荘]氷菓 舞台探訪 加茂荘
そろそろ 氷菓 の舞台探訪せんとなあと考えてもょもょしていたときに手軽に行けそうな箇所を見つけた。加茂荘花鳥園 加茂花菖蒲園 と云う。千反田える の屋敷のモデルになったところ。
今の時期はお花が少なく、ご来園頂くお客様の数も多くないので加茂荘をほぼ独り占めできるんです。
というわけでオフシーズンだけど行ってきた。最盛期は梅雨の時期。
帰路を心配したのでとっとと帰ってきたんだけど、時間が許すならば本でも読みながら一日中この屋敷でのんびりしたい。これはダメになる空間だ。
道中
往路は東名高速道路と新東名高速道路でばびゅーんと 3 時間ほどで着いたんだが、帰路は渋滞につかまり結局 7 時間ほどかかった。うぇぇぇ
舞台探訪開拓者たちはいつもこんな生活してるのか。マネできないというか体力がモタん。
途中で休憩したモスバーガー
加茂花菖蒲園
花鳥園
フクロウが居る。
花鳥園内。ここはシーズン中ならば食事ができるようだ。若干獣臭いけど
外に出る。
シーズン中ならば人で賑わっているであろうテーブル。
ここで軽食を食べられるらしい。シーズン中ならば
ここに花菖蒲が咲くようだ。
加茂荘
加茂荘へ移動。桶のなかに亀が居た。
加茂荘に入ると入場券の半券でウェルカムドリンクが 1 杯貰える。休憩所で飲む。
頂きます。
休憩所の一角はこうなっている。えるたそ
舞台
@lidges さんの所をなぞるだけの簡単な つればし 氷菓 舞台探訪(聖地巡礼) 第2回 -加茂荘 加茂花菖蒲園-
_ エモエモ [大学院受かったZE☆]
_ みわ [おめー]
_ 酔漢 [こんにちは rcv_dtqでコメントにクエスチョンマークが付いているところですが、これは「また入れている」訳ではあり..]
_ みわ [酔漢さん: 指摘ありがとうございます。receive_data_swait の定義に「送信待ちキューの先頭タスクから..]