Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

Mt basic as-os_on_danbot

657 visualizaciones

Publicado el

Multi thread BASIC を二足歩行ロボットに入れた。他のマシンから、WiFI経由で、telnetで接続し、対話的に使える。
Multi thread BASICを、OSと捉える

Publicado en: Tecnología
  • Inicia sesión para ver los comentarios

  • Sé el primero en recomendar esto

Mt basic as-os_on_danbot

  1. 1. 1 単一言語マシンの 言語 [Multi Thread Tiny BASIC] はOS 2017/APR/13 たけおか@AXE/たけおかラボ @takeoka
  2. 2.  データベースをカーネル空間内で 動作させる  なんと特許を取れました  「リレーショナルデータベースを 内在するカーネルプログラム、 方法及び装置」 ● かなり広範囲に適用される…  上記と別に、データ+アクセス手続きに 関するOSの特許も出願中  上記のOSは、C言語で書いてます  推論系AIの特許も出願手続き中 ● Lisp+Prologで開発中 最近の俺達のOS ←カラーザウルス(1997年ごろ) 古い独自OS(XTAL) マシン Micro Kernelで仮想記憶 POSIX I/Fあり Haskellで書いたモニタもあり 型安全なので、アホなミスによる セキュリティ・ホールは無い
  3. 3. 3 高級言語マシン=単一言語マシン • OSスケジューラも、なんでも高級言語からいじるぜ • マルチスレッド・プログラミング言語が動けば幸せ • ファイル操作 • ls, rm, mv など、すべてBASIC言語から操作した • 対話的な言語で、CPU(計算機)と直接対話 • デバッグ環境も一体化 • LL, スクリプト系言語はインタープリタ それなのに、対話的に使わないとは、けしからん Symbolics(Lispマシン) Alto(Smalltalkマシン)PC-8001Apple ][
  4. 4. オレのダンボット ESP8266 に Multi Thread BASIC 整数 Tiny BASICだが、マルチ・スレッド fork(行番号)で、スレッド生成 スレッド間のメッセージ通信もある telnet で、ESP8266の BASIC に接続 & 対話 WiFi経由 BASIC を拡張 ● servo 番号,角度 ● サーボ番号==9で、一歩、歩く ● 一歩、歩くルーチンは、ATMegaに埋め込み ● 超音波センサで測距 ● &@ 特殊変数で、距離を読みだす 文字列操作はC言語並み http post 用の文字列は容易に作れる ESP8266 Arduino環境でBASICをコンパイル setjmp & longjmp を作るのに苦労した ATMega328 ESP8266
  5. 5. 5 マルチ・スレッド BASIC 命令語  fork(行番号)  式を開始行番号として、threadを生 成する  スレッドのプロセス番号を返す  end  メインスレッド(プロセス番号1)なら ば、全スレッド停止  子供スレッドならば、そのスレッドのみ が終了する  sleep 式  式の値で示された単位時間だけ、ス レッドの実行を停止する  ps – スレッドのステータスを表示  messnew(式) 関数 ● メッセージ・オブジェクトを作る (式はダミー)  messwait 式1,式2 ● 式1の値で示される番号のオブジェクトのメッセージを待つ ● すでに、そのメッセージを待っているプロセスがあった場合 は、待たずに抜ける ● 式2でタイムアウト時間を指定 ● 0番のオブジェクトは、キーボード入力  messread(式1) 関数 ● 式1の値で指定されるメッセージ・オブジェクトから読み出し  messsend(式1,式2) 関数 ● 式1の値で指定されるメッセージ・オブジェクトへ、式2の値 をメッセージとして送る ● そのメッセージ・オブジェクトを待っているプロセスがあれ ば、プロセスは走行可能になる  lastwait(式) 関数 ● 式の値で指定されるメッセージ・オブジェクトの待ちから抜 けた要因を返す ● 1: O_RES_RECV メッセージを受信した ● -2: O_RES_TO タイムアウト ● -3: O_RES_WAITING 現在も待ちプロセスがある(待ち は外れていない) ● -1: Error オブジェクトは未使用
  6. 6. 6 マルチ・スレッド BASIC 実現について  オブジェクトを待ちつつ、タイムアウトも待つ  時刻は内部でのカウントが一定を越えたら1tick(単位時間)  タイムアウトは、内部時刻(時計)を1tick増加させるときに、チェック  timeoutQは、タイムアウト時刻順に並んでいるので、現在時刻より以 前の時刻で待っているスレッドは、すべてactiveQへつなぎ直す obj[n].proc オブジェクトへのメッセージ待ち timeoutQ timeoutQへ つなぐときは、 タイムアウト時刻順で ソートする。時刻は内部時刻 100 500100 210 タイムアウト 時刻 内部時刻が300になった時、これより前のスレッ ドは、すべて待ちから、readyQにつなぎ直す
  7. 7. 7 俺のダンボットBASIC(動画) https://www.youtube.com/watch?v=jKaVaSY80hY
  8. 8. 8 おしまい
  9. 9. 9 プログラム例 5'ESP8266 Walk and Usense 10 servo 9,0:sleep 350 :' walk 1 step 20 servo10,0 :'Usensor 30 ? &@ :' print Usensor value 512 goto 10 run 100 100 72 72 36 36 44 44 48 48 68 68 84 84 124 124 152 152 168 168 196 196 72 72 88 88 20 20 52 52 168 168^C
  10. 10. 10 プログラム例 5 '3threads 10 print fork(256): print fork(512) 20 do:print ”c”:sleep 300:while 1 256 print "b":sleep 100:goto 256 512 print "a":sleep 200:goto 512 M>>r. 2b 3acbbabcbabbacbbabcbabbacbbabcbabbacbba bcbabbacbbabcbabbacbbabcbabbacbbabcbabb acbbabcb…
  11. 11. 11 インタープリタ  仮想機械  ソフトウェアで実現された機械  Tiny BASICの機械語は、文字列なのでダサい  可変長の命令セットを持つ、美しくない x86 は、みんな使っている  機械語命令が可変長の文字列であるハードウェアは実在した  IBM 1401  http://en.wikipedia.org/wiki/IBM_1401
  12. 12. 12 インタープリタ  仮想機械の実行 命令デコード 通常命令 命令フェッチ 通常命令 通常命令 通常命令 ブレーク・チェック RUN.実行開始
  13. 13. 13 マルチスレッドとは
  14. 14. 14 マルチ・スレッド  スレッドとは  計算に必要なコンテキストを持ち、CPUが割当たると計算を実 行  コンテキストとは  PC, StackPointerなどのレジスタ  スタック  マルチ・スレッド  スレッドが並行に走行  並行とは 同時(並列)であるかも知れないし、時分割かも知れない 概念的な言葉  メモリ空間は、スレッド間で共有
  15. 15. 15 マルチ・スレッド BASIC  スレッド・コンテキスト  PC, StackPointer レジスタ (レジスタは2個のみ)  スタック: 独立した場所に確保  メモリ空間は、スレッド間で共有  全変数をスレッド間で共有
  16. 16. 16 マルチ・スレッド・インタープリタ マルチスレッド仮想機械 スケジューリング 命令デコード 命令 fork スレッド生成 命令 messsend命令 messwait メッセージを オブジェクトへ 送信 走行中スレッドを 待ち状態にし、 別なスレッドを アクティブにする 当該オブジェクトで 待っているスレッドが あったら 走行可能にする 通常命令 readyQの先頭に 新スレッドを追加 命令フェッチ RUN.実行開始
  17. 17. 17 マルチ・スレッド Tiny BASIC
  18. 18. 18 マルチ・スレッド BASIC 命令語  fork(行番号)  式を開始行番号として、threadを生成する  スレッドのプロセス番号を返す  end  メインスレッド(プロセス番号1)ならば、全スレッド停止  子供スレッドならば、そのスレッドのみが終了する  join ※未実装  スレッドの待ち合わせ  sleep 式  式の値で示された単位時間だけ、スレッドの実行を停止する
  19. 19. 19 マルチ・スレッド BASIC 命令語  messnew(式) 関数  メッセージ・オブジェクトを作る (式はダミー)  messwait 式1,式2  式1の値で示される番号のオブジェクトのメッセージを待つ  すでに、そのメッセージを待っているプロセスがあった場合は、待たずに抜 ける  式2でタイムアウト時間を指定  0番のオブジェクトは、キーボード入力  messread(式1) 関数  式1の値で指定されるメッセージ・オブジェクトから読み出し  messsend(式1,式2) 関数  式1の値で指定されるメッセージ・オブジェクトへ、式2の値をメッセージとし て送る  そのメッセージ・オブジェクトを待っているプロセスがあれば、プロセスは走 行可能になる
  20. 20. 20 マルチ・スレッド BASIC 命令語  lastwait(式) 関数  式の値で指定されるメッセージ・オブジェクトの待ちから抜けた 要因を返す  1: O_RES_RECV メッセージを受信した  -2: O_RES_TO タイムアウト  -3: O_RES_WAITING 現在も待ちプロセスがある(待ちは外れて いない)  -1: Error オブジェクトは未使用
  21. 21. 21 マルチ・スレッド BASIC 命令語  ps  スレッドのステータスを表示  kill 式 ※未実装  式の値で示されるスレッドを、終了させる
  22. 22. 22 マルチ・スレッド BASIC 実現について  割り込みを一切使用しない  キーボード割り込みを使用しない  タイマ割り込みを使用しない  内部時計  ハードウェアが無い場合: ソフトウェアのループ回数で、作る  当然、ゆらぎがある  RTC ハードウェアがある場合: スケジューリング前に、RTCを読み出す  正確  時間による、スレッド実行の打ち切りは無い  しかし、一命令ごとに、スケジューリングされる
  23. 23. 23 マルチ・スレッド BASIC 実現について  どうして、割り込みを使用しないか  おもしろい  割り込みで仕事をやることなんか飽きた  究極の移植性を追求  どんなハードウェアでも、ただのアプリケーション・ソフトウェアと同様な 移植性  完全に決定的  外乱(割り込み)による非決定性によるデバッグの困難さを排除(簡 単ということか?)  本当の実時間システムは割り込みを使わないことも多い  最悪時間を決定的に設計  割込みは、予測できない(それが本質)  割込み処理時間を、盛り込む? 割込み禁止(それでいいのか?)
  24. 24. 24 マルチ・スレッド BASIC 実現について  スレッドのスケジューリング  各命令の実行の直前でスケジュール  ready (走行可能)なスレッドがあれば、切り替える  ポリシーは、適当ラウンドロビン  現状は、少しぶれがある  messwaitで待ちに入ると ready queueから外れる  messsendが発行され、messwaitから出ると  走行可能になって、ready queueへつながる
  25. 25. 25 マルチ・スレッド BASIC 実現について  重要な構造体  プロセス構造体 struct process { int pid; int stat; struct process *pre; /* activeQueue, waitQueue */ struct process *next; /* activeQueue, waitQueue */ struct process *toPre; /* time out queue */ struct process *toNext; /* time out queue */ int to; /* time of timeout */ u_char *pc; int *stack; int sp; int lno; }; #define PROC struct process
  26. 26. 26 マルチ・スレッド BASIC 実現について  重要な構造体  オブジェクト構造体 struct object{ int id; int stat; PROC *proc; /* waiting process */ int value; }; #define OBJ struct object
  27. 27. 27 マルチ・スレッド BASIC 実現について 内部の重要な 待ち行列(キュー) readyQ obj[n].proc オブジェクトへのメッセージ待ち timeOutQ timeOutQへ つなぐときは、 タイムアウト時刻順で ソートする。時刻は内部時刻 100 500100 210 タイムアウト 時刻 proc[n]
  28. 28. 28 マルチ・スレッド BASIC 実現について  時刻  時刻は内部でのカウントが一定を越えたら1tick(単位時間) 内部時計を進める  タイムアウト  sleepと、messwaitは、timeoutQにつなぐ  内部時計を進めるときに、タイムアウトのチェックを行う
  29. 29. 29 マルチ・スレッド BASIC 実現について  オブジェクトを待ちつつ、タイムアウトも待つ  時刻は内部でのカウントが一定を越えたら1tick(単位時間)  タイムアウトは、内部時刻(時計)を1tick増加させるときに、チェック  timeoutQは、タイムアウト時刻順に並んでいるので、現在時刻より以 前の時刻で待っているスレッドは、すべてactiveQへつなぎ直す obj[n].proc オブジェクトへのメッセージ待ち timeoutQ timeoutQへ つなぐときは、 タイムアウト時刻順で ソートする。時刻は内部時刻 100 500100 210 タイムアウト 時刻 内部時刻が300になった時、これより前のスレッ ドは、すべて待ちから、readyQにつなぎ直す
  30. 30. 30 マルチ・スレッド BASIC  サイズ: 21KB弱 (IOルーチン、簡単なデモ含む)  通常Tiny BASICは16KB強程度(IOルーチンなど含む)  8080(8bit)用にアセンブラで記述すると2KBだったが…  32bit命令はやっぱり大きくなるなぁ…  マルチスレッド部分は適当なコーディング  めちゃくちゃとか、冗長ではないはずだが…  現在は、内部32bitポインタですべて管理  一応、x86(32bit,64bit)で高速に動作する様に書いた  本来は、8bit程度のオフセットで十分なはず  プロセス、オブジェクトは各々256個まででいいだろ(実メモリ無いし)
  31. 31. 31 プログラム例100 ?"start" :crlf 105 j=0 107 m=messnew(0): ? "messnew=":?m:crlf 110 ?fork(300):?fork(400):?fork(500):?fork(600) 120 ?"a":crlf 130 fori=1to500000:n. 150 ? messsend(m,j) : j=j+1 170 goto 120 180 end 300 ?" messwait ":crlf 310 messwait m,100 311 ?" Wakeup=":? lastwait(m):?" " 320 if lastwait(m)<0 ?"timeout ":crlf:goto 390 330 x=messread(m): ?$ x 390 goto 300 400 ?"kkk":crlf 420 messwait 0,-1 430 ?"K " 450 y=messread(0) 460 ?$ y 480 goto 400 500 sleep 100:?"asd" 510 ps 520 goto500 600 sleep 200:?"qwe" 610 ps 620 goto600
  32. 32. 32 実行結果M>>r. start messnew=1 2 messwait 3kkk 45 a asd Wakeup=-2pid, stat, PC, LNo, SP pre, next, toPre, toNext,to 0 2 0804C0DE 0 -1 080521CC 080521F8 00000000 00000000 0 1 2 0804F4FF 130 3 00000000 080521A0 00000000 00000000 0 2 2 0804F57C 311 -1 080521A0 00000000 00000000 0805227C 100 3 3 0804F5FB 420 -1 08051D40 080521A0 00000000 00000000 -1 4 1 0804F64B 510 -1 00000000 080521CC 00000000 080521F8 100 5 4 0804F666 600 -1 00000000 08052224 00000000 00000000 200 readyQ=1 0 2 current_time=100 idol_count=499996 toQ= 5:200 obj=0 proc=00000003 stat=2 obj=1 proc=FFFFFFFF stat=1 timeout messwait 0 Wakeup=1 a 00 messwait asdqwe Wakeup=-2pid, stat, PC, LNo, SP pre, next, toPre, toNext,to 0 2 0804C0DE 0 -1 0805227C 080521CC 00000000 00000000 0 1 2 0804F4FF 130 3 080521A0 080521F8 00000000 00000000 0 2 2 0804F57C 311 -1 080521CC 00000000 00000000 00000000 200 3 3 0804F5FB 420 -1 08051D40 080521A0 00000000 00000000 -1 4 1 0804F64B 510 -1 00000000 0805227C 00000000 080521F8 200 5 2 0804F673 610 -1 00000000 080521A0 00000000 08052250 200 readyQ=5 0 1 2 current_time=200 idol_count=999978 toQ= obj=0 proc=00000003 stat=2 obj=1 proc=FFFFFFFF stat=1 pid, stat, PC, LNo, SP pre, next, toPre, toNext,to 0 2 0804C0DE 0 -1 00000000 080521CC 00000000 00000000 0 1 2 0804F4FF 130 3 080521A0 080521F8 00000000 00000000 0 2 2 0804F57C 311 -1 080521CC 08052250 00000000 00000000 200 3 3 0804F5FB 420 -1 08051D40 080521A0 00000000 00000000 -1 4 2 0804F64D 510 -1 080521F8 00000000 00000000 080521F8 200 5 1 0804F673 610 -1 00000000 080521A0 00000000 08052250 200 readyQ=0 1 2 4 current_time=200 idol_count=999978 toQ= obj=0 proc=00000003 stat=2 obj=1 proc=FFFFFFFF stat=1 timeout messwait 0 Wakeup=1 a 01 messwait M>>
  33. 33. 33 おしまい

×