http://decomo.info/wiki/" /> クソゲ〜製作所 - 2007年01月の日記

クソゲ~製作所

新システムに移行中:http://decomo.info/wiki/

« 2006年12月 | ホーム 2007年02月 »

2007年01月30日(火)

 

Hello, world

 

開発環境の構築も完了したところで、いよいよ「Hello, world」だ。


まずは作業用SDカード領域の確保。

  • ROMディスクから起動していることの確認
    [/SYS]% df
    PATH  DEV      TOTAL      FREE USED  UNIT MAXFILE NAME
    /SYS  rda       1829         0 100%  1024    256  PM:TBMX1
    
  • パーティションの確保
    [/SYS]% hdpart pcb
    pcb   [C:483  H:64  S:63  B:1953792 (954 MB)]
    No System    Boot   StartCHS      EndCHS         SecNo     SecCnt     Size
    1  13 ------  00     0:  0: 0     0:  0: 0           0          0     0 KB
    2  00 ------  00     0:  0: 0     0:  0: 0           0          0     0 KB
    3  00 ------  00     0:  0: 0     0:  0: 0           0          0     0 KB
    4  00 ------  00     0:  0: 0     0:  0: 0           0          0     0 KB
    ** Create/Delete/Boot/Edit/Quit ? c
    Create PartNo (1-4) ? 1
    Size [GB/MB/KB,All] (<201MB) ? 200M
    No System    Boot   StartCHS      EndCHS         SecNo     SecCnt     Size
    1  13 BTRON   00     0:  2: 4   101: 63:63         129     411135   200 MB
    2  00 ------  00     0:  0: 0     0:  0: 0           0          0     0 KB
    3  00 ------  00     0:  0: 0     0:  0: 0           0          0     0 KB
    4  00 ------  00     0:  0: 0     0:  0: 0           0          0     0 KB
    ** Create/Delete/Boot/Edit/Update/Quit ? b
    Boot PartNo (1-4,Clear) ? 1
    No System    Boot   StartCHS      EndCHS         SecNo     SecCnt     Size
    1  13 BTRON   80     0:  2: 4   101: 63:63         129     411135   200 MB
    2  00 ------  00     0:  0: 0     0:  0: 0           0          0     0 KB
    3  00 ------  00     0:  0: 0     0:  0: 0           0          0     0 KB
    4  00 ------  00     0:  0: 0     0:  0: 0           0          0     0 KB
    ** Create/Delete/Boot/Edit/Update/Quit ? u
    ** pcb: Updated Master Boot Block
    
  • パーティションのフォーマット
    [/SYS]% format -b pcb0 WORK
    Format pcb0 [STD] WORK
    Logical Formatting...
    Writing BootCode...
    Disk Format Success.
    
  • パーティションのマウント
    [/SYS]% att pcb0 pcb0
    pcb0 -> pcb0
    
  • システムファイルのコピー
    [/SYS]% cp -b -v -r * /pcb0
    copied: SBOOT
    copied: KERNEL.SYS
    copied: SYSCONF
    copied: DEVCONF
    copied: STARTUP.CMD
    copied: STARTUP.CLI
    copied: rsdrv
    copied: netdrv
    copied: unixemu
    copied: tcpipmgr
    copied: NETCONF
    copied: cli
    copied: .xcli
    copied: bin
    
  • パーティションのアンマウント
    [/SYS]% det pcb0
  • 再起動
    [/SYS]% # bd
  • SDカードからブートしているか確認
    [/SYS]% df                                                                      
    PATH  DEV      TOTAL      FREE USED  UNIT MAXFILE NAME                          
    /SYS  pcb0    205564    203312   1%  4096  17408  WORK  
    
    上記通りにやったのにもかかわらず、内蔵ROMディスク(rda)から起動するようならば、一度Teaboardの電源を落として(USBケーブルを抜いて)から起動すると、SDカードから起動すると思う。

次は、Hello, worldのコンパイル。

