« 2007年9月 | トップページ | 2007年11月 »

2007年10月の8件の記事

2007.10.28

アセンブラ関数でソフトUART

昨日書いた通り、WinAVR(AVR用GNU Cコンパイラ)やってます。

実はWinAVRには標準でUART関数がありません。多分。

ハードウェアUARTを持っているAVRであればI/Oレジスタ叩くだけでいいのでCでも簡単に実装できそうですが、私が主に使っているTiny系ではハードウェアUARTは無い物がほとんどです。
(AT90S2313やATTiny2313にはハードウェアUARTがありますが、izCORE2.0メインプロセッサとして必須要件として考えているADコンバータがありませんし、UARTも複数系統使いたいですし。)

仕方ないので汎用I/Oポートをソフトウェア制御してシリアル通信をしてやる必要があります。
これまでは主にアセンブラでやっていたので、Atmelが公開しているアプリケーションノート(AVR305: Half Duplex Compact Software UART)を参考にソフトウェアUARTを実装していましたが、高速になればなるほど(115.2kbpsとか)、通信パルス幅が10MHzの1クロック分程度の誤差で通信できなくなってしまいます。

アセンブラであれば、実行命令時間を正確に計算することが出来るので調整がきくのですが、Cだとコンパイラ任せなのでそうもいきません。

数命令程度ならまだしも、全部をインラインアセンブラでやるのはかなり大変そうだと思いましたが、調べてみるとWinAVRにはアセンブラ関数という機能があるようで、アセンブラソースを別に書いといて、それを関数として使用することが出来るようでした。

試してみると、マクロ命令系を除いて、これまで使用していたソースコードをほとんど変えることなく使用することができました。

これでフツーにCの関数としてUART通信を実行出来るようになりました。

確認したところではATTiny26 10MHz駆動時、クロック単位の微調整は要りますが、PCのUSBシリアル変換に対して230.4kbpsまではいけました。
460.8kbpsは駄目でしたが、PC側の規格速度に拘らず、10MHzのAVR同士でこのソフトUART同士なら600kbps~2Mbps位でもいけると思います。

このソフトUARTで出来るのは1バイト送受信ですが、こいつがCの関数と同様に扱えるので、C上で文字列送受信の関数もついでに実装してみました。

なるほど。これはかなり快適です。
アセンブラだとこういうのは苦手だから。

あとはMMCアクセス関連とADC関連を移植すれば要素部品は完了。

でも、やっぱりこうなるとこの構想ではメインプロセッサはATTiny26でしたが、RAM128バイト程度では明らかにメモリが足りなさそうです。

アセンブラだとなんとかやりくりできるかなって感じだったのですが、コンパイラ任せだとスタックや変数領域にどれだけ使うか分からないので、やはりATTiny861(RAM512バイト)かな。
前はどこにも売ってなかった(見つからなかった)けど、最近はこちらで入手可能なようだし。

Mega系を使わない理由は、単に物理的に大きいからです。
DIP品でないと手配線できないし。

ああ、DIPタイプ20ピン以下のMegaがあればいいのに...
(ラインナップ的にそれはTinyだろ!ってのはナシのことで。)

WinAVR(AVR-GCC)におけるアセンブラ関数の作り方は、以下ページを参考にしました。

AVR Wikiavrgccでアセンブラを使う
ChaNさんアセンブラ関数の書き方(avr-gcc)

感謝。

| | コメント (0)

2007.10.27

AVR再入門

ここ1年ほどはマイコンプログラムから遠ざかってていろいろ忘れているため、izCORE2.0を作成するにあたって、AVRをもう一度勉強しなおします。

これまでのizCOREはほとんどアセンブラ+一部BASIC(MCS社のBASCOM試用版)でやっていたのですが、今度はCも使ってみたいと思います。

AVRでCを使う場合、商用のコンパイラもありますが、GNU の AVR用のGCCもありますのでそれが使えます。

AVR版のGCCはWinAVRという名称でこちらから入手できます。

これをインストールすると、Atmelの統合開発環境AVR Studio4と連携することができ、面倒なmakeファイル作りなんかも自動でやってくれるので便利です。

で、早速試してみました。

Tiny26(10MHz駆動)のPA7にLEDをつないで点滅させるだけ。
プログラムはこんなの。
Robo20071027_2_3 →テキスト版のソース(S-JIS)


...うーん点滅しません。
いや、目がついていかないほど高速に点滅してるのか?
ウェイトはいい加減だけどチカチカが見えるほどには入れてるはずなんだけど...

いろいろ試してたら分かりました。
コンパイラオプションの最適化切ったら点滅しました。

WinAVRの最適化オプションは5段階(O0,O1,O2,O3,OS)あり、O0が最適化無し。OSが最大のようで、デフォルトではOSです。
実際コンパイラが出力するlssファイル(C→マシンコードの展開図みたいなの)を見てみると、
最適化しない場合(O0)はwait関数のfor文のループがすべて展開されているのに対して、O1以上では、forの痕跡すらなく、いきなりret となっています。
さらに O3以上だとメインルーチンからコールすらしていません。

