仕事

ISE9.1

ISE9.1がTclのエラーを吐いて落ちる。勘弁してくれ。
一度終了して、再度実行すると不思議なことにエラーは出ず無事論理合成終了。なんじゃこりゃ。

苦戦。

原因不明のエラーに悩まされる。
未だ不明。ずっと転けてるならよいのですが、時間によって転けたり転けなかったり。
機械の熱?、んなばかな…。*1ということでひたすらパターンを変えて回路側は論理合成。ソフト側はコンパイル。
途中で無意識に作業をしてしまい。

「あれ?どこまでやったんだっけ?」

を数度繰り返す。情けない。

*1:私の頭が熱暴走という噂もある。

ハード屋さん

すっかり最近(なんちゃって)ハード屋さん。VHDLにも頭と目が慣れてきました。
FIFOの制御なんぞ、かなり久しぶりにやった気がする。

外勤とか戻ったりとか

お日様が出ている間は都内で外勤。
久しぶりに都心のビル群を見たが、あいかわらず何度見ても圧倒される。
あの辺りで普通に働いている人に取っては何ともない景色なんだろうけど、あれは結構強烈な絵だと思う。

if文

いろんなif文。

PHPの場合。

if(is_null($value)){
die("ERROR");
}
else if(is_array($value))${
print_r($value);
}
else{
print $value;
}

BASICの場合。*1

PRINT " Are you ready? (y/n)"
DO
key$ = INKEY$
LOOP UNTIL key$ <> ""
IF key$ = "Y" OR key$ = "y" THEN
CLS
PRINT "START PROGRAM."
INPUT "What's your name?";
END IF

QuickBASICを書いたのは当時中学生。かの昔のことなので忘れてしまいました。
当時はマウスでボタンを置いて、イベントを作ってという時代ではなかった。
ちなみに一番最初に作ったのはRANDOMIZE TIMERを使って作る数当てゲームだった気がする。
あと、技術の授業用にブロック崩しのゲームを作った(or サンプルを改造した)記憶もある。

VHDLの場合。

process( CLK, RST )
begin
if RST = '1' then
r_counter <= "000000000";
elsif CLK'event and CLK = '1' then
r_counter <= r_counter + "000000001";
end if;
end process;

「elsif」ってのがしっくり来ないんだな。と言ってみる。*2

*1:私がBASICと書く場合、VBでなく、MS-DOSのQuickBASICをさす…。

*2:SyntaxErrorで怒られても頭が切り替わってないと気づかない…。

テンパっております。

VisualC++のワーカースレッドからメンバ変数へアクセスする方法

web上にもあちこちで掲載されてはいますが…。

ダイアログアプリケーションとかでワーカースレッドを走らせて*1スレッド内でダイアログ内の部品を更新させる処理を行う場合。
ワーカースレッドを呼び出す際に次の様に書く。

AfxBeginThread(ThreadPrcs, this);

これで、呼ばれるThreadPrcs関数はおそらく次の様な形になる。
例えば、ダイアログがCFooDlgというクラスで定義されていた場合、

UINT ThreadPrcs(LPVOID p)
{
CFooDlg* pDlg = (CFooDlg*)(p);
CString strTxt;
for(int count=0; count<100; count++){
Sleep(3000);                               // ものすごく重い処理。
strTxt.Format("%d回目の重い処理", count);
pDlg->m_strMessage = strTxt;
}
}

これでメンバ変数にアクセスでき、変数を更新することが出来る。

*1:そもそも、コレが余り好ましくない実装方法なのかもしれないが

左にVisualC++, 右にISEとvim。中身はVHDL
左は順次、右は並列。
そして、VHDLの書き方を忘れていた。

s_signal(4 downto 1) <= (others => '0');

なんか、ますますジェネラル具合が激しすぎて少し嫌な感じ。

明日から大きく方向転換の予定。