Teaboardで走るプログラムは「プロセスベース」と「T-Kernelベース」の2つに大別される。基本的にプログラムは、それぞれのベースに合わせたlocal/te/bapplとlocal/te/kappl以下で開発を行う。今回はプロセスベースのHello, worldを作成する。

  • ディレクトリ構成
    /opt/local/te/bappl
     /hello
      /src
      /tbmx1
    

    hello/srcにソースファイルを格納し、バイナリはhello/tbmx1に格納する。デフォルトのmakerulesでは、バイナリ格納用のディレクトリ名によって、ターゲットを自動的に切り替えるようになっいるっぽい。なので、基本的にはこのディレクトリ構成は変更しない方がいいと思われる。

  • hello.cの作成

    hello/srcにhello.cを作る。

    #include 
    
    int main(void)
    {
        printf("Hello, world¥n");
    
        return 0;
    }
    
  • Makefileの作成

    これもhello/srcに作る。

    include ../../etc/makerules
    VPATH = ../src
    hello: hello.o
    
  • make
    
    
Decomo 21:23 comment (2) trackback (0)

2007年01月23日(火)

 

クロスコンパイラのビルド

 

Teaboardの開発環境はgccで、CygwinとLinux用のクロスコンパイラが添付されている。これらgccは、当然Mac OS Xでは使用できない。幸い、開発環境再構築用のパッケージ一式が提供されているので、それを使ってOS X用のgccを構築する。

  • 準備

    以下のディレクトリ構成で作業を行う。各自の環境にあわせて、適宜読み替えて欲しい。尚、うちの環境では~/にusrディレクトリを作り、/optは~/usrへのシンボリックリンクとなっている。

    /opt
     /local
      /te
       te.tlsrc.arm.05.tar.gz 
       te.tlsrc.common.04.tar.gz
       te.resource.tbmx1.01.tar.gz
       /tool
        /build
        /gnu
         /distribution
          binutils-2.13.tar.bz2 
          gcc-3.2.2.tar.bz2 
          gdb-5.2.tar.gz 
    
  • 開発環境再構築用パッケージの展開
    cd /opt/local/te/
    tar zxvf te.tlsrc.arm.05.tar.gz 
    tar zxvf te.tlsrc.common.04.tar.gz
    tar zxvf te.resource.tbmx1.01.tar.gz 
    
  • binutilsの構築
    cd tool/build/gnu/binutils-2.13-tkernel/
    cp ../etc/makerules ../etc/makerules.unknown
    make BD=/opt/local/te TARGET=arm-unknown-tkernel extract patch-tkernel
    make BD=/opt/local/te TARGET=arm-unknown-tkernel clean configure make
    sudo make BD=/opt/local/te TARGET=arm-unknown-tkernel install
    
  • gccの構築
    cd /opt/local/te/
    sudo cp -R include tool/unknown/arm-unknown-tkernel/sys-include
    cd tool/build/gnu/gcc-3.2.2-tkernel/
    make BD=/opt/local/te TARGET=arm-unknown-tkernel extract patch-tkernel
    sudo make BD=/opt/local/te TARGET=arm-unknown-tkernel clean configure make
    sudo make BD=/opt/local/te TARGET=arm-unknown-tkernel install
    sudo rm -R /opt/local/te/tool/unknown/arm-unknown-tkernel/sys-include
    
  • gdbの構築

    make中に「gdb-5.2-tmonitor/gdb-5.2/gdb/arm-tdep.c:2692: error: label at end of compound statement」というエラーが出るので、当該箇所を予め修正しておく。

        case ELFOSABI_ARM:
          /* Assume GNU tools with the old APCS abi.  */
          return ARM_ABI_APCS;
    
        default:
    	; (この行を加える)
        }
    
    cd ../gdb-5.2-tmonitor/
    make BD=/opt/local/te TARGET=arum-unknown-tmonitor extract patch-tmonitor
    make BD=/opt/local/te TARGET=arm-unknown-tmonitor clean configure make
    sudo make BD=/opt/local/te TARGET=arm-unknown-tmonitor install
    
  • makerulesの編集

    /opt/local/te/bappl/makerulesと/opt/local/te/kappl/makerulesの「開発環境のベースディレクトリ」を編集する。

    ifndef BD
      # 開発環境のベースディレクトリ
      BD := /opt/local/te
    endif
    

