2009年9月27日日曜日

外付けハードディスクにアクセスできない

USB接続の外付けハードディスクの1領域が、
マイコンピューター上において「ドライブ」(だっけ!?)として表示(認識)される。

アクセスすると「インページ操作の実行エラー」のメッセージ。

dos窓からchkdsk g: /f実行でアクセスできるようになった。



2009年9月24日木曜日

itune CDを認識しない

iTune9にバージョンアップしたらCDを認識しない(自動インポートの問い合わせ無し)。
レジストリ書き換え対処があるようだが見送り。
どうしようか考えて、なにげにiTune(タスクバー上)をクリックしたら、
自動インポートの問い合わせがきた。
しばらく様子見。

CDデバイスの認識に時間が掛かっているのか?
セキュリティーソフトとの問題か?

うまくいったと思ったら、
繰り返しインポート問い合わせ。インポートできず。。。再起動でtry。
再起動したらインポートできるようになった。



2009年9月16日水曜日

gdb(gdbserver)を使ったリモートCPUの共有ライブラリをデバッグする方法

【ビルドマシン】
 デバッグ用ビルド(-O0 -gオプション付きでコンパイル。)
 □libMyLibrary
 □chkcmd(ライブラリデバッグ用コマンド)


【ターゲットCPU】
 □ファイアウォール停止(繋がらなかったら、ビルド、ターゲットCPU両方で。)
  /etc/rc.d/init.d/iptables stop

 □デバッグ用ライブラリに差し替え。
  ファイルrelapce、またはlibMyLibrary.so→リンク先を変更。
  ※パーミッション注意 chmod a+rx libMyLibrary.so.1

 □GDBサーバー起動
  $ gdbserver ビルドマシン名:30000 chkcmd (ビルドマシン名はなくても良い!?)


【ビルドマシン】
 GDB起動 (emacs上で動かした方が便利。)
 $ gdb ./chkcmd

  (gdb) br main

  (gdb) target remote ターゲットCPU名(IPアドレス!?):30000

  (gdb) c

  (ブレークしたら、)

  (gdb) set solib-search-path /home/user/src/libMyLibrary
      (↑ライブラリビルドしたディレクトリへのパスを指定)
   ※↓表示される(他のエラーメッセージ無視)
    Reading symbols from /home/user/src/libMyLibrary/libMyLibrary.1...done.
    Loaded symbols for /home/user/src/libMyLibrary/libMyLibrary.1

  (gdb) br MyLibraryStartAPI ※取り敢えず適当なライブラリ関数にブレークポイント設定

  (gdb) c 後は自由に。



2009年9月15日火曜日

gdb

【バックトレース機能】
(gdb) bt
(gdb) thread apply all bt


【スタックフレーム操作】
(gdb) frame(現在のフレーム)
(gdb) frame 1(フレーム選択)
(gdb) up(フレーム移動:上へ)
(gdb) down(フレーム移動:下へ)
(gdb) i frame 1(詳細なスタックフレーム情報。infoコマンド)


(gdb) x/i $pc(プログラムの現在位置プログラムカウンタ)
(gdb) p $sp(現在のスタックポインタの位置(アドレス))
(gdb) i proc mapping(gdbがアタッチしているプロセスのメモリマップ)
コアダンプ解析の場合、
(gdb) info files
または
(gdb) info target


ulimit -s スタックサイズの表示
ulimit -Ss 81920 スタックサイズの変更
または、limit (a)


【よく使うもの】
backtrace コールトレース実行
br ブレークポイント設定
c コンティニュー
d 「ブレークポイント番号」 ブレークポイント解除
finish 関数終了まで実行
info b ブレークポイント表示
n 次の行まで実行
p 式(構造体、変数)を表示
run プログラム実行。引数も渡せる
s 次の行まで実行、関数呼び出しの場合その中へ
x メモリ内容表示???
until 指定行まで実行

【使うもの】
awatch 変数 指定した変数がRead(rwatch)/Write(watch)された場合に停止。
構造体表示を見やすく。set print pretty on


$fp フレームポインタレジスタ
$pc プログラムカウンタレジスタ
$ps プロセッサステータスレジスタ
$sp スタックポインタレジスタ



2009年9月5日土曜日

vxWorks 時間測定計測 vxTimeBaseGet vxTimeBaseSet

vxTimeBaseGetを使って時間測定計測する際に
vxTimeBaseSet(0,0)で上位下位32bitレジスタを初期化しないと
レジスタオーバーフローしてヘンテコな時間になる?

ラウンドするまで時間長いはずなので実質問題ない?
初期化やっとく分には問題ない。

vxTimeBaseSet(0,0); /* set the TBH and TBL registers to 0 */

taskDelay(rate*3600); /* suspend for 1 hour */

vxTimeBaseGet(&tbu,&tbl); /* read the TBH and TBL again */


#include <vxLib.h>

void testSysClockAccuracy(int rate)
{
UINT32 tbu, tbl, i;

printf("SysClkRate=%d\n", rate);
sysClkRateSet(rate);
taskDelay(2);

vxTimeBaseSet(0,0); /* set the TBH and TBL registers to 0 */
taskDelay(rate*3600); /* suspend for 1 hour */
vxTimeBaseGet(&tbu,&tbl); /* read the TBH and TBL again */

for(i=0; i < 3600;i++) /* Count down 3600 second from TBL and TBH (16500000 units for for 1 second) */
{ /* <TBL TBH> -= 3600*16500000; */
if (tbl < 16500000)
{
tbu--; /* borrow */
}
tbl -= 16500000;
}
printf("tbu diff =%x (%d) , tbl diff =%x (%d)", tbu, tbu,tbl, tbl);
/* print out the difference in TBL and TBH units */
}