June 04, 2007

RubyによるHEXフォーマットの読み書き

組込み系の開発をしているとROMにデータを書き込むためのバイナリを扱うことになりますが、そのフォーマットの一つにHEXフォーマット(正式名称?)というのがあります。バイナリを0からFまでの16進文字で表したものなのですが、モトローラ仕様とインテル仕様、2つのものがあります。その相互変換をしたいなと思ったのですが、せっかくなのでRubyで組んでみることにしました。

hex_binary_format.rbライブラリを公開します。使い方はHexBinaryFormat.readとHexBinaryFormat.writeを適当に呼べばなんとかなる(笑)と思います。

参考にしたのは、Googleで『HEXフォーマット』をキーワードに検索して引っかかった『HEXファイルフォーマット』『ROM化ファイルについて』のページです。作成にあたってはRubyのArrayを活用していますが、インデックスが現在のサイズを超えている場合に自動的にnilで埋めてくれる機能が非常に便利でした。

C++でHEX形式を読み込むローダを作ったりもしています。

00:02 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (2) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/570

June 10, 2007

USBでMSD+CDC (Composite Device)

このサイトで扱っているGPSロガーオートパイロットシステムSuper Sylphideには、USBが内蔵されたC8051F340というマイコンを搭載しています。これまではそれらに搭載されたSDカードの読み書きをPCから行うためにUSBを利用してきました。その際に実装として利用してきた規格がUSBのMass Strage Class(MSD)なのですが、今後はPCと双方向でやりとりできるコンソール機能をCommunication Device Class(CDC)という規格を利用して付け足したいと考えています。USB規格の詳細は本家usb.orgにまとめられています。
CDCはMSDと同じく、Windowsなどの一般的なOSでは標準ドライバが用意されているため、特別にドライバを開発する必要がありません(細かい話をすればWindowsではinfが必要になるようですが)。また、PC側では仮想COMポートとして認識されるので、PC側から制御するためのコードも非常に書きやすいようです(WindowsだったらWriteFile/ReadFile)。

そういうわけでMSDとCDCの両機能をもつファームウェアの製作を考えているのですが、ただ単純に足してできるものなのか疑問を感じていました。USBの規格に則ってファームウェアを作成する際にはDescriptorというものを書くのですが、それは大きく分けて階層順にDevice、Interface、Endpointの3つがあります。この階層が曲者で、MSDはInterfaceレベルで定義されているのに対し、CDCはDeviceで定義されているため疑問を感じていました(図1)。

CDC_MSD_1.gif
図1。

調べてみると、そのような議論がMicrochip(PICのメーカ)のフォーラムでされていた("USB Composite Device Operation")ので、そこでの議論をまとめて図にしてみました(図2)。どうやらより大きな階層のDeviceで定義されているCDCに、より下の階層であるInterfaceで定義されているMSDを取り込めばよいようです(1)。あるいは新たに設けられたInterface Association Descriptor(IAD)という機能(詳しくはusb.org内のPDF)を使って、Interfaceの階層でDeviceの定義をすることによって解決することもできるようです(2)。

CDC_MSD_2.gif
図2。

実装はこれからといったところですが、疑問が解消されてよかったです。

※その後、WIndowsでMSD+CDCを試しました。それに伴い図2に不備があることがわかりましたので、修正しました。

19:17 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/571

June 14, 2007

epsをまとめてPDFにするRubyスクリプト

表題のとおりの内容です。最近epsで作ったグラフが氾濫するようになりました。この管理方法について頭を悩ませているところです。というのも細かな違いしかないファイルが大量に生産されている故で、これではコンピュータ上で表示されるサムネイルによって中身を完全に把握することができません。
大きな違いがあるものでしたらサムネイルによって確認ということも可能、あるいは小さな違いしかないファイルでも、epsではなくより一般的なjpegやgif、bmp画像でしたら、便利なビューワがいたるところで開発されているので、それを利用すれば何とかなるかもしれません。しかしepsとなると、画質への執着、あるいは職業上の理由でもない限りは使う機会がないと思いますので、なかなか便利な方法が見つかりませんでした。

そこでレガシーですが、紙にepsファイルを一覧を印刷することにしました。手動でやっていたのでは『楽をするために一層苦労をする』というポリシーに反しますので、当然Rubyで自動化します。せっかくなのでTeXとdvipdfmxの協力も得てPDFにすることにしました。

できたスクリプトはfigures2pdf.rbです。実行時ディレクトリにあるepsファイルを全て取り込み、TeXファイルの生成、その後dvipdfmxによってPDF化されます。元の雛形となるTeXファイルはスクリプト内に内蔵しており、これを改造することでお好みのフォーマットで一覧を作れると思います。そのままでは横に2列でグラフが表示されます。また利用に当たってはRubyの用意は当然のこと、platexとdvipdfmxにパスを通しておく必要があります。

これでepsで綺麗なグラフを心置きなく製造できるようになりました。グラフの内容はともかくとして(笑)。

23:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/572

June 18, 2007

Super Sylphide 進捗状況(5) -- DSP基板データ公開