早い話、オプティマイザが、「空ループは意味がない」とみなしてwait関数のforは展開せず、さらにはO3以上では「wait関数は呼ぶ必要がない」と判断したようです。

また、O0(最適化無し)の場合でも、forループが展開された部分は、想像以上に大量のマシンコードを吐いているため思ったより処理時間食ってるようで、どのくらいのループでどれくらいの時間がかかるのかが予想がしにくいです。

WinAVRの標準のライブラリには汎用IOを使ったソフトウェアUART関数がないため、自前で実装(orどっかから調達)する必要があるのですが、高速通信なんかで精密なタイミングが必要なときには注意が必要そうです。

これまではアセンブラでクロック単位で計算してウェイトかけたりしてたのですが、Cでやる場合にも正確なタイミングが欲しいときにはアセンブラでサブルーチン書いといてそれを呼ぶといったことが必要そうです。(といっても関数呼び出しのオーバヘッドがどのくらいあるのか分からない...)

タイマ割り込み使う場合でも、割り込みのジャンプのオーバヘッドがどのくらいか、コンパイルして吐き出したマシンコード見てみないと分からないかな。
多分レジスタ退避とかやってるだろうし、どれだけのレジスタを使ってるかも最適化オプションによって変わるだろうからコンパイラ通さないと分からないし。

高度な演算や複雑なロジックをまわす場合、高級言語を使うメリットは大きいのですが、シビアなタイミング制御等には弱そうです。

この辺、Cでやってるみなさんはどうしてるんでしょう?


上のソースをコンパイルしたときに出力されたlssファイルです。
最適化 O0の時 OSの時
(どちらもSJISです。文字化けするようならブラウザの設定を変えてください。)

| | コメント (2)

2007.10.24

PLC届いた

帰ったら届いてました。早っ。
Robo20071023_1日曜日の夜に申し込んだので2日ほどですね。
物は松下のやつですが、型番も外見もこれとはちょっと違うようです。
eo光スペシャルでしょうか?
といっても、背面やボタン位置などは同じなので外装が違うだけっぽいですが。

と思ったら、アイオーデータのこれとは外見も同じですね。
アイオーは松下のOEM受けてたんですね。

さっそく繋いでみました。
設定も簡単。
親機・子機をコンセントに繋いで同時に設定ボタンを押すだけ。
これでペアリング完了。

1階でも快適です。

この記事もPLC経由で書きました。

アマチュア無線、短波ファンのみなさんすまん。
近所に庭に2階の屋根より高い無線アンテナ立ててる人もいるんだよね...

| | コメント (2)

2007.10.23

撤退

先日書いたとおり、ウチの周囲は無線LAN(というより2.4GHz帯)暗黒地帯と化している。

さらに追い討ちをかけるように11gのチャネル1に新たな基地局が現れた。

対抗策として無線ルータに指向性アンテナを付けてみたが、効果なし。
\5,680は無駄だった。


ああ、もう無線LAN戦争から撤退します。
11aだと家の機器が対応してないのでいろいろ買わなくちゃいけないし。

契約しているプロバイダのケイ・オプティコムが、\500/月でPLC(親機,子機)をレンタルしているようなので申し込んでみた。
今週中くらいに届くかな。

(BlogやメールやHPは昔からの名残でNifty使ってるけど、接続プロバイダはケイ・オプティコムのEO光)

| | コメント (0)

2007.10.20

XとY

X-WINGY-WING

やることすげえな。

で、Xにはこんなことが起こってたらしい。
ステキ。

| | コメント (4)

2007.10.05

テロ?

どうも今朝からIE7がWindows Updateの自動配布の対象になってるみたい。
今勤めてるところはWindowsUpdateでやってるので隣の人が悲鳴を上げてた。

IE7の自動配布については予告があって、そのスケジュールは日本ではここを見る限りでは2008年以降で未定とのことだけど...
(2007.10.05 15:00現在)


MSの中の人の配布ミスのような気がする。

昔勤めてたとこのシステムで、IE6のActiveXの処理方式の変更によって大ダメージがあるのがあって、その対策が講じられるまでそのIEのパッチは適用不可だったことがあったりした。

企業のシステムは結構そういう事前検証が必要だったりするのだが、今日は日本中で悲鳴があがってそうだ。

| | コメント (2)

■備忘録■VAIO-U50のPXEブートその2

VAIO-U50のPXEブートの続き。

成功したので備忘録として手順を記しておく。

使用したのはライブCDの部屋版の KNOPPIX 5.1.1/CD(高速起動版)

結論から言うと、これであれば特に迷うことなくあっさり起動する。
やはり産総研版では駄目なようでした。

以下、手順。

ネットワーク構成として、今回は親機(KNOPPIX Terminal Serverを提供)と子機(VAIO-U50)をクロスケーブルで直結した。

もちろん既設のLANに繋いだままでもPXEブートは可能なのだが、仕掛け上、子機は親機からDHCPでアドレスやブートローダダウンロード用のTFTPサーバやファイル情報などをもらったりするので、他にブロードバンドルータ等でDHCPが動いてると、そちらが子機からのDHCPブロードキャストに先に反応したりしてうまくいかない。
また、DHCPブロードキャストが子機から親機に届かないといけないので、ルータ等の設定も必要だろう。

