技術情報の提示

Download Report

Transcript 技術情報の提示

HandleIOにふれる
ヒント
プログラムは別途配布しています。
Copyright, 2010 © Scarly Hardware
HandleIOにできること
• HandleIOはパソコンからの信号入出力
(I/O)を簡易に行うことができます。
• FT245というUSBデバイスを制御できま
す
– パソコンからの信号出力をFT245に向けて行
うと、FT245は信号を8bit単位で出力してく
れます。
– 同様に、FT245からの入力もパソコンに向け
て(8bit単位で)送ってくれて、パソコンは信
号を取り込めます。
LEDをつないでみる
LCDをつないでみよう
LEDにつなぎ変えて信号の送
信パターンを見てもらおう
温度計を接続して温度を計測
Handleに関して
ウインドウハンドルという番
号
• ウインドウズでは一つ一つのウインド
ウに16進数で番号を振っている
• 各ウインドウの番号がわかると、ウイ
ンドウを操作することが可能となる。
HANDLELIST関数
• ウインドウハンドル一覧を表示する
ほかのウインドウにいたずら
してみよう
• ウインドウを半透明にしてみる(layer関
数)
• ウインドウのタイトルを書き換えてみ
る(sendtext関数)
• ウインドウの内容を書き換えてみる
(REPLACESEL関数)
HANDLEFIND関数
• ウインドウタイトル一覧からウインド
ウ名が一致するものをリストアップす
る
GETWINDOWHANDLE関数
• ウインドウハンドル(16進8桁)の番
号から、親子関係のウインドウ(ハン
ドル番号)などを取得する
SendText関数
• ほかのウインドウのタイトルテキスト
を書き換えるのに使用する
REPLACESEL関数
• エディタなどの文字列追記に使用する
BNCLICK関数
• ボタンを押したことにしてくれる関数
で、引数にボタンのハンドルを入力し
てあげる。
WhatTheTimeNow関数
• 現在時刻を取得、表示してくれる関数
時刻連動
• 何時になると何かをする
• 一時間おきに温度を計測する
• 14時00分の温度を(一日おきに)計測す
る
WAITTIME関数
• 特定の時刻までWAITしてくれる関数
• パラメータは秒 分 時の順に与える。
(分や時は書かなくてもよい)
• オルゴールの定時再生
(下記の場合には12:00分に鳴る)
WAVファイルでオルゴールを取り込ん
でおく必要性あり
– WAITTIME d’0 d’0 d‘12
– ♪ loop_5.wav
WAITPUMP関数
• 数ms~数分待ちたい場合に使用する
• 何らかの作業を順番に行うときに、一
旦停止していてほしいときがある。そ
のようなときに用いる関数
• 2000ms(2秒)待つ場合
• waitpump 2000
• お風呂タイマー/カップラーメンタイ
マー/キッチンタイマー
EXEC関数
• 別のプログラムを呼び出したい場合に
用いる
• exec notepad等
ここからは、時間に余裕があ
る場合に解説
64bit化とレガシーデバイス化
• パラレルポートはレガシーデバイス
• SCSI・ゲームポートはレガシーデバイス
• BEEP音を発する(8254経由)スピーカはレ
ガシーデバイス
32bit Windows と 64bit
Windows
• 一度に計算する(処理する)量が違う
さらに CPUのレジスタ数が増えた。
関数などを呼び出すときに、(関数の
パラメータをスタックに積まず、CPU
の レジスタ に書き込んで処理をする場
合がある→CPU有効利用によりプログ
ラムが高速実行される)
• 64bit Nativeな(64Bitシステム用に作
られた)プログラム 以外の32bitプログ
32bit Windows と 64bit
Windows
• HandleIOは32bit専用プログラムなの
で、正常に動作しない機能もある。
Beepをかけようと、 (HandleIO
を用いて)0x61番I/Oポートを操作し
てみると、64bit Windows上ではなか
なか思い通りに動かない。
• これは64bit windows7 ではセキュリ
ティが強化されている事が要因
• out h'61 b'00000011
• out h'61 b'00000000
セキュリティが強化されてい
る事による不具合
• 未署名なデバイスドライバは動作して
くれない(一時的に動かす方法はある)
• 一時的に動作させる場合にはF8キーを
押しながらブートする
64bit Win7では、I/Oの61h
をどう割り当てているのか
• マザーボード リソース
I/Oアクセス実験
• 64bit WINDOWS7から 0x61番ポート
を直接たたいてみる
– (セキュリティが影響しているらしく、一
瞬しかならない)
• 32bit WINDOWS XP(仮想マシン上)
から0x61番ポートをたたいてみる
BEEP音は64bit環境でも鳴る
のか
• BEEP関数を呼び出してみる
• BEEP関数は kernel32.dllに存在する
(さらにはntdll.dllを呼び出している)。
BEEP音は64bit環境でも鳴る
のか
• 参考文献:
http://cpplover.blogspot.com/2010/
01/windows-7beep.html
によると、
8254出力ラインは、サウンドカードの
専用入力につながってる
beepはもう、パソコンのスピーカーか
ら再生されている
レジスタ演算
• HandleIOは変数のない言語…
すべてはレジスタに記憶
• REG100/REG10等 一個のレジスタに
は32bitのデータを格納できる
• mov reg100 d’10
mov reg101 d’5
calc reg100 / reg101 reg102
dispd reg102
decz関数
• レジスタ -1を演算して結果が0の時
にはすぐしたの命令を飛ばして、次の
行に進む
•
•
•
•
•
•
•
•
mov reg100 5
mov reg200 1
l'loopstart
calc reg200 * d'10 reg200
decz reg100
jmp l'loopstart
l'finish
dispd reg200
HandleIOとプログラミング
• なぜプログラミングに話を持っていく
のか…
– プログラムを自分で書くと、発散の方向性
にむかう
– 応用性の高さ 色々な応用が利く
• 外部の状態を取り込んで何かをさせる
– 温度計をつないで、何度以下ならヒーター
スイッチOn
– CDS(光導電セル)をつないで、暗くなって
きたら自動で照明On
HandleIOの難しいところ
• アセンブラの考え方をベースにしてい
るため、使いこなすにはそれなりの知
識が必要。条件分岐などさせると、結
構ややこしくなる
クロージング
• 64bit化した、Nativeなアプリケーショ
ンにする必要性
• Handle一覧を表示するとき、64bitでは
2倍幅の一覧表示ができるはず
• レジスタも32ビットで1レジスタではな
く、64ビットで1レジスタとできるはず