オートパイロットシステム Super Sylphideですが、メインとなるDSP基板の動作確認がほぼ完了したので、そのDSP基板データを公開します。

動作確認の工程ですが、以下の手順を踏みました。

  1. Code Composer Studio(CCS)のgelファイルを使ってJTAG経由でレジスタを操作し、動作クロックを決定するPLLなどの内部ユニットを設定。その結果が反映されているかオシロで確認した。
  2. 同様に外部メモリであるSDRAMやFlash ROMへのインターフェイスをgelファイルで設定し、メモリウィンドウで読込みができるか確認した。
  3. 内部のレジスタの設定や単純に変数のカウントアップのみを行う単純なプログラムをロード、実行し、所定の動作をしているかデバック機能で確認した。

ということで外部のSDRAMやFlash ROMも含めてほぼ動作確認がとれました。
上記の工程ででてくるgelファイルというものですが、これはC言語ライクなスクリプトを書くことによってレジスタの初期化などが簡単にできるようになっている代物です。また、開発環境であるCCSと統合されているので、リセットなどの定型処理をgelを用いてメニュー化することもできるので便利です。プログラムをROM化する際は、gelで行った初期化処理等をCで書き直す必要があるのですが(コンバータを作ろうと思えばできないこともないのでは?)、gelがC言語ライクなこともあるのでそれ程迷わないと思います。

次はFlash ROMを書き込むツールであるFlashBurnを利用して、Flash ROM書込みができるか検証を行う予定です。FlashBurnはもともと純正のDSP Starter Kit(DSK)での利用を考えて作られているため、今回のようにオリジナル基板ではROM書込みの方法が定義されているターゲット側のプログラム調整を必要があります。しかしこの基板はDSK6713と利用している部品はほぼ同じなので、こちらも難なく成功する予定です。
なおDSK6713に付属していたFlash Burnは古い(バージョンが2.80)ため、CCS 3.3ではインストールが不可能でした。これはFlashBurn開発元のSoftware Design Solutionsにある新しいFlashBurn(3.11)を利用すれば解消するようです。

※その後、配線を改善した新モデルを作りました。
※※DSPの開発が進みつつあります。その過程で上記のgelファイルによる動作確認がとれました。現在使用中のgelファイルを公開します。

23:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/573

June 21, 2007

Rubyでメールの仕分け

とある事情で大量のメールの仕分けをする必要がでてきました。仕分けといってもメーラーによって行われる単純なルール(例えばアドレスがhogeだったらadaフォルダに保存する)で解決できればよかったのですが、本文中に含まれる50個程度の指定語句(5から6桁の数字)に従って仕分けを行うという作業です。
メールの数はおよそ500通。ルールを50回も入力するのは少し面倒です。また人力で仕分けした場合は、一通あたり30秒だとして約4時間のかったるい作業になります。そういうことならプログラムを書いてしまったほうが効率がいいような気がしてきました。というかこれは後付の理由で、メールを処理するプログラムを書いてみたくなっただけです(笑)。

ブツは例によってRubyでこしらえることにします。メールを扱うRubyのライブラリがないか探してみると、TMailというのが様々なメール形式に対応しているようで使いやすそうなので、これを利用することにしました。

TMailですが非常に細かいところまで気が配られていて、1通ごとのメールのヘッダや本文、添付ファイルの処理だけではなく、メールをまとめて管理する枠組みであるメールボックスについてもUNIX系のqmailやMaildir形式に対応しているようです。ただし今回、対象となるメールはすべてM$謹製のOutlook Expressで保存されたメールでしたので、直接メールボックスのままTMailでメールを扱うことができませんでした。しかしOutlook Expressのメールをドラックアンドドロップでウィンドウ外に保存すると、実はTMailでも対応しているMh形式の1通ごとのメールになりますので、あとはこれを処理して目標を達成しました。

TMailの使い方ですが、以下のような感じでコードを書くと、色々とメールの処理が行えます。

require 'tmail'
require 'nkf'

mail = TMail::Mail::load('from_outlook_express.eml')

# 件名の取得
subject = NKF::nkf('-s', mail.subject) rescue nil

# 本文の取得
body = nil
if mail.multipart? then
    mail.parts.each{|part|
        if part.content_type =~ /text/ &&
                part.disposition !~ /(?:attachment|inline)/ then
            begin
                body = NKF::nkf('-s', part.body)
                break
            rescue
            end
        end
    }
else
    body = NKF::nkf('-s', mail.body) rescue nil
end

作ったスクリプトはmail_sorter.rbです。こちらも参考にどうぞ。

15:56 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/574

June 26, 2007

土合~谷川岳~土樽

日本で一番深い駅、土合から谷川岳の山頂へ。その後、土樽へ下山し、越後湯沢で風呂に入ってリフレッシュしてきました。

doai.JPG
土合駅の下りホームから。撮影はG-shock携帯のW42CA

tanigawa.JPG
谷川岳は双耳峰。トマの耳は低い方。同じくW42CA。

久しぶりの山だったので、足がかなりキています(笑)。それどころかRolleiやPentax持って行かなかった時点でヘタレ決定です。

23:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | コメント (0) | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/575