まずは親機の起動。

これはダウンロードしたisoファイルをCDに焼いてそれで起動すればよし。
BIOS設定での起動順に注意するくらいで特に迷うことはない。

KNOPPIXが上がったら、あとは以下の通り。
Robo20071005_1Start KNOPPIX Terminal Serverを選択。

Robo20071005_2[OK]。

Robo20071005_3一番上の setup (Re)configure server and (re)start を選択して[OK]

Robo20071005_4使用するLANポートを選択して[OK]

Robo20071005_5これは[NO]を選択。
今回の環境ではこの親機に対してDHCPでアドレスを与えてくれる者はいない。

Robo20071005_6ここから親機自身のTCP/IP設定。
ネットワークの構成によってはここ以降各自の環境で適宜変更が必要だが、クロスで直結してて他に繋がってる物が無ければ全てデフォルトでOK。

Robo20071005_7

Robo20071005_8

Robo20071005_9

Robo20071005_10ここまでが親機自身のTCP/IP設定。

Robo20071005_11子機向けのDHCP設定。
これもクロスで直結なら触る必要なし。[OK]。

Robo20071005_12子機のLANアダプタのドライバを選択。
VAIO-U50は IntelのPRO/100 なのでこれが有効になっていることを確認して[OK]。

Robo20071005_13子機でroot権限での作業が必要な時は、secure: Disable root on client(s) を無効にする。[OK]。

Robo20071005_14[OK]。
(子機でのbootオプションを指定したいときは入力。)

Robo20071005_15[Yes]。

DHCP、TFTP、NFSのサービスが起動するのでCDがおとなしくなるまでしばらく待ち。
これで親機の準備は完了。

子機側は、BIOS設定でPXEブート(ネットワークブート)の優先順位をHDD等より上げておく。

VAIO-U50の場合は、
1. 電源投入時、F2でBIOS設定画面へ
2. Advancedメニューで Network boot を Enabled に
3. Bootメニューで Network の優先順位を上に持っていく
4. 保存して終了


Robo20071005_16これでめでたく立ち上がる。

ライブCDの部屋の管理人さんに感謝。

| | コメント (0)

2007.10.04

VAIO-U50のPXEブート

ここ何日か、ロボ開発なんかに使ってるモバイルPC VAIO-U50のPXEブートをテスト中。

VAIO-U50はCDドライブが付いておらず、USBの外付けCDでも起動しない。
CDでの起動は別売のiLinkの専用ドライブでのみ可能となっている(サードベンダ製でも中のドライブがSONY製ならブートするらしいが)が、もちろんそんなのは持っていない。

リカバリ領域はHDD上にあり、CDが無くても出荷時状態に戻せるのだが、それではHDDクラッシュに対応できないし、1.8インチ20GBのドライブ中、2GB程がこのリカバリ領域として食われている。

HDDのイメージをバックアップしたいが、まあ、手持ちのTrueImage Personalで取れたものの、CD起動が出来ないので戻すことが出来ない。

HDD引っこ抜いて別マシンに繋いでというのもメンドクサイし。

また、最近はSSDも安くなってきたので、HDDイメージのバックアップはゼロスピンドル化のための布石でもある。


幸い、ネットワークブート(PXE)には対応しているので、そちらの方向で思案中。

KNOPPIXのTerminal Serverによるクライアントのネットワークブートを試しているが、産総研から落とした最新の5.1.1では一応ブートはするものの、途中でエラーとなり、止まってしまう。
昔買った雑誌についてた3.9.0でも同様。
この状態ではls等最低限のコマンドさえ使えない。

4.0.2だと、Xの起動中にやはりエラーとなるものの、コマンドベースでは動かせそうなところまでは起動する。
だが、USBの外部ドライブなどは認識しないのでバックアップには面倒。
smbmountなんかで共有フォルダをマウントしてDDで落とせばいいと思われるかもしれないが、smbmountだと、ファイルサイズが2GBを超えられなかったりするのを昔経験済みなので、HDD丸ごとのイメージは取れない。
親機にFTPサーバを立て、DDの出力を標準出力にしてFTPにパイプで流して...というのは昔やったことがあるのでなんとかなるのだけど、もうちょっとまともにブートさせたいのでこれは最後の手段。

遠い異国でVAIO-U50をKNOPPIXでPXEブートをした事例を見つけた。
VAIO-U50にLinuxやFreeBSDをインストールする際、事前にKNOPPIXでHDDのパーティショニングを行うためにTerminalServerによるブートを行っている。バージョンは3.3だそうだ。
勇気出た。

いろいろ調べてたら産総研版は 5.x.x以降、なんだかTerminal Serverによるクライアント起動がうまくいかないらしい。VAIO-Uに限った話ではないようだ。
こちらの情報によるとライブCDの部屋さんの5.1.1ならいけるとの事。

次はライブCDの部屋版5.1.1と3.3で試してみることにする。

| | コメント (0)

« 2007年9月 | トップページ | 2007年11月 »