Decomo 23:32 comment (0) trackback (0)

2007年01月21日(日)

 

とりあえず繋いでみる

 
20070121-01.png

学校で、先生にTeaboard/ARM920-MX1押し付けられた貸して頂いた。折角だからと、うちのWindows 2000マシンに繋いでみたが、ドライバがはいらねーんですよ、これが。対応OSはWindows XP/Linuxだから、2000で使えなくたって文句は言えない。

Linuxに対応してるんなら、同じUNIX系のOSであるMac OS Xでも行けるだろうと、繋いでみた。そして、あっさりと認識。流石はUNIX。デバイススペシャルファイル名はcu.usbmodem5B2131だった。

次に、ZTermというシリアル通信ソフトで、認識されたTeaboardに接続。これまたあっさりと成功。特に設定などは弄る必要はなかった。

さて、次は開発環境の構築だ。


P.S. Terminalでシリアル通信を行う方法がわからない。「ftp hoge.com」みたいな感じで、シリアル端末に接続・通信を行う方法はないんだろうか…?

Decomo 14:29 comment (2) trackback (0)

2007年01月12日(金)

 

多言語ロケールの憂鬱

 
http://decomo.info/wiki/blog/2007/2007-01-12に移動しました。

Mac OS Xは、本格的に多言語ロケールに対応した、(恐らく世界初の)OSだ。これが意味するところは、世界中の様々な言語ならびに地域文化(例えば「暦」や「年号」「通過単位」など)を、実に優雅にシームレスに扱えるということだ。

[システム環境設定]-[言語環境]で、言語を英語にすれば、OSの各種メニュー・メッセージは英語表記になるし、他の言語を選べばその言語表記になる。また、一般アプリケーションも対応するロケール情報さえ持っていれば、システム環境にあわせた言語表記になる。某OSの一般の多言語対応アプリケーションのように、メニューの言語一覧から、表示に使う言語を選ぶ必要などない。

なので、英語の勉強もかねて、うちのMac OS Xは今、英語ロケールで地域文化は日本という設定になっている。

このロケールの仕組みは、(かなり単純なものではあるが)先進的でアンビリーバブルなだけに、一般アプリケーションの対応は、まだまだ今一つという感じだ。

実際、英語ロケールで使っていると、様々な不具合に遭遇する。


まずはiTunes。これは昨日の日記に書いた通り。

次にMicrosoft Messenger。こいつは、ロケールによって、ソフトの設定や会話ログの設定先が違う(具体的には、ディレクトリ名が違う)。そのため、ロケールを切り替える度に一部設定が初期化されていたり、会話ログがロケール単位でしか管理できなかったりと、不便。

そしてFlash Player。全角文字が化ける時がある。発現条件は不明。ブラウザのロケール設定を日本語にしても化けるので、Flash Playerのロケールはブラウザのそれとは独立してるっぽい。まぁ、大体のFlashは化ける事なく表示されるので、今のところはそんなに難儀はしてないけど。


……とまぁ、現在わかってる不具合はこんなもの。話に聞くところ、Javaのコンパイルで日本語が通らなくなったりもするとか。

折角、OS自体は多言語環境に対応してるのに、肝心のアプリがこれじゃなぁ…。

Decomo 00:36 comment (4) trackback (0)

2007年01月11日(木)

 

iTunes小ネタ

 
http://decomo.info/wiki/blog/2007/2007-01-11に移動しました。
システム設定の言語環境を英語にして、曲を再生したら曲情報が文字化けした!

ID3タグの処理の問題(?)で、日本語ロケール以外で起動させると文字化けが発生するらしい。

