マイコン風雲録

2012年05月14日

mrubyをコンパイルしてみた 2012/05

mrubyをコンパイルしてみた 2012/05
このブログ的には、mrubyって「ムルビー」って読みがち。 (オイ

軽量Rubyへの取り組み
http://www.iij.ad.jp/company/development/tech/activities/mruby/

* mrubyをコンパイルしてみた 2012/05
2012/04/20あたりにgithubでアップされていたらしい。
git://github.com/mruby/mruby.git
https://github.com/mruby/mruby
ググってみると、まだアップされて20日くらいしか経っていないのに
多くのフォロアがいて驚いた。さすがに国産だけあって注目度が高いのが伺える。

自分の環境ではMinGWにbisonを追加するだけでコンパイルと動作確認出来た。
mingw-get install msys-bison

gccはv4.6.2でデフォルトの「-O3」オプションで920kbyteくらいだった。(stripかけて)
これを、いわゆる超組み込み向けの「-Os」オプション :D に変更すると
720kbyteまで減った。(注1)
mruby\bin>size mruby.exe
   text    data     bss     dec     hex filename
   717200    2992    2680  722872   b07b8 mruby.exe
このブログ的なターゲットマイコンとしては、 IF誌付録のSH-2Aマイコン(DRAM 1Mbyte) STM32F4Discoveryボード(Flash 1Mbyte/ SRAM 192kbyte) 等が考えられる。 上のコンパイル結果(x86用)をみると、上記マイコンではシステム的に アンバランスなもののFlashが720kbyteで収まったのはちょっと予想外だった。 (I/Oモジュールなしなので、これだけではアレだけど) 動作に必要なヒープ量が100kbyte〜200kbyte程度なら何とか上記マイコンでも動きそうな 気がするが今のところ必須最低ヒープ量は未調査。 フォロアが多いのでそのうち誰かが... (オイ (注2) ちなみに、このブログ的な物件としては、ざっくり PyMite(p14p) Flash 30kbyte〜 , SRAM 8Kbyte〜 Pawn Flash 64kbyte前後〜 , SRAM 32kbyte程度? 探査中 eLua Flash 200kbyte前後〜, SRAM 32kbyte〜 というのが今までの経緯なので、 mrubyはやはり「別カテゴリ」に属するのは明らかなわけだけど。 * PC上で動かしてみた 上でコンパイルした「mruby.exe」でスクリプトを動かしてみた。 スクリプトを「hello.rb」とすると bin/mruby.exe hello.rb とすれば動く。 以下は、実験用のスクリプトなので深い意味はない。
class Msg
	def initialize( str )
		msg( str )
		@instr = "internal"
	end

	def msg( str="Hello mruby !")
		puts str + " --- " + @instr
	end

	def rx( txt )
		for i in 0..txt.length do
			puts txt.upcase[i] 
		end
	end
end

def func_main()
	obj = Msg.new("Init hello")
	obj.msg()
	obj.rx("nbnbnb")
	obj.rx("abcdefg"[1..4])
	puts 3.1 * 5
end

func_main()
上は、一応意図通り動きました。 正規表現比較の「=~」が使えなかった。 orz と、いうか、 ドキュメントがなさそうなので、どういう予約語が使えるとか使えないとか、 「素のruby」の言語仕様ってなに? とか、今のところ不明な点は多い。(メーリングリストがあるらしい) 予約語については「src/keywords」で大まかにわかる。 仮想マシンコードを実行: bin/mrbc.exe hello.rb とすると「hello.mrb」という仮想マシンモジュールが生成される。 これを、実行するには bin/mruby.exe -b hello.mrb とする。 仮想マシンモジュールのC言語配列を出力 上のスクリプトのメイン関数「func_main()」をC言語の配列として出力できるみたい。 bin/mrbc.exe -Bfunc_main hello.rb とすると以下の様な仮想コード配列「hello.c」が出力される。
const char func_main[] = {
0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x39,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x39,
0x30,0x30,0x30,0x30,0x4d,0x41,0x54,0x5a,0x20,0x20,0x20,0x20,0x30,0x30,0x30,0x39,
......
ARMコンパイラでコンパイル irukaさんのページで、armコンパイラを使って実際のサイズが出た様です。 http://hp.vector.co.jp/authors/VA000177/html/2012-04.html なんと、Flashサイズ640kbyteまで来ました。 (注1)x86系のコンパイルサイズとARM Cortex-M系のコンパイルサイズはだいたい     同じだろうという予測に基づく。(±数十%程度と予測) (注2)gdbで見ればいいわけだけど。 参考: Big Sky システム開発屋がひっそり語るぼやき http://mattn.kaoriya.net/software/lang/ruby/20120420121729.htm mruby を Ash エミュレータ上の Linux (uClinux) 環境で動かしてみる http://pylone.jp/blog/mruby_on_qemu_ash rubyco(るびこ)の日記 Windows XPでmrubyをビルドして動かすAdd Star http://d.hatena.ne.jp/rubyco/20120424/mruby mrubyコンパイルできなかったけど-std=gnu99つけてコンパイルした。 http://kimoto.hatenablog.com/entry/2012/05/01/155911
ニックネーム Copyright (C) avrin All Rights Reserved. at 00:00 | Comment(0) | TrackBack(0) | その他

2012年05月05日

雑多なメモ 2012/5

* 以前、Maple/STM32用に作ったEthernetライブラリ(w5100/5200)を
http://avr.paslog.jp/article/2379948.html
w5200でフォーラムの中の人が試してくれたみたい
http://forums.leaflabs.com/topic.php?id=1420
一応UDPの場合、2Mbpsで動いたみたい。


* STM32-H407 PROTOTYPES ARE READY

OlimexのSTM32F4の新手のボード
EUR29.95なので、今日の某Palレートなら「3220円」だ。
Micro SDスロットやArduino風のシールドソケット付
http://olimex.wordpress.com/2012/04/26/stm32-h407-prototypes-are-ready/
ニックネーム Copyright (C) avrin All Rights Reserved. at 00:00 | Comment(0) | TrackBack(0) | 雑多なメモ

guidude: Arduinoに任意のHEXファイルを書き込む。 AVRライタ不要

guidude: Arduinoに任意のHEXファイルを書き込む。 AVRライタ不要
* はじまり
* AVRライタ不要でArduinoに任意のHEXファイルを書き込める
* guidude
* インストールと実行
* 使い方

* ダウンロード
* バージョンアップ方法
* 4つの画面
* 動作確認環境
* Windows XPのみ:.NET Framework 2.0のインストール
* guidudeの持つ機能
   TeraTerm自動終了機能:
   日本語メニュー/メッセージ対応:
   英語/日本語モード切り換え機能:
* アンインストール
* ライセンスと再配布


* はじまり
実は、Arduinoというのは全部含めてArduinoなんだけど、:D
例えば、Arduino DuemilanoveやUnoボードだけを観察してみれば、
AVRマイコン(ATmega328p) + 基板や部品など
という構成になっている。
そうすると、ArduinoというのはArduinoIDEからAVRマインコンにHEXファイルを書く
システムと見ることができる。(注3)

じゃ、任意のHEXファイルをArduinoIDE経由でArduinoボードに書けるかというと、
今のところそうはなっていない。

任意のHEXファイルが書き込めれば
Arduinoボードを「一般的なAVRマインコンボード」(注2)としても使える様になるのだ。

* AVRライタ不要でArduinoに任意のHEXファイルを書き込める
追加配線や改造も不要。
ArduinoさえあればOK。

HEXファイル:
HEXファイルの入手方法は、例えば
ここに書いた方法とか、
WinAVR環境、(注4)
AVR Studio環境
http://www34.atpages.jp/avrwiki/wiki.cgi
mikroC, mikroBasic, mikroPascalの無料版
http://www.mikroe.com/eng/product_downloads/download/
等でコンパイル、生成することが可能。

原理:
Arduino IDE(開発環境)が内部的に使っている「avrdude」というソフトにHEXファイルを渡せば
Arduino IDEと同じ原理でHEXファイルをArduinoボード上のAVRマイコンに書き込めるんです。
従って、この方式ならAVRライタは必要ないのだ。(注1)

改造や追加配線も一切不要で、
当然、そのままで元のArduinoシステムでも問題なく使えるのだ。
メリットだけがある話なんです。:D

もう少し書くと、以下の様なコマンドを発行すればArduinoボードにHEXファイルを書込み可能。
avrdude.exe -c arduino -P COM6 -p m328p -b 115200 -u -e -U flash:w:"blink.hex":a
上はOptiboot化したDuemilanoveにHEXファイルを書き込むコマンド。 このコマンドをバッチファイル化すれば、ひとまずOKなもののメンドクサイので、 GUI化してみました。 * guidude yuki-labさんのavrdude-GUI(以下、avrdude-GUI) http://yuki-lab.jp/hw/avrdude-GUI/ というのがあって、これのソースコードを利用させていただいて作ったのが 「guidude」 ベタな名前でアレだけど、 まぁ、名前はぶっちゃけ何でもいいんだけどね、識別できればいいわけで (爆 guidude-main.gif avrdude-GUIに「Arduino簡単HEX書き込みモード」と言うのを追加してみました。 (外見はちょっと違うけど。かなりか。) (^^; 上は、Optiboot化したDuemilanoveにHEXファイルを書き込むときの設定。 リストからArduinoボードを選ぶだけでHEXファイルを書き込み可能です。 簡単、簡単 (^^)/ * インストールと実行 1,ダウンロードしたzipファイルを空白や漢字を含まないフォルダに解凍します。   例えば、c:\guidudeに解凍します。 2,上記フォルダ内の「guidude.exe」をダブルクリックで実行します。 以上です。 デスクトップにショートカット作っておくのが良いかも。 Windows XPの場合は後述の.Net Framework 2.0のインストールが必要です。 * 使い方 用意する物:   例として以下のArduinoボードを使います。   Arduino Duemilanove (atmega328p) または、互換ボード AE-ATmega(atmega328p/16MHz) COMポート番号の確認:   まずは、Arduino IDEを使って正常に動作していることが前提です。   ArduinoボードとパソコンをUSBケーブルで接続します。   arduino-ide-port.png ArduinoIDEを起動して、上図の様に「COMポート番号」(Port)を確認しておきます。 この場合、「COM6」となります。 (普段Arduinoで使っているCOMポートなので、人によって番号が変わります) Arduino IDEは念のため終了しておきます。(COMが競合しないように) guidudeを起動する: 上で調べた「COM6」を下図の@の「Port」のところに設定、 (@のすぐ右の部分をクリックすれば選択できます) Aをクリックして「led_blink_atmega328p_16MHz.hex」を選択します。 guidude-startup.png 「Arduino 簡単 HEX 書込みモード」を設定する 初回起動時は設定済みです。 無改造のArduino Duemilanove (atmega328p) 16MHz/5V、及び互換ボードなら次へ進んでください。 Optiboot化改造がしてある場合、「Arduino 簡単 HEX 書込みモード」のリストから、 適切な物を選択してください。 今の時点では1種類しかないです。(^^; AVRライタなしでArduino DuemilanoveにHEXファイルを書く: これで準備完了です。 下図の「書込み」ボタンで書き込みを開始します。 guidude-write.gif 書き込みが終われば自動でリセットがかかります。 Arduino Duemilanoveボード上のLEDがドキドキすれば成功です。(^^)/ TeraTermなどのターミナルツールで「COM6」に38400bps, s1/np で接続すると以下の様に ゆっくり文字列が表示されます。 1〜9の数字を押せばLEDの点滅速度が変化します。 guidude-teraterm.gif * ダウンロード 現在、制作途中のデモバージョン、Development demo 略して「DD版」を制作中。 バージョンや動作仕様、外観、使い方等はこのページの説明と異なる可能性があります。 guidude-v0.1.2.31-201205.zip TODO: いっぱい。(オイ 認識済みの不具合: Arduinoモード中にavrdude.exeを切り換えると設定が乱れる。 (Arduinoモードのチェックをし直せば直るはず。又は再起動) * バージョンアップ方法 新しいバージョンのguidudeを使う時の方法が3つあります。 1,新しいほうで、古いファイルを上書きする方法。   以前の設定項目を保つことが出来ますが、不調な場合は「2,」を実行してください。 2,別フォルダに解凍して使う方法。   複数バージョンのguidudeを使うことが出来ますが設定は個々に初期化されます。 3,古いフォルダを削除して、同じ名前で新しい方を使う。   「2,」と同じ結果になります。(たぶん) * 4つの画面 使用状況に応じて4つの画面(上と合わせて)に素早く切り換えることが出来ます。 guidude-small.gif guidude-tiny.gif guidude-vtl.gif これは、実行過程の出力画面 guidude-output.gif 上図は見やすいように加工してあります。実際はパス情報が付加されるのでもっと見にくいです。(^^; * 動作確認環境 Windows XP でしか確認していませんが、XPより後のWindowsでもそれなりに動くと思われます。 またWindowsの画面設定の諸条件により文字が全部読めなかったりするかもしれません。 1、Windows XP SP3 デスクトップスタイル:  Windows XP スタイル 配色: 青 画面のDPI: 96DPI フォントサイズ: 標準 注意:Windowsデスクトップのフォントサイズは標準以外だと画面が微妙に変になるので、    フォントは標準を使って下さい。 画面のDPIも同様です。 2、画面解像度 1280x1024 * Windows XPのみ:.NET Framework 2.0のインストール Windows XP では、guidudeを動作させるために.NET Framework 2.0のインストールが必要です。 以下の2つをインストールするか、 Microsoft .NET Framework Version 2.0 再頒布可能パッケージ(x86) Microsoft .NET Framework 2.0 日本語 Language Pack (x86) 或いは、「Microsoft update」を実行し選択肢から2つを選択して下さい。 * guidudeの持つ機能 外観は大きく違いますが、内部機能的には元になったyuki-labさんのavrdude-GUIと だいたい同じというか、ほぼ同じです。(^^; avrdude-GUIでできることは、guidudeでも同様に出来ます。 以下は、guidudeに固有の機能です。 TeraTerm自動終了機能: ArduinoIDEが書込み時(アップロード時)に自動でシリアルモニタを閉じるのと同様な機能ですが、 guidudeは「TeraTerm」を自動終了させます。 この機能はUARTとアップロードを同じUARTライン(USB-CDC含む)で使うシステムでは、 非常に便利、と言うか、ほぼ必須の機能と言えると思います。 終了させたら今度は起動ボタンが欲しくなりますが、今後のバージョンで追加予定。 日本語メニュー/メッセージ対応: 現在、各種メッセージは大部分がavrdude-GUIと同じ物が出ますが、徐々に日本語化対応していきます。 英語/日本語モード切り換え機能: 英語メニュー(メッセージ)に切り換えることが出来ます。 初回起動時は、表示言語を自動判別します。 * アンインストール 次の手順です。 1,guidudeを終了します。 2,guidudeフォルダごと削除します。 3, C:\Documents and Settings\[ユーザ名]\Local Settings\Application Data\guidude というフォルダを削除します。(Windows XPの場合) 以上です。 * ライセンスと再配布 現在guidude自身(実行ファイル)はBSDライセンスです。 従って、BSDライセンスに従って自由に転載、再配布することが可能です。 その他の同梱ツールについては「License.*」ファイルに記載してあります。 内容物の個別再配布も個々のライセンスに従うことで可能となりますが、 ややこしいので、まとめた方が無難と思われます。 guidudeの使用や再配布は自己責任でお願いします。 (注1)書き込み可能なFlashサイズについて、     書き込もうとするFlashサイズはコンパイル時に確認してください。(HEXファイルのサイズではないです)     例えば、Arduino Duemilanove(atmega328p)の場合、書き込もうとするFlashサイズは30Kbyte以内にしておくのが     無難です。(Bootloaderやavrdude側にリミッタがあるかどうか未確認なので)(あるとは思うけど) (注2)ブートローダ付のボードね。 (注3)正確にはHEXファイルに含まれているマイコン用のFlashデータ。 (注4)WinAVRはArduinoの中に一式含まれているのだ。 参考リンク: avrdude-GUI (yuki-lab.jp Version) http://yuki-lab.jp/hw/avrdude-GUI/ 外付けAVRライタ無しでBootloaderを書き込む http://www.geocities.jp/arduino_diecimila/bootloader/index.html 外付けAVRライタ無しでBootloaderを書き込む old http://www.geocities.jp/arduino_diecimila/bootloader/index_old.html 千秋ゼミ avrdude00
ニックネーム Copyright (C) avrin All Rights Reserved. at 00:00 | Comment(0) | TrackBack(0) | duino系

2012年04月09日

衝撃のArduino 1.0.1登場 ?!  (rc2)

衝撃のArduino 1.0.1登場 ?!
*Arduino 1.0.1-rc2
2012/04/08にArduino 1.0.1-rc2がリリースされた。
Windows: http://files.arduino.cc/downloads/arduino-1.0.1-rc2-windows.zip
Mac OS X: http://files.arduino.cc/downloads/arduino-1.0.1-rc2-macosx.zip
Linux (32-bit): http://files.arduino.cc/downloads/arduino-1.0.1-rc2-linux.tgz
Linux (64-bit): http://files.arduino.cc/downloads/arduino-1.0.1-rc2-linux64.tgz
Source: http://files.arduino.cc/downloads/arduino-1.0.1-rc2-src.tar.gz
変更点:
日本語だけでなく各国語が選択できる。
http://arduino.cc/pipermail/developers_arduino.cc/2012-April/006444.html

*Arduino 1.0.1-rc1
Arduino 1.0.1-rc1がリリースされている。

Mac OS X: http://files.arduino.cc/downloads/arduino-1.0.1-rc1-macosx.zip
Windows: http://files.arduino.cc/downloads/arduino-1.0.1-rc1-windows.zip
Linux (32-bit): http://files.arduino.cc/downloads/arduino-1.0.1-rc1-linux.tgz
Linux (64-bit): http://files.arduino.cc/downloads/arduino-1.0.1-rc1-linux64.tgz
Source: http://files.arduino.cc/downloads/arduino-1.0.1-rc1-src.tar.gz

もうすぐrc2が出る。
Arduino 1.0.1の正式版は2012/04末が目標らしい。

以前書いたように、今回の目玉の一つはIDEの「日本語化(多言語化)」である。

2012/03に出された今回(v1.0.1)の変更概要は以下である。
http://arduino.cc/pipermail/developers_arduino.cc/2012-March/006331.html

In particular, changes include:
- fixing the ArduinoISP sketch (lowering baud rate from 19200 to 9600)
- internationalization and Japanese translation  多言語化と日本語化
- including of AVR toolchain on Linux
- improved compilation speed (only compile changed files) コンパイルスピードの改善
- addition of INPUT_PULLUP argument to pinMode()
- ability to do repeated starts in the Wire (TWI) library
- Ethernet.maintain() function for renewing DHCP leases
- various other bug fixes and improvements

今まで、Arduinoでがっかりさせられていたのが、
「必ず発生する無駄なフルビルド時間」
だった。

ソースコードをたった1行変更しただけでも「フルビルド」が発生。
さらに
なんと、「検証(コンパイル)」で「フルビルド」が発生し、
「書き込み(アップロード)」で「またフルビルド」が発生するという、
なんとも非効率なのがArduinoIDEだった。orz orz orz

AruduinoIDEから派生したMapleIDE(STM32)もこの欠点を受け継いでしまっているのだった。orz
ところが、同じArduinoIDEから派生したmpideというchipkit用のIDEは、独自の
改良がされていて大丈夫らしいという話も小耳に挟んでいる。(未探査)
mpideはArduinoでも使えるようだ。

ちなみに、MapleIDEはArduinoの祖先にあたる「Wiring」のIDEに統合される。
というか、現在統合作業が進行中だ。
http://leaflabs.com/2011/11/were-teaming-up-with-wiring/

実際にコンパイルしてみる
。。。

「も、もう、もっと早くこの機能を導入してほしかった!」

と、小一時間。

涙なくして使えない。

と、言ってみる。

日本語化の威力
メニューやメッセージが見やすいのは当然だけど、
特に、エラーが起きた時、日本語で表示されるのが、分かり易くて非常に良いと思います。

気づいた点を挙げると、
avr-gccが出してくるメッセージ、エラーは英語のままである。
これは、まぁ、しょうがないか。orz

日本語メッセージで検索すると日本語しかヒットしない (^^;
当たり前なんだけど、まぁ、これも許容範囲と。

arduino1.0.1.png



Auduino開発者用メーリングリスト
今回初めて発見したのだった。
いままでフォーラムしか知らなかったけど、
このメーリングリストは必読かも。(必要な人は)
http://arduino.cc/pipermail/developers_arduino.cc/


ニックネーム Copyright (C) avrin All Rights Reserved. at 00:00 | Comment(0) | TrackBack(0) | duino系

2012年04月06日

雑多なメモ 2012/04

雑多なメモ 2012/4
* Arduino Leonard型の OLIMEXINO-32U4出る
Arduino レオナルドがいまだ(2012/04)発売されてないなんて。

そうこうしているうちに、Olimexの猛攻が始まるのだった :D
これはレオナルドタイプのある程度互換型と思われる。
価格は12.95EURなので、今の某Palレートなら「1420円」で買える。
http://www.olimex.com/dev/olimexino-32u4.html


これをブレッドボードに載せたタイプがある。
AVR-T32U4。 これもレオナルドタイプ。
http://www.olimex.com/dev/avr-t32u4.html
価格は12.95EURなので、今の某Palレートなら「1420円」で買える。





* STM32F4のNetduino
http://forums.leaflabs.com/topic.php?id=1522

Netduinoです。Flash1MB/SRAM192kbでこの値段ならOKかも。
FEZ Cerb40 $24.96
40pinのDIPマイコンと同じ寸法らしい。



FEZ Cerberus Mainboard $29.95



*秋月I2C LCD登場
ようやく秋月にI2C LCD。I2Cブーム到来か。
http://akizukidenshi.com/catalog/g/gP-05693/
秋月も、
最近、ARM系の基板の入手が早かったり、
ようやく3.3V系のLCDを出し始めたりで、
あとは、PIC24FJ64GB002を250円で出せば完結する。(ナンダソリャ

*秋月PIC18F26J50が売りきれ
http://akizukidenshi.com/catalog/g/gI-05396/
秋月の様な、ある程度まとまった数を在庫する店で、発売後2ヶ月で
売り切れるというのは、まとまった数を買った人や企業がありそう。
何かが発売されるのか。
お陰で回転が良くなって次回は新しいリビジョンのPICが入手出来そうな予感。
良い良い。(オイ

ちなみに、PIC18F26J50にEEPROMは搭載されていないので秋月の記述は間違いだ。
気をつけた方がよい。


* ArduinoIDEの多言語化 2012/04
メニュー関係の文字が世界の国々の言語で表示されるように改良された模様。
以下の方のページで知りました。
http://picgames.tumblr.com/day/2012/04/05
arduino.cc のブログ
http://arduino.cc/blog/2012/04/03/arduino-ide-i18-in-the-making/
大きめの動画
http://vimeo.com/39733963

arduino.ccのブログに、Shigeru Kanemoto氏による「偉大な貢献」とあり
この方がスイッチサイエンスの人らしい。
ユーザ層(入門者)を考えると「自国の言語を学んでいる最中の人」
も多いと思います。それを考えると今後の発展も含め、
確かに「偉大な貢献」だと思います。

こういうのって、ほっとくと何年経っても英語のままっていうのがありがち。

ちなみに、「Preference」って単語、高校でも出てこないよね。(オントカヨ
高校3年で習う英単語一覧
http://www.eigo-duke.com/tango/kou3.html
にありました。

自分は高校生未満だってことが分りました。orz

 




ニックネーム Copyright (C) avrin All Rights Reserved. at 00:00 | Comment(0) | TrackBack(0) | 雑多なメモ

2012年04月04日

Pawn Language をマイコン上で動かす メモ(1)

Pawn Language をマイコン上で動かす メモ(1)
* はじまり
2012年に日本語の書籍が発売された。
書籍はPawn言語を使ってロボットを制御するのが目的の模様。

ここでは、Pawn言語の特質や、STM32マイコンにポーティングするための探査内容をメモする。

libmaple上でなんとか動かしてみたいのだった。

Windows,Linux上で動作させる事も可能。

The Pawn language
http://www.compuphase.com/pawn/pawn.htm
新フォーラム
http://www.compuphase.com/bitboard/index.php
旧フォーラム?
http://www.compuphase.com/fluxbb/index.php
ドキュメント
http://www.compuphase.com/pawn/pawn.htm#DOWNLOAD_DOCS
ダウンロード
http://www.compuphase.com/pawn/pawn.htm#DOWNLOAD_WIN


* ちょっとややこしい話: コンパイラと仮想マシン
以下のメモでは、「コンパイラ」がなんと3種類も出てくるのだった。
Flash ROM上で仮想マシンをスタティックリンクする場合の概略は以下のような感じ。
 
     
    
入力 出力 入力をコンパイルするコンパイラ
(a) 「Pawn言語コンパイラ」のソースコード
C言語(*.c)
(2)pawncc.exe (1)パソコン上のgcc, vc++, bcc等
(b) Pawn言語のソースコード
(*.p) + Native関数用のヘッダファイル(*.inc)
P-code(*.amx) (2)pawncc.exe
(c) 仮想マシンのソースコード
(amx.c)
amx.o (3)ARMマイコン用コンパイラ
arm-none-eabi-gcc
(d) Targetコード(*.c)+P-code(*.amx)
+ Native関数等(*.c) + amx.o(仮想マシン)
最終Targetバイナリ
(*.elf, *.hex, *.bin)
(3)ARMマイコン用コンパイラ
arm-none-eabi-gcc
実際は上の(b)〜(d)をMakefileやSConstruct一つにまとめる。 Pawn言語: 型宣言のない、C言語に非常に似た組み込み用の言語。 イベントドリブンな記述。 ステートの記述。 C言語との違い: 「Pawn_Language_Guide.pdf」の http://www.compuphase.com/pawn/Pawn_Language_Guide.pdf "Pitfalls: differences from C" に詳しく書かれている。 型:  基本的に、「cell」という32bitの整数型を持つ。  文字列や配列もある。  構造体やunionは無い。ポインタもない。  引数の参照渡しは可能。 ライブラリ:  浮動小数や固定小数は、サポートライブラリで提供されている。 http://www.compuphase.com/pawn/Floating_Point_Support.pdf http://www.compuphase.com/pawn/Fixed_Point_Support.pdf  文字列を扱うライブラリ http://www.compuphase.com/pawn/String_Manipulation.pdf  UDPパケットを扱うライブラリ http://www.compuphase.com/pawn/Network_Datagram_Exchange.pdf ファイル I/O http://www.compuphase.com/pawn/File_IO_Support.pdf 仮想マシン方式: Pawnコンパイラ: Pawn言語のソースコードを「P-code」(中間コード/仮想マシンコード)に変換する。 コンパイラをマイコンの中に持つことも可能らしい。 仮想マシン(amxと記される): (以下インタープリタとも書く) 「P-code」をインタープリテイションしながら実行する。 仮想マシンはマイコンの中に置かれる。 P-codeインタープリタ: 上の仮想マシンに含まれるが、この部分だけ専用の「アセンブラバージョン」を 使うように指定できる。 P-codeモジュール: 仮想マシンとスタティックにリンクする(Flash ROM上に置く)ことも、 外部モジュール(プラグイン風?)としてRAM上に後からロードすることも可能。 コンパイルするとP-codeのアセンブラファイルも出力できる(-v2オプション)。 高速実行が可能: 1、仮想マシンは、よくある「スタックベース・タイプ」ではなく「レジスタベース・   タイプ」を採用している。   これにより仮想コードが効率よくネイティブコードに対応するので   2倍の高速化が可能ということらしい。(i386cpuの場合)   「Pawn_Implementer_Guide.pdf」の「Abstract Machine design and reference」参照   http://www.compuphase.com/pawn/Pawn_Implementer_Guide.pdf 2、P-codeをRAM上にロードした場合、1回目の実行時にP-codeのNative関数呼び出し部分が、   インデックス参照(解析)から、アドレス参照に置き換えられるので、2回目以降は   より高速なNative関数呼び出しが可能。   従って、P-codeをFlash ROMに置いた時は、この機能は使えない。   (常にインデックス解析が行われる) 3、アセンブラで書かれたARM7/Cortex-M3専用のP-codeインタプリタが用意されている。 ガベージコレクタ(GC): GCもライブラリになっていて、使用する場合は廃棄可能なポインタにマークを 付ける等の記述を、Native関数内でする必要がある。orz ダイナミックロード P-codeを外部から内蔵RAMにロードして実行可能。 オーバーレイ実行:(overlay) 仮想メモリの仲間ということらしい。 Flash ROMやSDカードなどに大量のP-codeがあるが、使用可なRAM領域が少ないときに使える。 オーバレイ可能なのはP-codeの「Code領域」だけで「Stack/data領域」はオーバレイできない というのか注意点。 STM32マイコンにポーティングする(1): DS203 QUAD用?: 以下にSTM32にポーティングしたソースが一式発見されたのだった。  非常に参考になります。arm-none-eabi-gccなのでサクッと、orz。(オイ https://svn.kapsi.fi/jpa/dsoquad/pawn/ (subversionでごっそり取得可能) デジタルオシロ用と思われる。  STM32マイコンは、stm32f103vct6, flash 256kb, sram 48kb  ChaNさんのFatFsが使われ、P-codeモジュールはSDカードからオーバレイロード  される様だ。 サックとコンパイルはできなかったものの、いろいろ"やっつけ"て、 何とかコンパイル、リンクだけは可能になった。 (意図的に、「素直にコンパイル出来ないように」してある感じ) マップファイルをここに置く。 実行コードのサイズ:  上のDS203のプロジェクトは、ざっくり「Flash容量 44kbyte」だった。 (P-codeモジュールは、外部からロードされるので含んでいない) SRAMは32kbyteを「仮想マシン + P-code用」、残り16kbyteをシステムに使っているようだ。 したがって、FLASH ROMは、64kb〜128kbあればよさげ、 SRAMの最低必要量は今のところ不明。 *Native(ネイティブ)関数を作る マイコン内蔵のペリフェラルと仮想マシンの橋渡しをするのがネイティブ関数。 http://www.compuphase.com/pawn/Pawn_Implementer_Guide.pdf 上の文書に例付で詳しく書かれているので分かり易い。 Maple/Arduinoで使われる「digitalWrite() / pinMode() / delay() 関数」のネイティブ関数を 例に従って定義してみる。
/* This file implements three the native functions:
    digitalWrite(pin, value)
    pinMode( pin, mode ) 
    delay( msec )
*/
#include "wirish.h"
#include "amx.h"

static cell n_digitalWrite( AMX *amx, const cell *params )
{
/* digitalWrite( pin, value );
*   params[1] = pin
*   params[2] = value
*/
    cell result = 1;
    digitalWrite( params[1], params[2] );
    return result;
}

static cell n_pinMode( AMX *amx, const cell *params )
{
/* pinMode(pin, mode);
*   params[1] = pin
*   params[2] = value
*/
    cell result = 1;
    pinMode( params[1], params[2] );
    return result;
}

static cell n_delay( AMX *amx, const cell *params )
{
/* delay( msec );
*   params[1] = msec */
    cell result = 1;
    delay( params[1] );
    return result;
}

int amx_PinIo_Init( AMX *amx )
{
    static AMX_NATIVE_INFO pinIo_Natives[] = {
        { "digitalWrite",  n_digitalWrite },
        { "pinMode"     ,  n_pinMode      },
        { "delay"       ,  n_delay        },
        { 0, 0 }        /* terminator */
     };
     return amx_Register(amx, pinIo_Natives, -1);
}

int amx_PinIo_Cleanup( AMX *amx )
{
    return AMX_ERR_NONE;
}
加えて、Pawm言語用のヘッダファイル(includeファイル)を作る必要がある。 pawnのソースコードをコンパイルするときに必要なincludeファイル。
native digitalWrite( pin, value )
native pinMode(pin, mode)
native delay( msec )
*Native関数を作る (2) Flash ROMに内蔵する場合 上のやり方は、P-codeをRAM 上にロードして実行する時の記述方法だったので、 P-codeをFlash ROMに置いた時(仮想マシンとスタティックリンクした時)の方法を記す。 Native関数を名前(文字列)で定義するのではなく、以下の様に「負の数値」に対応させる必要がある。
AMX_NATIVE pinIo_Natives[] = {
    digitalWrite,   /* -1 */
    pinMode,        /* -2 */
    delay,          /* -3 */
};
このテーブルを仮想マシンに通知するため、以下を仮想マシンのコンパイル時に追加 CFLAGS: -DAMX_NATIVETABLE=pinIo_Natives Pawn言語用のincludeファイルに、上で対応させた負数インデックスを使う。
native digitalWrite( pin, value )   = -1;
native pinMode(pin, mode)           = -2;
native delay( msec )                = -3;
*Compiler: 「pawncc」という名前。内蔵しても独立させても良い。 includeフォルダを作ってその中に"default.inc"ファイルを置く。 コンパイル時に"default.inc"ファイルを参照しにいく。 includeフォルダ: コンパイラの直下、又はコンパイラと同レベルに置く。 例えば、p:/pawn/binフォルダに「pawncc」を置いたとすれば、 コンパイラは以下のフォルダを探しに行く。 p:/pawn/bin/include p:/pawn/include default.inc: このファイルに含むべき内容: 全てのアプリ固有の定数 全てのネイティブ関数 全てのオーバーロード・オペレータ 全てのストック関数 全てのpublic関数の前方参照宣言 public変数の宣言 Compiler: コンパイル時にcompilerと同じフォルダにある"pawn.cfg"を参照する。 (WindowsとLinuxの場合) このファイルにコマンドラインオ・プションを書いておく。 実際にコマンドラインで指定したオプションが優先される。 *仮想マシン: CFLAGS: -DNNNという表記は、「仮想マシン」をコンパイルする時に CFLAGSに追加するオプション。 amx.c: 仮想マシンは「amx.c」ファイル1つだけで構成されている。 従って、Native関数は含んでいない。 言い換えれば、「amx.c」以外のファイルは「Native関数」を含むファイルか、 間接的な補助プログラムである。 AMX_ASM: 上のC言語バージョンのP-codeインタープリタ部分に、アセンブラバージョンを使う指定。 CFLAGS: -DAMX_ASM デバッグオプション: 「amx.c」内のassert()関数を無効にするには、「amx.c」コンパイル時に「NDEBUG」オプションを 付ける。( CFLAGS: -DNDEBUG) Unicode / UTF-8サポートを禁止する: CFLAGS: -DAMX_ANSIONLY Threadタイプ: "token threading" == packed opcodes == AMX_TOKENTHREADING == default setting "direct threading" == no packed opcodes == AMX_NO_PACKED_OPC == faster "switch threading" == ANSI C version only supports 1,Flash ROM上のP-codeを実行する時は、 CFLAGS: -DAMX_TOKENTHREADING とする(デフォルト)。オーバヘッドは増えるが、これが必要条件である。 2,P-codeをRAM上で実行する場合、オーバヘッドの少ない CFLAGS: -DAMX_NO_PACKED_OPCの指定が可能。 Flash ROM上のP-codeを実行するために必須な仮想マシン・コンパイルオプション:   CFLAGS: -DAMX_DONT_RELOCATE CFLAGS: -DAMX_TOKENTHREADING CFLAGS: -DAMX_NODYNALOAD CFLAGS: -DAMX_NATIVETABLE=pinIo_Natives この場合、ダイナミックロードが不要なので、仮想マシンをコンパイルするときに 「AMX_NODYNALOAD」オプションを付ける。   Native関数テーブルのインデックスはハードコードする必要がある。(マイナス値で) 従って、amx_Register関数は必要ない。 さらに、default.incの先頭に
#pragma libray -
を追加する。 コンパイラに「コードとRAMの使用上限」を通知する。(default.inc内)
#pragma amxlimit 8192       /* 8 kiB available for code */
#pragma amxram   4096       /* 4 kiB available for data + stack */
AMX_TERMINAL ライセンス: Apacheライセンス2.0(例外付)。 商用利用も可。 alloca redeclaration warning on MinGW http://www.mail-archive.com/bug-autoconf@gnu.org/msg00235.html
ニックネーム Copyright (C) avrin All Rights Reserved. at 00:00 | Comment(0) | TrackBack(0) | ARM系

2012年03月17日

Maple/libmaple: SdFatライブラリ (1)

Maple/libmaple: SdFatライブラリ (1)
*はじまり
*サンプル・デモを全部動かす
*サンプル・デモの動作
  *「SdFatBench.pde」の実行結果
  *「SdFatInfo.pde」の実行結果
  *「SdFatLs.pde」の実行結果
  *「SdFatMakeDir.pde」の実行結果
  *「SdFatPrint.pde」の実行結果
  *「SdFatTimeStamp.pde」の実行結果
*Arduino1.0の「SDクラス」(SD.h, SD.cpp, File.cpp)をポーティングする
  *「CardInfo.pde」の実行結果
  *「DataLogger.pde」の実行結果
  *「Files.pde」の実行結果
  *「listiles.pde」の実行結果
  *「ReadWrite.pde」の実行結果
*SdFat for Maple/libmaple ダウンロード
*インストール
*ライブラリの初期化設定

*はじまり
Maple/libmaple用のSDカード・ドライバ・ライブラリの話。(注1)
SDカードを使うならChaNさんのFatFsがダントツに良いと思うものの、
既にMapleにポーティングされたSdFatライブラリを発見した。

mapleSDfat.zip 
http://code.google.com/p/maple-sdfat/downloads/list
LeafLabsの該当フォーラム・スレッド
Has any user created a SD memory ...
http://forums.leaflabs.com/topic.php?id=112

SdFatライブラリの流れ:
 SdFatライブラリの本家はここ、「sdfatlib」
 http://code.google.com/p/sdfatlib/
 元々、Arduino用に作られた物らしい。

 この「sdfatlib」の、ある時点のものがMaple用に改変され、
 同様にArduino1.0用に改変されている。
 Maple用のものとArduino1.0用の「SdFatコア部分」は、ほぼ同じと思われる。

 で、最新の「sdfatlib」は、かなり「仕様の追加、性能改善」がされていて
 Arduino1.0なら当然すぐ動くものの、これをMapleにポーティングするのは
 ちょっと大変そうなので(ToDoかも)、今回は「Arduino1.0互換」のものを目指すことにする。

*サンプル・デモを全部動かす
上のMaple用のSdFatポーティングでは、せっかく20個あるサンプル・デモが
放置状態(コンパイルが出来ない)なので、可能な限り修正を加えて
コンパイルと動作確認をしてみました。

その過程で発見されたバグの修正や、その他の修正をSdFatライブラリに加えています。
以下、examplesフォルダにあるデモ(修正済み)。
1. コンパイル不可なもの
   SdFatGPSLogger_v3: ウォッチドッグ・レジスタを使っているのと、
             動作確認が出来ないので放置。
2. 動作未確認なもの(コンパイルはOK)
  SdFatRawWrite: 高速に500MB書くデモ。時間がかかりそうなので今回はパス。
  sdFatGPS_CSVSensorLogger: GPS持ってないので未確認。
  SdFatAnalogLogger: 今のところ動作が理解出来ないので:D、未確認。
            (というか、SDカードがいっぱいになるまで?書き続ける感じなので
            安易に実行しない方が良いと思います。)(注3)

上記以外のデモ動作を実際に確認しました。
 
以下は、全てのデモの概略。

1. SdFatAnalogLogger データロガー
2. SdFatAppend アペンドモードで書き込む「APPEND.TXT」が生成される
3. SdFatBench下記参照。 read/write 速度のベンチマーク
4. SdFatCopy 上のアペンド・デモで作られた「APPEND.TXT」を
「ACOPY.TXT」にコピーする
5. SdFatGPSLogger_v3 データロガー
6. SdFatGPS_CSVSensorLogger データロガー
7. SdFatInfo下記参照。 SDカードの詳細情報を表示
8. SdFatLs下記参照。 lsコマンド風
9. SdFatMakeDir下記参照。 フォルダとファイルを生成する
10. SdFatPrint 下記参照。書き込み時にprintクラスを使うデモ
11. SdFatRawWrite Adafruit Wave Shieldで高速書き込みするデモ
12. SdFatRead 既存ファイルの内容をターミナル画面に出力する
13. SdFatRemove 2.で生成された"APPEND.TXT"ファイルを削除するデモ
14. SdFatRewrite seekSet()を使って既存ファイルの中間あたりのデータを
上書きするデモ
15. SdFatRmDir 9.で生成されたフォルダとファイル群を削除する
16. SdFatTail seekSet()を使って、ファイルの最後の方を読み出す
17. SdFatTimestamp下記参照。
18. SdFatTruncate ファイルを途中でカットするデモ
19. SdFatWrite "WRITE00.TXT"にテキストを100行書き込む
20. FileSys テキストファイル"Read.txt"の中身を表示する。
"Read.txt"は自分で用意する必要がある。orz
*サンプル・デモの動作 サンプル・デモは全て「libraries/SdFat/examples」以下にある。 MapleIDE上で実行すると、UARTからの任意の1文字を待っているので、 IDE付属の「SerialMonitor」(何か1文字送る必要がある)や、 TeraTerm(Enter押すだけで良い)などから1文字入力すると実行が開始される。 USB-CDCを持っているマイコンボード(Maple rev5, Olimexino-STM32等)なら、 PC側のボーレートはテキトウでOK。 STM32VLDiscoveryなど、ハードウエアUARTの場合は、PC側を「115200bps」にする。 現在は、Olimexino-STM32(Maple rev5互換)に付いているMicroSDスロットで、 容量2GバイトのMicroSDカードを使用。 *「SdFatBench.pde」の実行結果 SdFatライブラリの性能: マイコンボード:Olimexino-STM32(Maple rev5互換) CPU clock = 72MHz Type is FAT16 File size 5 MB
SPI clockWrite speedRead speed
4.5MHz109[KB/sec]168[KB/sec]
9.0MHz120[KB/sec]192[KB/sec]
18.0MHz119[KB/sec]192[KB/sec]
実行すると以下のように表示される。5MバイトのWriteに50秒くらいかかる。 読出しで25秒程度かかり、全て終了するまで1分以上かかるので気長に待つ。
Type is FAT16
File size 5 MB
Starting write test.  Please wait up to a minute
Write 119.03 KB/sec

Starting read test.  Please wait up to a minute
Read 192.44 KB/sec
Done
データロガー程度なら無問題。 速度を追求するなら、ChaNさんのFatFsが良い。 「sdfatlib」の最新版も改良されている模様。 *「SdFatInfo.pde」の実行結果 SDカードの詳細情報を読み出して表示するデモ。 (オリジナルのポーティングは、バグがあって表示内容がおかしいので、 SdFatライブラリを修正してあります。)
init time: 1

Card type: SD2

Manufacturer ID: 1B
OEM ID: SM
Product: 00000
              Version: 1.0
Serial number: 3xxxxxxxxx
Manufacturing date: 8/2009

cardSize: 3964928 (512 byte blocks)
flashEraseSize: 128 blocks
eraseSingleBlock: true

part,boot,type,start,length
1,0,6,251,3964677
2,0,0,0,0
3,0,0,0,0
4,0,0,0,0

Volume is FAT16
blocksPerCluster: 64
clusterCount: 61940
fatStartBlock: 252
fatCount: 2
blocksPerFat: 242
rootDirStart: 736
dataStartBlock: 768

type any character to start
*「SdFatLs.pde」の実行結果 "lsコマンド風" ルートにあるファイルの"サイズと日付"を表示した後、 サブフォルダも含め、全てのファイルをリストアップする。 このような性質から、次の「SdFatMakeDir」を実行後に、このデモを実行すると、 数千個のファイルをリストアップし始めます。orz(数分で終わりますが)
Volume is FAT16

Files found in root:
BENCH.DAT     2000-01-01 01:00:00 5000000
APPEND.TXT    2000-01-01 01:00:00 347950
ACOPY.TXT     2000-01-01 01:00:00 347950
PFF.H         2009-12-14 21:13:20 26033
PFF.C         2009-12-14 20:58:04 24916
DISKIO.C      2009-12-14 21:11:56 1738
README.TXT    2009-12-14 21:12:58 1522
DISKIO.H      2009-12-09 21:45:08 1146
INTEGER.H     2009-06-15 01:40:06 833
READ.TXT      2012-03-10 23:40:04 86
DATAS/        2012-03-10 23:40:04

Files found in all dirs:
BENCH.DAT
APPEND.TXT
ACOPY.TXT
PFF.H
PFF.C
DISKIO.C
README.TXT
DISKIO.H
INTEGER.H
READ.TXT
DATAS/
  TEST.TXT

Done
*「SdFatMakeDir.pde」の実行結果 サブフォルダを作って、その中に2000〜3000個のファイルを生成するデモ。 時間がかなりかかるので注意。 ファイル生成を確認したら、すぐにPC上で削除するか、 「SdFatRmDir」デモ(これも、生成時と同程度の時間がかかる) を実行して削除しておいた方が無難です。
...
RD 1016 163 3
RD 1017 164 2
RD 1018 163 3
RD 1019 163 3
RD 1020 163 3
RD 1021 163 2
RD 1022 168 3
Done
*「SdFatPrint.pde」の実行結果 "PRINT00.TXT"と言うファイルの中に100行書き込むテスト。 "file.print()"関数を使う。
Printing to:
PRINT00.TXT
Done
出来たファイルをPCで開くと、
 ...
line 96 millis = 8242
line 97 millis = 8242
line 98 millis = 8243
line 99 millis = 8243
*「SdFatTimeStamp.pde」の実行結果 ファイルにタイムスタンプを設定するデモ。 void dateTime(uint16_t* date, uint16_t* time)関数内で リアルタイムクロックから取得した時間を設定する。 デモでは固定値を設定している。
 Open with default times
Creation: 2000-01-01 01:00:00
Modify: 2000-01-01 01:00:00
Access: 2000-01-01

Open with callback times
Creation: 2009-10-01 20:30:40
Modify: 2009-10-01 20:30:40
Access: 2009-10-01

Times after write
Creation: 2009-10-01 20:30:40
Modify: 2009-10-02 20:30:42
Access: 2009-10-02

Times after timestamp() calls
Creation: 2009-11-10 01:02:02
Modify: 2009-11-11 04:05:06
Access: 2009-11-12

Done
RTCライブラリが組み込まれたlibmapleはここ。 git://github.com/rodgilchrist/libmaple.git LeafLabs本家にとりこまれていないのは、Maple rev5ボードが標準でRTC用の水晶発振子を 搭載していないからだと思われる。orz (Olimexino-STM32には32kHzの発振子が付いている) *Arduino1.0の「SDクラス, Fileクラス」(SD.h, SD.cpp, File.cpp)をポーティングする Arduino1.0は上記の「SdFatライブラリ」の上に「SDクラス, Fileクラス」を定義して、 より簡単にSDカードが使える様になっています。 この2つのクラスもMaple/libmapleにポーティングしてみました。 同様に、Arduino1.0に添付のデモもポーティングしています。 使い方はArduino1.0と全く同じなので、以下のページの「SD Library」の項を参照。 Arduino 日本語リファレンス http://www.musashinodenpa.com/arduino/ref/ 以下はポーティング後に、付属の「examples」を実行した結果です。 USB-CDC又は、UART経由で1文字受信後に実行を開始するように変更してあります。 (Arduinoオリジナルは、リセット後いきなり実行されるので注意) *「CardInfo.pde」の実行結果 SDカードの詳細情報を表示する。 ざっと見る限り大丈夫そうです。
Initializing SD card...Wiring is correct and a card is present.

Card type: SD2

Volume type is FAT16

Volume size (bytes): 2029649920
Volume size (Kbytes): 1982080
Volume size (Mbytes): 1935

Files found on the card (name, date and size in bytes):
BENCH.DAT     2000-01-01 01:00:00 5000000
APPEND.TXT    2000-01-01 01:00:00 170530
ACOPY.TXT     2000-01-01 01:00:00 347950
DEFAULT.TXT   2000-01-01 01:00:00 0
PRINT00.TXT   2000-01-01 01:00:00 2290
CALLBACK.TXT  2009-10-02 20:30:42 1
STAMP.TXT     2009-11-11 04:05:06 0
WRITE00.TXT   2000-01-01 01:00:00 2290
PFF.H         2009-12-14 21:13:20 26033
PFF.C         2009-12-14 20:58:04 24916
DISKIO.C      2009-12-14 21:11:56 1738
README.TXT    2009-12-14 21:12:58 1522
DISKIO.H      2009-12-09 21:45:08 1146
INTEGER.H     2009-06-15 01:40:06 833
READ.TXT      2012-03-10 23:40:04 86
DATAS/        2012-03-10 23:40:04
  TEST.TXT      2012-03-10 23:40:04 17
*「DataLogger.pde」の実行結果 データロガー。3つのA/D変換値を1行づつ記録する。 オリジナルは、かなりの行数書き続ける?作りなので、 データを10回書いたら停止するようにしてあります。(注3)
 Initializing SD card...card initialized.
2262,2603,2025
2272,2311,2008
2304,2199,2004
2376,2203,2051
2349,2270,2162
2191,2120,2051
2043,2160,1998
2345,2221,2088
2247,2161,2078
2248,2185,2118
*「Files.pde」の実行結果 SD.open(), SD.exists(), SD.remove(), などの関数を使って、ファイルの存在確認と削除を実行する。
Initializing SD card...initialization done.
example.txt doesn't exist.
Creating example.txt...
example.txt exists.
Removing example.txt...
example.txt doesn't exist.
*「listfiles.pde」の実行結果 再帰を使ってファイルリストを作る例。
Initializing SD card...initialization done.
BENCH.DAT               5000000
APPEND.TXT              170530
ACOPY.TXT               347950
DEFAULT.TXT             0
PRINT00.TXT             2290
CALLBACK.TXT            1
STAMP.TXT               0
WRITE00.TXT             2290
PFF.H           26033
PFF.C           24916
DISKIO.C                1738
README.TXT              1522
DISKIO.H                1146
INTEGER.H               833
DATALOG.TXT             1070
READ.TXT                86
DATAS/
        TEST.TXT                17
done!
*「ReadWrite.pde」の実行結果 Fileオブジェクトを使ってファイルを読み書きするデモ。
Initializing SD card...initialization done.
Writing to test.txt...done.
test.txt:
testing 1, 2, 3.
*SdFat for Maple/libmaple ダウンロード 下記「動作環境と動作確認」で書いた「Ethernet」ライブラリも必要です。 v02: 2012/03 sdfat-maple-vld-v02-20120325.zip v02-beta3: 2012/03 Arduino1.0のSDクラスを導入 v02: 2012/03 未公開   Arduino1.0のSDクラスを導入する前の状態。   examplesの動作確認OK。 * 動作環境と動作確認 動作可能環境:MapleIDE/(libmaple): v0.0.11, v0.0.12 動作可能マイコンボード: Olimexino-STM32, Maple Rev5 等の Maple family基板、 STM32VLDiscovery, STBee(mini)等の基板。(対応した動作環境が必要) 実際に動作を確認したボード: Olimexino-STM32ボード 必要ライブラリ:  ポーティングの都合上、ここの「Ethernetライブラリ」も必要です。(注2)  (Arduino1.0と互換タイプのMaple用Ethernetライブラリ) *インストール zipファイルを解凍して出てきた「SdFat」フォルダを、 MapleIDEをインストールしたファルダの「libraries」フォルダにコピーします。 上のEthenetライブラリも同様にコピーします。 その後、MapleIDEを再起動します。 「File」-「Example」-「SdFat」以下の20個以上のサンプル・デモが動作可能です。(上記参照) libmapleで使う時は、このページを参照。 *ライブラリの初期化設定 SdFatライブラリで使うSPIポートやチップセレクト・ピン等のデフォルト値を設定します。 libraries/SdFat/Sd2Card_config.h がデフォルトの設定ファイルです。 SPIを設定する: card.init()とした時: 引数なしでcard.ini()を実行すると「Sd2Card_config.h」内のデフォルト値が使われます。 ライブラリはSDカード制御用に内部でHardwareSPI型の「SD_SPI(n)」オブジェクトを定義します。 デフォルトは「n=2」(SPI2)です。(= SD_SPI_NUMBER) SDカードIFのチップセレクト用のピン番号を「SD_CHIP_SELECT_PIN」で指定します。 SPIのクロックスピードはプログラム上で「SPI_HALF_SPEED」、「SPI_FULL_SPEED」で 指定可能ですが、これに対応するクロック速度を「SPI_LOW_CLOCK」、「SPI_HIGH_CLOCK」で 定義します。無指定なら(card.init()の時)、SPI_FULL_SPEEDが使われます。 実行時に指定する: 実行時にデフォルト値を上書きできます。 card.init(SPI_HALF_SPEED)とすれば、低速クロックで初期化できます。 card.init(SPI_HALF_SPEED, 10)とすれば、ピン番号10のI/Oピンをチップセレクト・ピンとします。 低速クロックでSDカードを初期化した後、高速クロックに変更したいときは、 以下のように、直接「SD_SPI」オブジェクトを操作します。
 card.init(SPI_HALF_SPEED, 10); /* 低速クロックで初期化 */
 ...
 ...
 SD_SPI.begin(SPI_HIGH_CLOCK, MSBFIRST, 0); /* 高速クロックに変更 */
ちなみに、初期化時に低速クロックにするのは、ブレッドボードを使うための配慮なので、(注4) それ以外の場合は、最初から高速クロックで問題ないと思われます。 Serial.print() / Serial.begin()の設定: Mapleでは「Serial」オブジェクトは定義されていないので、 「Serial1」、「SerialUSB」などに変更する必要があります。 デモ内の「Serial」記述を変更するのも大変なので、 「Sd2Card_config.h」内で"やっつけ"ています。 使用するマイコンボードに応じて以下の様に、自動的に「Serial」を置換します。
#define Serial SerialUSB       /* Use USB CDC port */
これに伴って「Serial.begin()」で指定するボーレート指定を、 「BPS_115200」の様に変更してあります。 *ポーティングメモ FatStructs.h: volumeLabel[11]、とfilesystemType[8]の型は「unint8_t」だけど Arduino1.0と同じ「char」の方がいいのか? (注1)当然のこととして、壊しても惜しくないSDカードで実験したほうが良いです。 (注2)本当に必要なファイルは「Printx.h」,「Stream.h」,「Stream.cpp」。 (注3)一つのファイル、フォルダで許される最大容量、又は、最大ファイル数等々に達するまでで、     SDカードの全容量を使うわけではないと思われます。     が、未調査というか未理解状態なので、そのうち調べたいと思います。     データロガー等で、ひたすら書き続ける場合、上記制限に達した事をエラーで検出して     次のファイルや、フォルダに移行していく風。 (注4)抵抗を使ったレベルコンバータを使った場合も低速にする必要がある。 参考リンク: 検索キー: discovery, ディスカバリ、stm32, vld, value, line,VLDiscovery, stm32vld バリュー、ライン, libmaple, Maple, MapleIDE
ニックネーム Copyright (C) avrin All Rights Reserved. at 00:00 | Comment(2) | TrackBack(0) | duino系

雑多なメモ 2012/3

雑多なメモ 2012/3
* 組み込み用 Pawn言語
以下のかたのページによると、
陰気な男でいいですか
http://www.asahi-net.or.jp/~qx5k-iskw/darkside/
「Pawn」というC言語ライクの言語を使ったARMマイコン付書籍が
出るみたい。
Pawnの本家、
http://www.compuphase.com/pawn/pawn.htm
現時点で日本語の情報がほとんど無いので、上の書籍がバイブル的存在になる
可能性も。
言語仕様をチラっと見た限り、「型宣言が不要なC言語」の様な感じで
おもしろそう。
仮想マシン方式らしい。
書籍の付録マイコンがFlash128kバイト、SRAM64kバイトのCortex-M3なので
eLuaよりも処理系は小さいと思われる。
最小限のFlash/SRAM使用量とかは未調査。

ニックネーム Copyright (C) avrin All Rights Reserved. at 00:00 | Comment(0) | TrackBack(0) | 雑多なメモ

2012年02月26日

Musicメモ 2012/02

Musicメモ 2012/02
The One That Got Away - Katy Perry (Cover by Tiffany Alvord & Chester See) 

http://www.youtube.com/watch?v=K0-ucWKiTps&feature=related
2012/02/26 再生回数4,578,886回

Skyscraper - Demi Lovato (Boyce Avenue feat. Megan Nicole acoustic cover) on iTunes 

http://www.youtube.com/watch?v=JQ3r-rXUABI&feature=related
2012/02/26 再生回数7,024,982

オリジナルの方がスゴイ。 大丈夫かと思ってしまうほど、魂(たましい)入ってる。
こういう歌い方は、なかなかない。
Demi Lovato - Skyscraper 

2012/03/03 再生回数46,291,018
http://www.youtube.com/watch?v=r_8ydghbGSg&ob=av2e
参考ページ: ●デミ・ロヴァート Skyscraper 歌詞和訳
http://ameblo.jp/cai-narita/entry-11031119757.html

Taylor Swift - Last Kiss (Boyce Avenue feat. Megan & Liz acoustic cover) on iTunes 

http://www.youtube.com/watch?v=kALSETZ9ngk&feature=relmfu
2012/02/26 再生回数6,206,859

Taylor Swift - Last Kiss - Lyrics HQ 
http://www.youtube.com/watch?v=n-OQvwYd740

U2 - With Or Without You (Boyce Avenue feat. Kina Grannis acoustic cover) on iTunes 

http://www.youtube.com/watch?v=cGqN9PpW5Ic&feature=relmfu
2012/02/26 再生回数5,446,444

Me Singing "I Won't Give Up" by Jason Mraz (Christina Grimmie Cover) 
    
 
http://www.youtube.com/watch?v=zcL8zrkBpVQ
2012/02/26 再生回数2,021,467

http://www.youtube.com/watch?v=TdN5GyTl8K0
Jason Mraz - I Won't Give Up (Lyric Video) 
2012/02/26 再生回数9,471,146

オフィシャルの割に音が悪い。orz
Bruno Mars - Just The Way You Are [Official Video]

http://www.youtube.com/watch?v=LjhCEhWiKXk
2012/02/26 再生回数226,124,074


Glee - Don't stop believin 

http://www.youtube.com/watch?NR=1&feature=endscreen&v=5WxPyUzWSPA
2012/02/26 再生回数7,331,230

Glee - Glee - il flashmob (注1)

http://www.youtube.com/watch?v=NhbK2bMTRbI
2012/02/26 再生回数7,691,437

背景の建造物の「げーじつ性」がスゴイ件。
Flash mob Waka Waka (This Time For Africa) - Shakira in Piazza Duomo a Milano 19/06/2010 

2012/02/26 再生回数1,984,398

"Don't Stop Believing" - Glee - cover 

2012/02/26 再生回数29,913,734

Lil Wayne - How To Love - Christina Grimmie & Tyler Ward (Rock Cover) 

http://www.youtube.com/watch?feature=endscreen&NR=1&v=MMy48cpTjc4
2012/02/26 再生回数5,081,081


Adele - Someone like you (OFFICIAL VIDEO LYRICS) HD Live from Brit Awards 2011 

http://www.youtube.com/watch?v=jCya1yiFFP4

Adele - Someone Like You (Live in Her Home) 
http://www.youtube.com/watch?NR=1&feature=endscreen&v=NAc83CF8Ejk

Adele - Rolling In The Deep 
http://www.youtube.com/watch?v=rYEDA3JcQqw&ob=av2e

Adele - Rolling In The Deep (Live at the BRIT Awards 2012) 

http://www.youtube.com/watch?v=mPF5SClEoU8&feature=branded

Adele - Set Fire To The Rain (Live at The Royal Albert Hall) 

http://www.youtube.com/watch?v=Ri7-vnrJD3k

Adele - Make You Feel My Love (Live on Letterman) 
http://www.youtube.com/watch?feature=endscreen&NR=1&v=LLoyNxjhTzc

Adele - Hometown Glory 
http://www.youtube.com/watch?v=nL49yZNE4yk


以下のユニットについては前回を参照。
ABOVE ALL THAT IS RANDOM 5!!! - Christina & Sarah
アップされて1ヶ月で約100万回再生だから、相当な人気かも。
2分8秒からの振り付けがいいね。

http://www.youtube.com/watch?v=izne8XcaBBg&feature=related
2012/03/9 再生回数 969,480

Above All That Is Random 4 - Christina & Sarah 
2分20秒あたりの曲調がいいね。 内容はともかく :D

http://www.youtube.com/watch?v=2mCqO52__a4


Timbaland - Apologize (feat. One Republic) 

2012/03/9 再生回数 100,084,226
http://www.youtube.com/watch?v=ePyRrb2-fzs




Duffy - Mercy 
こういう"マンガチック"な声質は貴重かも。60年代テイストの曲調。

2012/03/9 再生回数 39,044,172
http://www.youtube.com/watch?v=y7ZEVA5dy-Y


The Calling - Wherever You Will Go 
それなりに有名な曲らしい。 確かに良い感じ。

2012/03/9 再生回数 15,488,978
http://www.youtube.com/watch?v=iAP9AF6DCu4


Alexandra Stan - Mr Saxobeat (Official Video) 
2012/03/9 再生回数 126,458,740
http://www.youtube.com/watch?v=lAhHNCfA7NI&ob=av2e




LMFAO - Party Rock Anthem ft. Lauren Bennett, GoonRock 

2012/02/26 再生回数384,957,438



Jeff Dunham





(注1)Flashmob: 人の集まる場所で突然踊り始めて、終わったら何事もなかったように解散するという
    パフォーマンスらしい。

ニックネーム Copyright (C) avrin All Rights Reserved. at 00:00 | Comment(0) | TrackBack(0) | Musicメモ

2012年02月18日

Maple/libmapleでEthernetライブラリを使う。 Wiznet w5100/w5200

Maple/libmapleでEthernetライブラリを使う。 Wiznet w5100/w5200
以下のページの探査結果に基づいています。
Wiz820io(W5200)のドライバ  (バグ?対応)

*はじまり
WizNetのEthernet chip、w5100とw5200をMapleIDE/libmaple(STM32マイコン)で使える様に
Arduino 0023のEthernetライブラリをポーティングしてみました。
Arduino Ethernetライブラリと"原則"完全互換です。(注1)

対応するイーサーネット基板:
  Wiz812mj(w5100)
  Wiz820io(w5200)
  Arduino Ethernet シールド(w5100)(注2)
基板に対応すると言うよりw5100/w5200 Chipに対応すると言った方が正確かも。

対応するマイコン基板:
  MapleIDE/libmapleでサポートしているMaple family基板,
  ここで対応されている以下の基板、
  STM32VLDiscovery, STBee, STBee Mini

*ダウンロード

EthernetClassicMaple_v01_201202.zip

最新のソースコード・リポジトリはここ。

*MapleIDEにインストール
zipファイルを解凍して出てきた「EthernetClassic」フォルダを
MapleIDEをインストールしたフォルダの「libraries」フォルダ下にコピーします。
(その後、MapleIDEを再起動してください)

*セットアップ
デフォルト状態:
  Ethernet chip は「w5100」、
  シリアルSPIポートは「2」(SPI2)、
  SPI clockは、6MHz(STM32VLDiscoveryの時)、(注3)
になっています。

使用するEthernet chip を変更するには、
ここを参照してください。
その他は、
「libraries/EternetClassic/utiliy/w5100_config.h」をエディタで開いて、
//#define USE_NO_DELAYED_ACK    /* if you need, activate this line */

/* Define SPI port and chip select pin */
#define DEF_SPI_PORT             HardwareSPI SPI(2)
#define ETHERNET_SS_PIN          BOARD_SPI2_NSS_PIN 
#ifdef BOARD_STM32VLD
#    define ETHERNET_SPI_FREQ    SPI_6MHZ 
#else
#    define ETHERNET_SPI_FREQ    SPI_4_5MHZ 
#endif
の定義を必要に応じて変更します。 DEF_SPI_PORT:使用するシリアルポートを指定します。 ETHERNET_SS_PIN:w5100/w5200のチップセレクトに使うピン番号を指定します。 ETERNET_SPI_FREQ:SPIクロック周波数を指定します。 (指定可能な周波数は \hardware\leaflabs\cores\maple\HardwareSPI.h 参照) USE_NO_DELAYED_ACKについては、 ここを参照してください。 必要なら有効化します。 ハードウエア接続:(ライブラリ・デフォルト)
STM32VLDiscovery ピン割り付け
STM32VLDiscovery pin name PB15
(SPI2_MOSI)
PB14
(SPI2_MISO)
PB13
(SPI2_SCK)
PB12
(SPI2_NSS)
- RST GND 3V3 -
Wiz812MJ(w5100) pin name MOSI(in) MISO(out) SCLK /SCS /INT /RESET GND 3.3V -
Wiz820io(w5200) pin name MOSI(in) MISO(out) SCLK nSS nINT nRESET GND VIN3.3 PWDN
Wiz812MJ(w5100): Wiz820io(w5200): * PWDN(パワーダウン)端子は基板上で無効化(プルダウン)されているので、 未使用ならオープンのままでよい。(ライブラリでは未使用) * /INT、nINTも未使用ならオープンのままでよい。(ライブラリでは未使用) * 電源電圧はw5100/w5200共に「3.0V〜3.6V」の範囲で使用可能。詳細はデータシート参照。 * 信号線は5Vトレラント。 *MapleIDEからの使い方 メニューから「File」-「Examples」-「EthernetClassic」-「WebServer」を 選択してコンパイル・アップロードすれば「WebServer」デモが動きます。 Arduinoのデモと同じものです。 *libmapleからの使い方 1,MapleIDEの時と同様に libmapleの「libraries」フォルダ以下にzipファイルを解凍します。 2,libmapleのトップフォルダのMakefileを以下のように編集します。   82行目あたりに「# Experimental libraries:」というコメントがあるので、   そこに以下のように追記します。(黄色い部分)  
# Experimental libraries:
LIBMAPLE_MODULES  += $(SRCROOT)/libraries/FreeRTOS
#LIBMAPLE_MODULES += $(SRCROOT)/libraries/glcdst7565web
#LIBMAPLE_MODULES += $(SRCROOT)/libraries/Time
LIBMAPLE_MODULES += $(SRCROOT)/libraries/EthernetClassic
あとは、「EthernetClassic」フォルダ-「examples-libmaple」フォルダの各「main.cpp」を トップフォルダにコピーすれば、コンパイル可能になります。 main.cppコピー直後に、main.cppファイルをダミーで編集保存するか、 touchコマンドでファイルの日付を更新する必要があります。(makeでコンパイルさせるため) *動作確認環境と確認内容 現在、「STM32VLDiscovery」ボード + Wiz812mj(w5100) を使って動作を確認しています。 (ライブラリのデフォルト状態) それ以外のマイコンボードは未確認ですが、SPI制御だけで動くので、 他のボードもそのままで動くと思われます。 以下は、標準添付のExampleを動かした結果です。
Examples動作メモ
BarometdicPressureWebServer-追加ハードウエアが必要
ChatServer (ok)クライアントが必要
PachubeClient -登録が必要
PachubeClientString -*-String型多用なので、コンパイル不可
TelnetClient (ok)サーバ側を作る必要がある
UDPSendReceiveString ok添付のudpsendrecv.pyで動作確認可能
UdpNtpClient okok
WebClient okok
WebServer okok
ok: 動作OK (ok):pingが通る事を確認。 -: コンパイルOK -*-:コンパイル不可 *Arduino1.0のEthernetライブラリをMaple/libmapleにポーティング 上は、Arduino0023のEthernetライブラリがベースでしたが、 今度は、より改良が進んでいるArduino1.0のEthernetライブラリを、 Maple/libmapleにポーティングしてみました。 ライブラリにDHCPとDNS機能が統合されました。 TCP/UDPソケットの取り扱いも改良されているようです。 上記のExamplesに以下のサンプルコードが追加されています。
Examples動作メモ
DhcpAddressPrinter okok
DhcpChatServer (ok)クライアントが必要
DnsWebClient okok
TwitterClient -*-String型多用なので、コンパイル不可
ok: 動作OK (ok):pingが通る事を確認。 -: コンパイルOK -*-:コンパイル不可 *ダウンロード EthernetMaple_v01_201203.zip 最新のソースコード・リポジトリはここ。 使い方: 基本的に上記の「EthernetClassicライブラリ」と同じです。 フォルダ名が「Ethernet」に変更になっただけです。 上記の「EthernetClassicライブラリ」と同時に存在できないので注意が必要です。 (librariesフォルダには、どちらか一方しか置いてはいけない) libmapleで使うときは、libmapleのトップフォルダにあるMakefileに、  
LIBMAPLE_MODULES += $(SRCROOT)/libraries/Ethernet
を追記します。(或いは行頭の「#」コメントをはずして、行を有効にします) (注1)Arduinoオリジナルに添付されている主要なデモが動作するという意味で。     以前ポーティングしたGLCDライブラリも同様に"原則"完全互換です。     MapleはString型をサポートしないので、その部分は除きます。 (注2)Maple基板に直接差すことはできないと思われます。 (注3)w5100のSPIクロック上限は4MHzらしいものの、3MHz以下だとうまく動作しなかったので、     現在は6MHzで使用中。 参考リンク: C++:ヘッダファイルの「循環参照エラー解決」に大変役立ちました。m(__)m gcc error: ISO C++ forbids declaration of with no type ヘッダーファイルは慎重に扱わないと危険です http://marupeke296.com/CPP_HederFileALaCarte.html hg と git のコマンド相違点 http://misc.e-hdk.com/hg-and-git 操作体系から見る、GitとMercurialの8つの違い http://www.anlyznews.com/2010/12/gitmercurial8.html 検索キー: discovery, ディスカバリ、stm32, vld, value, line,VLDiscovery, stm32vld バリュー、ライン, libmaple, maple, mapleIDE, IDE in a heartbeat 直ぐに、直ちに join forces with〜 〜と力を合わせる in the first place そもそも、初めの段階で a proof of concept 概念・コンセプトの証明、 along the lines of〜 〜に沿って、〜に従って go further〜 更に〜を推し進める、更に踏み込む
ニックネーム Copyright (C) avrin All Rights Reserved. at 23:00 | Comment(0) | TrackBack(0) | duino系