iTunes.appを右クリックメニューの「情報をみる」で開き、「言語」ってところで「Japanese」以外のチェックを外せば、無条件で日本語ロケールで起動させることができる。これで解決。これはiTuensに限った事じゃなく、多言語ロケールを持つ他のアプリケーションにも応用可能。個人的には、iTunesは英語ロケールの方がフォントがカッコイイ&見やすいんだよね。日本語ロケールでも昔は見やすかったのに、なんでヒラギノで表示するようにしちゃったんだよ……。

曲情報を編集したのに、反映されない!再生すると変更前の曲情報に戻ってる!!(MP3限定?)

「ID3タグを変換」で、「ID3タグバージョン」を「なし」に一旦[OK]。その後、改めてタグバージョンを設定する。されば編集した情報が反映されるようになるであろう。

曲名の頭に付いてるチェックボックス、1つずつ設定するのが面倒だ!

⌘+左クリックでチェックボックスを押すと、一括してON/OFFを切り替えられる。

切り替えはプレイリストウィンドウ単位で行われ、任意に選択した曲単位での切り替えは出来ない。どうしても任意の曲単位で操作したい場合は、検索やスマートプレイリストで上手い事絞り込むしかない。

「ライブラリを書き出し」で書き出したファイルには「再生回数」情報も入ってるのに、「読み込み」で考慮されないのはなぜ!?

最近のバージョン(少なくとも7)では考慮されるようになった模様。

Decomo 01:22 comment (0) trackback (0)

2007年01月07日(日)

 

バイトオーダーの変換(バイトスワップ)

 
http://decomo.info/wiki/programming/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%81%AE%E5%A4%89%E6%8F%9B_%E3%83%90%E3%82%A4%E3%83%88%E3%82%B9%E3%83%AF%E3%83%83%E3%83%97に移動しました。

バイナリデータを扱うプログラムを書く上で、避けて通る事の出来ないバイトオーダーの問題。

結構頻出な問題だと思うのだが、軽くググってみただけではまとまった解説が見つからなかったので、自分用も兼ねてここにまとめて見る。

バイトオーダーとは何ぞや

バイトオーダーとは、多バイトデータをメモリ上に配置する際の方法のことで、エンディアンやエンディアンネスとも呼ばれる。

バイトオーダーはコンピュータごと(より正確にはCPUごと)に異なり、現在ではx86系で使用されるリトルエンディアン(LE)と、PowerPC/MC68000/SPARCなどで使用されるビッグエンディアン(BE)の2つに大別される。厳密にはPowerPCはG5だけがBEなCPUで、G4まではLEとBEの両方に対応したバイエンディアンCPUである。しかしながらLEで使われているPowerPCというのは聞いた事がないので、ここでは簡単化のためBE CPUとして扱う。

例えば「0x1234CDEF」という4byteのデータのメモリ配置は、LE/BEでそれぞれ以下のようになる。

メモリ番地LEBE
0001EF12
0002CD34
000334CD
000412EF

つまり、LEの方はデータの後ろからメモリに格納して行き、BEはデータの並び順にメモリに格納して行く。人間から見れば、データが正順に格納されるBEの方が分かりやすいが、コンピュータ的にはLEの方が処理しやすいらしい。

バイトオーダーの問題

次に、上に書いたLEのメモリ番地0〜4の内容をそのままファイルに書き出したとしよう(つまりデータの保存)。ファイルの内容は「EFCD3412」となるはずだ。

今度は、そのファイルからメモリ内容を復元する事を考える(データの読み込み)。

LEの環境で作ったファイルなのだから、LE環境で読み込めば、当然元のデータである「0x1234CDEF」が得られるが、BE環境ではそうは行かない。現在のメモリ内でのデータの並びは「EF CD 34 12」であり、BEはデータを正順に格納して行く事から、この並びから得られるデータは「0xEFCD3412」となってしまう。

このように、保存元のエンディアンと読込み先のエンディアンが異なれば、保存時に意図したデータとは異なるデータになってしまう。これがバイトオーダーの問題である。

バイトオーダーの変換(バイトスワップ)

異なるエンディアン環境のデータを正しく読み込むには、データの並び順を変えてやらなければならない。これがバイトスワップである。

先の例であれば、ファイルからデータを読む込む際に、1バイト目のデータ(0xEF)を4バイト目に配置、2バイト目のデータ(0xCD)を3バイト目に配置……という処理をしてやればよい。この処理を行ってくれるC言語のマクロは、以下のようになる。尚、int型は32ビット、short型は16ビットの幅を持つものと仮定している。

#define BS_BYTE1(x) (  x        & 0xFF )
#define BS_BYTE2(x) ( (x >>  8) & 0xFF )
#define BS_BYTE3(x) ( (x >> 16) & 0xFF )
#define BS_BYTE4(x) ( (x >> 24) & 0xFF )

#define BS_INT16(x) ( (unsigned short)(BS_BYTE1(x)<<8 | BS_BYTE2(x)) )
#define BS_INT32(x) ( BS_BYTE1(x)<<24 | BS_BYTE2(x)<<16 | BS_BYTE3(x)<<8 | BS_BYTE4(x) )

BS_INT16(x)が2バイトデータのバイトスワップを、BS_INT32(x)が4バイトデータのバイトスワップを行うマクロである。つまり、BS_INT32(0xEFCD3412)とすれば、0x1234CDEFというデータを得る事ができる。

動作原理を見て見よう。

まず、BS_BYTEn(x)のマクロで、右シフトと論理積を使いデータ列から1バイトずつデータを得る。そして、得たデータを左シフトし論理和を取る事でバイトオーダーの変換を行っている。具体的な動作例は以下を参考されたい。

■BS_BYTEn(x)の動作。
[1バイト目]
     1110 1111 1100 1101 0011 0100 0001 0010 (元データ0xEDCD3412)
AND) 0000 0000 0000 0000 0000 0000 1111 1111 (0xFFで論理積を取る)
--------------------------------------------
     0000 0000 0000 0000 0000 0000 0001 0010 → 0x12 (得られるデータ)

[2バイト目]
     1110 1111 1100 1101 0011 0100 0001 0010 (元データ0xEDCD3412)
>>8= 0000 0000 1110 1111 1100 1101 0011 0100 (8ビット右シフトする)
AND) 0000 0000 0000 0000 0000 0000 1111 1111 (0xFFで論理積を取る)
--------------------------------------------
     0000 0000 0000 0000 0000 0000 0011 0100 → 0x34 (得られるデータ)

同様に3,4バイト目もそれぞれ16,24ビット右シフトしてデータを得る。

■BS_INT16(x)の動作
BS_BYTE1(x) << 8= 0000 0000 0000 0000 0001 0010 0000 0000 (0x12を8ビット左シフト)
BS_BYTE2(x)   OR) 0000 0000 0000 0000 0000 0000 0011 0100 (0x34と論理和を取る)
---------------------------------------------------------
                  0000 0000 0000 0000 0001 0010 0011 0100 → 0x1234
unsigned short  = 0001 0010 0011 0100 (unsigned shortでキャストして2バイトのデータにする)

BS_INT32(x)も、シフトの数と論理積の段数が増えるだけで、動作原理は同じである。

この原理を用いれば、どんな多バイトデータでもエンディアンの変換を行うことができる。変換の方向は関係なく、BEなデータを与えればLEのデータになるし、その逆もまた然りだ。

最後に、本稿を試読してくれた魔犬タソに感謝致します。

Decomo 21:58 comment (0) trackback (1)

2007年01月03日(水)

 

謹賀新年

 
http://decomo.info/wiki/blog/2007/2007-01-03に移動しました。

明けましておめでとうございます。

例によって、名実共に更新頻度の低いサイトですが、本年もご愛顧のほど宜しくお願いいたします。


さしあたっての目標。

  • PSSAudioRipperの完成(1月中)。
  • KbMedia Playerのようなプレーヤソフトを作る(~3月)。
Decomo 21:38 comment (2) trackback (0)