2016年01月23日

キクタンTOEIC : PSS問題集化のメモ 2016

キクタンTOEIC : PSS問題集化のメモ 2016
* はじまり
* 変換方法
    (i) Kikutan_TOEIC600_WS.bat をダブルクリックするだけです。
    (ii) 同時にネイティブ音声mp3データを取得する
* P-Study Systemを使った学習方法
* なぜ キクタンなのか?
* キクタンで大丈夫なのか?
* スマホの場合
* 実際の経緯
    4択学習の失敗:
    カードモード学習:
* 実際やってみての効果
* 感想
* 学習画面
* ブラウザで単語を一覧表示。 書籍順/ABC順
* その他のデータ変換
* その他のデータ活用
* 変換ソフトダウンロード


* はじまり
キクタンTOEICという単語集本が売られている。
別売データとして単語と例文が含まれたテキストデータを購入することができる。
キクタンTOEIC(R) Test Score 例文音声【英単語+例文テキストデータ付】(アルク) [ダウンロード]
(Scoreの後に600とか800とかの数字が入る)
で,
このデータを使ってP-Study System(PSS)で利用できる問題集に変換するための方法をメモする。
参考:
 Learning English メモ 

* 変換方法
Windows10でのみ動作確認しましたが,Windows系なら動作すると思われます。
(1) apsseをダウンロードする。
    http://www.forest.impress.co.jp/library/software/apssegapsse/
    apsse2.3.0.zipを適当なフォルダに解凍します。
    上位フォルダ名に日本語やスペースを含まない方が無難です。
(2) 問題集化変換ソフトをダウンロードする。
    下記参照。
    ダウンロード後,適当なフォルダに解凍し,中身を全部,
    上記appse2.3.0を解凍したフォルダで「apsse.exe」が存在するフォルダに
    コピーします。
(3) キクタンTOEICの別売テキストデータを同様に上記フォルダにコピーします。
    現在のところ,
    Kikutan_TOEIC500_WS.txt
    Kikutan_TOEIC600_WS.txt
    Kikutan_TOEIC800_WS.txt
    Kikutan_TOEIC990_WS.txt
    に対応していますが,こちらで動作確認したのは「600」「800」のみです。 
(3) 問題集化する。
    以下,TOEIC600のデータで記載しますが数値の部分を適当に読み替えてください。
(i) Kikutan_TOEIC600_WS.bat をダブルクリックするだけです。
        以下の様な出力になれば成功です。
c:\apsse2.3.0>set fname=Kikutan_TOEIC600_WS.txt

c:\apsse2.3.0>call converter.bat

c:\apsse2.3.0>call span.bat

c:\apsse2.3.0>set span=102

c:\apsse2.3.0>kkt2pss.exe Kikutan_TOEIC600_WS.txt -s 102

Study level 600
Generating ...
apsse.exe --word-idiom --no-replace --no-ignore --html --csv -L 100 -i __word_tag_table.tmp.html -o __output_temp.csv
使用する辞書をチェックしています...
"dict/DIC2001.TXT"を辞書0として使用します.
出力済みのインデックスファイル"dict/DIC2001.index.txt"を使用します.
一時ファイルを作成開始します...
"__output_temp.csv"に出力を開始します...
**
完了 - 1281問出力しました.
一時ファイルを削除しています...
apsseを終了します.
Kikutan_TOEIC600_WS_01.csv
Kikutan_TOEIC600_WS_02.csv
Kikutan_TOEIC600_WS_03.csv
Kikutan_TOEIC600_WS_04.csv
Kikutan_TOEIC600_WS_05.csv
Kikutan_TOEIC600_WS_06.csv
Kikutan_TOEIC600_WS_07.csv
Kikutan_TOEIC600_WS_08.csv
Kikutan_TOEIC600_WS_09.csv
Kikutan_TOEIC600_WS_10.csv
Kikutan_TOEIC600_WS_11.csv

End process.

c:\apsse2.3.0>pause
続行するには何かキーを押してください . . .
同じフォルダに以下の問題集データが生成されます。 Kikutan_TOEIC600_WS_01.csv 〜 Kikutan_TOEIC600_WS_11.csv デフォルトでは一つのファイルに102個ずつの単語が入ります。 この単語数を変えるには「span.bat」の「span=102」の数値を 適当に変更します。 一つのファイルにすべての単語を入れたいときは巨大な数値, 例えば2000等を指定するとファイル分割されません。 (ii) 同時にネイティブ音声mp3データを取得する Kikutan_TOEIC600_WS_mp3.bat をダブルクリックするだけです。 (P-Study Systemに"市販辞書のネイティブ音声"を既に設定済の場合は実行する必要はありません。) (i)と同様の問題集を生成後, data/wavvoice/cobuild_mp3 フォルダ以下に各単語のネイティブ音声が取得,保存されます。 音声データの使い方は以下を参照。(内部でVoiceGetを呼び出しています) P-Study Systemのネイティブ音声mp3を無料で取得する 2015 (4) P-Study System に問題集として取り込む これは出力された*.csvファイルを普通に問題集として取り込めばOKです。 (5) 訳語の補正 各単語の訳語(日本語訳)はapsse内蔵の辞書に基づく訳語なので, 学習しながら人力で訳語をキクタン書籍通りに補正していくことが必要です。 ざっくり3割〜4割くらいの補正が必要でした。 イディオムについてはほとんど訳語がない状態なので手入力が必要です。 後はひたすら学習するのみ。 * P-Study Systemを使った学習方法 学習方法についてメモしておきます。 以下,書籍付属のCD音声や別売例文音声は使いません。 使うのは P-Study Systemです。:D (1) カードモードで覚える これは英語と日本語の意味を 1:1 で覚える方式です。 最初だけ大変だけど,このモードが一番効果が高いです。 自分は最初,4択モードで学習しましたが,記憶力も1/4程度という感じで がっかりしました。時間を無駄にしてしまいました。orz 間違いなく,カードモードで学習すべきです。 (2) 一度に100単語程度を"繰り返しまとめて"覚える そんなの無理スジ (爆 とか言ってる場合じゃなくて。 てゆうか,上にも書いた様に4択モード学習でガックリきたので, カードモードのスパルタ式しか打つ手がなくなった訳です。orz 最初は100単語なんてそんなの無理スジと思いましたよ。xD 例えば、以下の様になります。 (i) 金曜日,土曜日,日曜日にそれぞれ33個ずつ,書籍を見て訳語補正をし, 例文もざっと目を通すと100個分一応覚えた(見た)ことになる。 これが1周目で,一番時間がかかる。orz (ii) 月曜日〜木曜日 上と同じ単語100個を一日に最低一回学習します。 すると1週間で,同じ単語100個を最低でも5周学習したことになります。 4〜5周するかしないかあたりで,ほぼ覚えてしまうので100個あたりの学習時間は 10分前後になります。 全てノーミスで答えられた場合の最短学習時間は100単語で7分でした。 (3) ネイティブ音声を聞きながら 単語を表示させるときはネイティブ音声で発音させ,必ず耳で正しい音を聞きます。 最終的には単語のスペルを見ずに(目をつぶって)音声のみを聞いて対訳が頭に浮かぶようにします。 この状態で最高速ノーミスな場合が,100単語 / 7分 です。:D 通勤,通学,昼休み,待ち時間などの空き時間を活用すれば,一回当たりの単語量を増やせるので, もっと短い周期で次の100個に移れると思います。 この辺は状況依存。 * なぜ キクタンなのか? 単語のテキストデータを入手できる書籍はこれしかないので思考する余地は有りません。 問答無用でこれになります。:D (自分が調査した時点) もし,「金フレ」に同様のデータがあれば「金フレ」にしたと思います。 (見出し単語数が少ないのでもっと楽かも :-) 実際には安いので「金フレ」も買いました。(爆 が, 今のところ出番はあまりない。 * キクタンで大丈夫なのか? 最初にテキストデータありきなので,良書かどうかをいろいろ検索してみましたが 「まぁ,良い方だろう」という認識に至りました。 #065 TOEICで使う単語帳はコレしかありえない!|TOEIC塾 https://www.youtube.com/watch?v=ne2SEjQZ9hM TOEIC単語帳:金のフレーズ、Duo、キクタンを比較☆【絶対見て!】 http://oppa000.com/category7/entry13.html * スマホの場合 すき間時間にも使えると思います。 (1) "りぴたん"(無料)というP-Study SystemのAndroid OS版がある様です。 任意の問題集csvファイルが読み込める様です。 https://play.google.com/store/apps/details?id=jp.takke.pssalpha (2) iPhoneの場合,有料のキクタンアプリが有る様です。 カバー率は悪くないという評価。 使えるTOEIC単語アプリ(有料)はどれか?TOEIC990点満点ホルダーがレビュー・検証 * 実際の経緯 4択学習の失敗: (1) キクタン600を4択モードで最初の100単語やると,全問正解で 知っている単語ばかりだったのでキクタン600の学習は後回しにした。 (2) キクタン800を4択モードで1周した。 次にキクタン600を4択モードで1周した。 結果, ほとんど記憶に残らないことが判ってがっかりする。 orz カードモード学習: 無理スジを押して xD キクタン800をカードモードで102単語ずつ学習し始める。。。 時は流れて。。。 xD キクタン800は最後の200単語(イディオム)あたりで息切れし始めたというか 窒息というか,大きく失速している。orz イディオムってメチャ苦手なのだった。 つかみどころがないというか,なんというか。。。 orz orz 今ここ。 * 実際やってみての効果 イディオムがまだ少し残った状態だけど, 効果は絶大だった !! (オントカヨ Part5,Part6とかは学習した単語が出まくり状態, 入れ食い状態で, :D かなり楽にとける,とける,とける。。。 さすがに全問正解したら大変なことになるので,(爆 それはないんだけど, とにかく"キクタンTOEIC"の驚きの威力を思い知ったのだった。(^^)/ * 感想 上にも書いたけど,キクタンTOEICを選択したものの それなりに厳選された"TOEIC専用単語本"を一冊やり切ってものにするということを 最初にやるのが一番近道かなと思うのだった。 金フレでも本と"にらめっこ"してやり遂げれられれば同様の効果は期待できると予想します。 まぁ,自分はできないんだけど xD TOEIC参考書 評価レビュー VOL.7 「新TOEIC TEST出る単特急 金のフレーズ」 http://learn-and-run.com/toeic-goldenpharases * 学習画面 以下の様に画面下部に例文と書籍情報を表示します。 [Day 1]: 書籍の学習日に対応。 [T600]: 書籍が「キクタン TOEIC Test Score 600」であることを示す。 (下図は[600]だけど実際は[T600]) 書籍情報は個人的にかなり役立ちました。 というか最初これなしで作ったので, 書籍の巻末索引から単語を調べて,そのページを開く という作業が恐ろしく大変でorz orz だったのを改良したのだった。 便利。(^^)/
kikutan-toeic-pss-tool.png
* ブラウザで単語を一覧表示。 書籍順/ABC順 オマケとして,例えば Kikutan_TOEIC600_WS.html というファイルが生成されます。 Webブラウザで単語と例文を一覧することができます。 単語は書籍順/ABC順に閲覧可能です。 単語をクリックすると発音したり,Weblio訳へのリンクが有ったり 各種英英辞典を参照できたり 書籍の[Day]情報もついているので,書籍参照も簡単。(^^)/ 以下のようなテーブルが生成されます。 書籍順 / ABC順へ / T990へ / T800へ / T600へ / T500へ
番号DayScore*Words例文品詞辞書OALDCobuildLongman
1 D01 T600 play  I play tennis with her. 【動詞】 Weblio OALD Cobuild Longman
2 D01 T600 go  I don't want to go to school tomorrow. 【動詞】 Weblio OALD Cobuild Longman
3 D01 T600 yesterday  I woke up at 7 a.m. yesterday. 【名詞】 Weblio OALD Cobuild Longman
ABC順 / 書籍順へ / T990へ / T800へ / T600へ / T500へ
番号DayScore*Words例文品詞辞書OALDCobuildLongman
1 D01 T600 go  I don't want to go to school tomorrow. 【動詞】 Weblio OALD Cobuild Longman
2 D01 T600 play  I play tennis with her. 【動詞】 Weblio OALD Cobuild Longman
3 D01 T600 yesterday  I woke up at 7 a.m. yesterday. 【名詞】 Weblio OALD Cobuild Longman
* その他のデータ変換 キクタンTOEICだけに注力していたので全く気づいてなかったけど, TOEIC以外の多数の書籍に別売テキストデータがあったのだった。 データ形式は同じと思われるので,それらのテキストデータも今回のツールで 問題集化できる可能性がある。(当方未確認) * その他のデータ活用 出力形式はCSVなのでPSS専用ヘッダである最初の4行をカットれば, 他のアプリケーションで読み込むことが可能です。 AnkiとかExcelとか。。。 * 変換ソフトダウンロード kkt2pss-v2.1-201601.7z 準備中 以下の方の評価がすばらしい。 結局,無料アプリは時間の無駄が多そうな感じがしますね。 使える無料TOEIC単語アプリはどれか?TOEIC990点満点ホルダーがレビュー・検証しました 猿の英語学習日記さんのページ P-Study Systemの紹介(その1:紹介) http://nilbia.hatenablog.com/entry/2014/12/02/001014 リンクメモ: タダなのに高機能!無料TOEIC学習アプリおすすめ30選 http://toeic-guru.jp/toeic-free-apps
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(0) | 英語 | このブログの読者になる | 更新情報をチェックする

2016年01月18日

TOPPERS/ASP STM32F4バージョン出る 2016/01

TOPPERS/ASP STM32F4バージョンが発表された様だ。
https://www.toppers.jp/asp-d-download.html#arm_m4
まだ,発見したばかりなので詳細は不明なものの,
上のページを見ると,
STM32F4-Discovery
Nucleo-F401RE
STM32F429ボード
に対応している様だ。
所有しているNucleo-F411REはF401REとして動作するので試してみようかな。

FPU対応はどうなのかよく分からない。
(ドキュメントに対応済みと書いてありました)

以下 READMEから抜粋。

TOPPERS/ASP Kernel(Release 1.9.2)STM32F4
Toyohashi Open Platform for Embedded Real-Time Systems/
Advanced Standard Profile Kernel

TOPPERS/ASP STM32F4は以下の4つのボードのGCCの開発環境に対応します.
本パッケージは個別パッケージであるため、TOPPERS/ASPカーネルターゲット
非依存部パッケージasp-1.9.2.tar.gzと組み合わせて使用してください.
(1)STM社 STM32F4 Discoveryボード
Chip:STM32F407VGT6
(2)Olimex社STM32-E407ボード
Chip:STM32F407ZGT6
(3)日昇テクノロジ社のstm32f429ボード
Chip:STM32F429
(4)STM社STM32F401 Nucleoボード
Chip:STM32F401RET6

ASPの実行形態は以下の2つをサポートします.
実行形態は、コンパイル時の変数DBGENVの設定で変更ができます.
Makefileの設定で変更ができます.

(1)RAM実行:ROMモニタ(rommon)で起動したボードに、UARTを用いて
ASPの実行形式(srec)をダウンロードして実行する形態
rommonのFLASH ROM書込みファイルはtools/rommonに置いてあります.
DBGENVが設定されない場合、またはRAMが設定の場合、この形態のビルドを行います.

(2)ROM実行:FLASH ROMに書き込んで実行する形態
DBGENVにROMが設定の場合、この形態のビルドを行います.

STM社STM32F401 Nucleoボードに関しては、TrueSTUDIOのプロジェクトファイルを
tools/TrueSTUDIOに用意しています.
これにより、直接TrueSTUDIOを用いてビルドが可能です.
実行形態はROM実行に固定です.

* TOPPERS ASP Arduino M0 Proバージョン
話変わって。
http://dev.toppers.jp/trac_user/contrib/wiki/rtos_arduino
Arduinoのライブラリが使えるTOPPERS/ASPだそうです。
これは興味深い。

でもArduino M0 Pro持ってる人はそんなに多くない気もする。
持ってないし。:D
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(0) | TOPPERS / RTOS | このブログの読者になる | 更新情報をチェックする

2016年01月12日

WAVE/PCM再生: mbed: NUCLEO-F030R8で10bit PWM音楽再生

WAVE/PCM再生: mbed: NUCLEO-F030R8で10bit PWM音楽再生
wave_player_pwm_10bit_nucleo-f030r8-frizing.gif
* はじまり
    mbed NUCLEO-F030R8を買った。
    これには12bitのDACがついてないので、いつもの様にシンプルPWMで
    PCM/WAVEファイルを再生してみた。
    PWMの周期タイマに最大48MHz入力可能なのでfs(サンプリング周波数)=44.1KHzの時,
    48MHz動作のNUCLEO-F030R8だと音楽の解像度は10ビットになります。

    必要なものは以下の動画の様にSDカード、抵抗とコンデンサ少々という、
    部品箱にありそうな部品だけでできちゃいます。(^^)/

* 今回のポイント
    諸般の経緯によりuVision4を使った32KB制限の下で作ることになってしまったのだった。orz
    STM32マイコンは下層ドライバ(STM32Cube)のオーバーヘッドが大きい。
    従って操作仕様は一度全部消去して新たにシンプルなものに作り替え,
    Lite版仕様とした。
簡略化(Lite)仕様:
    (1) リセット直後 /music フォルダ内の*.wavファイルを順に再生し,
        全て再生し終わったら最初から繰り返すという動作。
    (2) 再生中はポーズ/ポーズ解除のみ可能。('p','s'キー)
    (3) 次の曲に飛ばすことは可能。('n',Spaceキー)
    (4) 前の曲に戻ったり,任意の曲の選択機能はない。
    (5) 全曲のリストアップ機能もない。
        これをやると曲を選択したくなるのでグッと我慢する。:D
新機能:
    (1) 32ステップ・デジタルボリュームを搭載。
        割り算・かけ算なので何ステップでもいいんだけど...
    (2) 可変速再生を「'u'」(アップ),「'd'」(ダウン)キーに割り当てて操作性を向上。
    (3) LEDによる再生中のイジケータを追加。(かなりいいかげんで不正確なものの動作確認にはなる :-)
    (4) 再生時間インジケータ。
        最初にトータル時間を水平ライン(----+--等)で表示し,再生中はその下に
        10秒ごとの経過ライン(***)を表示していく。
その他:
    uVision4のローカルコンパイル環境で,
    最適化オプション「-O1」でデバッグ可能なコードサイズ(32KB以下)とした。
    但し,以下のコードサイズ最小化のワザを適用している。
    mbed のバイナリサイズを減らす方法 
    https://developer.mbed.org/users/MACRUM/notebook/howto-reduce-binary-size/

* mbed使用ライブラリ
    一部のmbedライブラリを少し改造してあります。
SDFileSystem:
    Offical版SDFileSytemをDMA化したものを使用。
    mbed: SDFileSystemのDMA化 Nucleo-F030R8編 2016
FastPWM:
    https://developer.mbed.org/users/Sissors/code/FastPWM/

* 10bit PWMの再生音: NUCLEO-F030R8 
    以下の動画は、実際にNUCLEO-F030R8で再生した音をパソコンの録音入力に入れて
    作ったものです。
    再生した音楽データ(WAVE/PCM)は、foobar2000でWAV変換した16bit/Stereo/44.1kHzのものです。

    1曲目:Music: Serenity
    前回のF411REで2番目に掲載したアコースティック・ギター系の曲が
    なぜか好評だったので,だったら最初に置いてみた。 :D
    

    2曲目:Music: About That Oldie 
    今や破竹の勢いのメーガン・トレイナーの特大ヒット曲を彷彿(ほうふつ)させる。曲名もアレだし。
    キーワード:1960s'のドゥーワップ。
    

    3曲目:Music: Gemini Robot
    

* 機能
    ここまでの機能メモ。
    UARTターミナルベース(115200bps)。
    
WAVEファイル:
    foobar2000で*.WAVファイルに変換したWAVEファイルをベースとする。それ以外は未チェック。
    WAVEファイルは、サンプリング周波数48kHzまでの任意の周波数を受け付ける。
    WAVEファイルヘッダに書いてある周波数で再生する。
    動作確認は、fs=32kHz,44.1kHz,48kHz。
    データ長は、16bit/8bit
    Stereo/mono

操作仕様:
    「Operation」
    ここを参照

* 出力のローパスフィルタ
    出力のフィルタは以下の2種類を考えてみた。
    動画の中のものは出力の減衰が多くフィルタ効果もほとんどないので実際は以下の感じか。
    但し,所詮一次のローパスフィルタなので特性は気休め程度。:D
             Low pass filter    C2
PWM out >----/|/|/|----+---------||--------> Audio in
               R1      |        +
                       |
                      ===  C1
                       |
                     ////

        C2 = 2.2uF ~ 10uF
Pattern1: 
        R1 = 3.3K Ohm
        C1 = 1500pF ~ 2200pF
Pattern2: 
        R1 = 680 Ohm
        C1 = 0.01uF
* SDカード接続図
/* SD card pin
                                           NUCLEO-F411       NUCLEO-F030R8
Pin side
--------------\
        9  ==== \    DAT2/NC
            1 ===|   CS/DAT3    [CS]         D10 / PB_6        D10 / PB_6 
            2 ===|   CMD/DI     [DI]         D11 / PA_7        D4 / PB_5
            3 ===|   VSS1       [GND]        GND               GND
Bottom      4 ===|   VDD        [3.3V]       3.3V              3.3V
View        5 ===|   CLK        [CLK]        D13 / PA_5        D3 / PB_3
            6 ===|   VSS2       [GND]        GND               GND
            7 ===|   DO/DAT0    [DO]         D12 / PA_6        D5 / PB_4
            8 ===|   DAT1/IRQ
-----------------

                                           NUCLEO-F411       NUCLEO-F030R8
Logo side
-----------------
            8 ===|   DAT1/IRQ
            7 ===|   DO/DAT0    [DO]         D12 / PA_6         D5 / PB_4
            6 ===|   VSS2       [GND]        GND                GND
Top         5 ===|   CLK        [CLK]        D13 / PA_5         D3 / PB_3
View        4 ===|   VDD        [3.3V]       3.3V               3.3V
            3 ===|   VSS1       [GND]        GND                GND
            2 ===|   CMD/DI     [DI]         D11 / PA_7         D4 / PB_5
            1 ===|   CS/DAT3    [CS]         D10 / PB_6         D10 / PB_6 
        9  ==== /    DAT2/NC
--------------/
*/
* NucleoのFrizingボードデータ 以下のボード図がFrizingに標準装備されているので便利かも。 Frizing上で"nucleo"で検索すると出てくる。 mbed-stm32-nucleo-board.gif * ハマりポイント xD uVision5で使えない orz:STM32F0シリーズはuVision5ならFlash 256KBまで無料」というのを使おうと思ったら, なんと家の環境(Windows10)では,エクスポートしたmbedプロジェクトをオープンできない という状況に陥った。orz オープンした途端にuVision5がクラッシュするのだった。 orz orz これが原因で32KB縛りのuVision4を使うことになったのだった。 (今回はGCCを使っていない) 内蔵クロック(HSI)の初期補正値がむちゃくちゃだった orz: 当初,音楽再生速度が遅いのでソフトがどこかおかしいかと思っていたが, 結局,リセット直後のレジスタ初期値がデータシートと全然違う値になっていて HSIクロックが5%も遅かったのだ。orz orz orz マイコンそのもののバグなのは間違いない。 (デバッガでレジスタ見たから)
 __HAL_RCC_HSI_CALIBRATIONVALUE_ADJUST( RCC_HSICALIBRATION_DEFAULT );
をmain()の最初に追加することで解決した。orz これは単にレジスタの初期値をデータシート通りにしただけだ。 PLLで48MHzにした後の周波数誤差は0.3%だった。(^^)/ * リベンジ的な要素 以前LPC1114(Cortex-M0)で作った再生動画が著作権侵害でクレームがついて,YouTubeから削除した 経緯がある。 Cortex-M0でWAVE/PCM再生の再挑戦でもあるのだった。
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(0) | PCM/WAVE | このブログの読者になる | 更新情報をチェックする

2016年01月03日

mbed: SDFileSystemのDMA化 Nucleo-F030R8編 2016

mbed: SDFileSystemのDMA化 Nucleo-F030R8編 2016
* はじまり
* SDFileSystemライブラリの種類
    Official版と思われる :D SDFileSystem:
    Neilさんが改良した"Neilさん版SDFileSystem":
    DMA対応:
* 手持ちSDカードのCrystalMark値
* SDFileSystem: Neilさん版 ノーマルSPI NUCLEO-F411RE
* Official版SDFileSystem ノーマルSPI NUCLEO-F030R8
* Official版SDFileSystem + DMA改造 SPI NUCLEO-F030R8
* 結果
    Transcendは爆速だった!:
    Sonyは激遅だった!:
    Good-Jがグッジョブ!:
    SanDisk (^^)/:
    GREEN HOUSE orz orz:
* UHS-I でSPIモード
* SDカードリーダ

* マルチ・セクタリード!!


* はじまり
今回使用したボードはこれ。Nucleo-F030R8
https://developer.mbed.org/platforms/ST-Nucleo-F030R8/
mbedで使われているSDカード用のライブラリ,SDFileSystemを
DMA化した時のメモ。

* SDFileSystemライブラリの種類
mbedフォーラムに登録されているものは多数あるがここでは以下の2種類だけ。
Official版と思われる :D SDFileSystem:
    https://developer.mbed.org/teams/mbed/code/SDFileSystem/
    以下のNeilさんが酷評しているオフィシャル版だ。
    気に入らない点,
    (1) デフォルトでSPIクロックが1MHzに固定されていて,
        ライブラリのソースを修正しないと高速化できない。orz
    (2) エラー処理を省略しすぎ。 orz
    歴史の古いライブラリだからアレだけど,まぁなんというか,
    速度が重要でないなら,それなりの用途には使えると思います。

Neilさんが改良した"Neilさん版SDFileSystem":
    https://developer.mbed.org/users/neilt6/code/SDFileSystem/
    名前が同じなのでややこしい。
    (1) Official版がアレ過ぎなので,いろいろ改善した版。
    (2) 結構人気あるみたい。
    (3) これ使ったことある。
    (4) 最近のは動かなかった。orz
    (5) エラー処理はやっぱり手薄。というかもっと上位層の改良が必..(ry
    この版が動くなら :D こっちを使ったほうが良いと思う。
DMA対応:
    上記ライブラリはDMA対応していないが,
    LPC1768/9については改造版が存在する様だ。
    今回はSTM32系なので取り上げない。

* 手持ちSDカードのCrystalMark値
SDカードといっても手持ちは,ほとんど全部「microSD」カード。
まずは、PC上のCrystalMarkを使ってシーケンシャルリードの速度を計測した。
SDカードはClass4/6/10(@4/6/10)と不明な物(@?)がある。
この結果は一部を除いて以下のコピペである。
WAVE/PCM再生: mbed: NUCLEO-F411RE で11bit PWM音楽再生
(単位: KB:Kilo byte ; MB:Mega byte)
    メーカ
    Good-J      16G FAT32 SDHC  @10: seq read: 19.5MB/s , write: 12.3MB/s
    Victor       4G FAT32 SDHC   @4: seq read: 17.8MB/s , write: 11.3MB/s
    BUFFALO     16G FAT32 SDHC   @4: seq read: 17.8MB/s , write:  4.3MB/s
    Sony         8G FAT32 SDHC   @4: seq read: 16.2MB/s , write:  4.7MB/s
    SanDisk     16G FAT32 UHS-I  @6: seq read: 16.6MB/s , write:  8.7MB/s
    Green House 16G FAT32 UHS-I @10: seq read: 16.4MB/s , write:  4.1MB/s
    IO DATA      1G FAT   SD     @?: seq read: 11.9MB/s , write:  2.4MB/s
    Transcend    2G FAT   SD     @?: seq read:  9.9MB/s , write:  5.3MB/s
    Sony         4G FAT   SDHC   @4: seq read:  5.4MB/s , write:  4.9MB/s
* SDFileSystem: Neilさん版 ノーマルSPI NUCLEO-F411RE 以下は、SDFileSystemライブラリ用のベンチマーク結果。 これはDMAを使わないNeilさんのバージョンをNUCLEO-F411REで動かしたときの速度だ。 https://developer.mbed.org/users/neilt6/code/SDFileSystem/ この結果は以下のコピペである WAVE/PCM再生: mbed: NUCLEO-F411RE で11bit PWM音楽再生 NUCLEO-F411RE SysClock=100MHz 読出しバッファサイズは512バイト、SPIクロックは12MHzとした。 測定に使ったファイルサイズは1MByteとした。(ファイルサイズは以降同一で1MByte)
Normal  Good-J   16G FAT32 SDHC @10: SPI SCLK 12MHz: buf=512byte read: 510KB/s write: 81KB/s
Normal  Victor    4G FAT32 SDHC  @4: SPI SCLK 12MHz: buf=512byte read: 507KB/s write: 46KB/s
Normal  Sony      4G FAT   SDHC  @4: SPI SCLK 12MHz: buf=512byte read: 462KB/s write: 21KB/s
Normal  BUFFALO  16G FAT32 SDHC  @4: SPI SCLK 12MHz: buf=512byte read: 456KB/s write: 87KB/s
Normal  Sony      8G FAT32 SDHC  @4: SPI SCLK 12MHz: buf=512byte read: 302KB/s write: 19KB/s 
(容量2Gバイト以下のSDカードは読み書きできませんでした。) orz 高速マイコンなのとNeilさん版の効果か, DMAなしでも"自分用の音出し工作"に十分使える速度を出している。 というのが, 2014年の11月ごろの状況。 で, 2015年末にNeilさんの最新版SDFileSystemを使ってNUCLEO-F030R8で動かそうと試みたが 全く動作せず。orz 原因は未追求。 試しに, Official版のSDFileSystemにしたらサクッと動いたので, 以下は主にOfficial版SDFileSystemの話。 * Official版SDFileSystem ノーマルSPI NUCLEO-F030R8 Official版SDFileSystemをそのままNUCLEO-F030R8で動かしたときの速度だ。 SDFileSystem Official https://developer.mbed.org/teams/mbed/code/SDFileSystem/ NUCLEO-F030R8 SysClock=48MHz 読出しバッファサイズは512バイトとした。 SPIクロックは、1.5MHz - 24MHzまで5ポイントを計測した。
Normal  Good-J    16G FAT32 SDHC @10: SPI SCLK  24MHz: buf=512byte read: 290KB/s write: 65KB/s
Normal  Good-J    16G FAT32 SDHC @10: SPI SCLK  12MHz: buf=512byte read: 262KB/s write: 61KB/s
Normal  Good-J    16G FAT32 SDHC @10: SPI SCLK   6MHz: buf=512byte read: 219KB/s write: 56KB/s
Normal  Good-J    16G FAT32 SDHC @10: SPI SCLK   3MHz: buf=512byte read: 176KB/s write: 49KB/s
Normal  Good-J    16G FAT32 SDHC @10: SPI SCLK 1.5MHz: buf=512byte read: 120KB/s write: 39KB/s
このデータは下記グラフで一番下の線になる。(Without DMA: Good-J 16GB SDHC ) * Official版SDFileSystem + DMA改造 SPI NUCLEO-F030R8 これはOfficial版SDFileSystemを改造してDMA対応にしたもの。 SDFileSystemDMA ライブラリ SDFileSystemDMA テストプログラム 今回はリードだけDMAを使ってNUCLEO-F030R8で動かしたときの速度だ。 ライトはノーマルSPI状態である。 リード/ライトにDMA対応しました。(2016/02) NUCLEO-F030R8 SysClock=48MHz 読出しバッファサイズは512バイトとした。 SPIクロックは、1.5MHz - 24MHzまで5ポイントを計測した。 sdfilesystemdma-speed-test3-read-buffer-512byte.png * 結果 あくまで工作用で使うSPI接続の評価。 でも, 古いTranscendを除けばPC上のベンチ結果になんとなく追従している気がする? 微妙なんだけどね。傾向として。なんというか。:D Transcendは爆速だった!: Transcend はえーっ! 2GBのSDだからかなり古いカードだけど, SPIクロック24MHzだと1.2MByte/sec も出てる。 SPIで1MB/sec超えたの初めて見た。 Transcendについては当初FATでフォーマットしてあったが, 試しにFAT32でフォーマットして計測してみたが,ほとんど違いは出なかった。 Sonyは激遅だった!: SonyのSDカードは買わないことにした。xD DMA使ってSPI 24MHzで450KB/secってヒドイ。 orz Good-Jがグッジョブ!: Good-Jのカードがライトも含めて高パフォーマンスだった (^^)/ SanDisk (^^)/: Class6 のUHS-Iだけどなかなか良い感じ。書き込み速度も速い。 最近の大容量カードとしては一番優秀だ。 製品名: Mobile Ultra / microSDHC UHS-I カード GREEN HOUSE orz orz: Class10のUHS-Iだけど,ダメダメだ。このメーカは二度と買わない。 xD PC上ではUHS-I非対応のSDカードリーダを使ったからアレだけど, とても期待できそうにない気がする。 これ高かったから損した気分。 orz orz
DMA     Transcend  2G FAT   SD  @?: SPI SCLK   24MHz: buf=512byte read: 1286KB/s write: 79KB/s
DMA     Transcend  2G FAT   SD  @?: SPI SCLK   12MHz: buf=512byte read:  879KB/s write: 74KB/s
DMA     Transcend  2G FAT   SD  @?: SPI SCLK    6MHz: buf=512byte read:  544KB/s write: 66KB/s
DMA     Transcend  2G FAT   SD  @?: SPI SCLK    3MHz: buf=512byte read:  310KB/s write: 57KB/s
DMA     Transcend  2G FAT   SD  @?: SPI SCLK  1.5MHz: buf=512byte read:  165KB/s write: 43KB/s

DMA     Transcend  2G FAT32 SD  @?: SPI SCLK   24MHz: buf=512byte read: 1280KB/s write: 62KB/s
DMA     Transcend  2G FAT32 SD  @?: SPI SCLK   12MHz: buf=512byte read:  875KB/s write: 60KB/s
DMA     Transcend  2G FAT32 SD  @?: SPI SCLK    6MHz: buf=512byte read:  543KB/s write: 55KB/s
DMA     Transcend  2G FAT32 SD  @?: SPI SCLK    3MHz: buf=512byte read:  309KB/s write: 46KB/s
DMA     Transcend  2G FAT32 SD  @?: SPI SCLK  1.5MHz: buf=512byte read:  165KB/s write: 34KB/s

DMA     SanDisk    16G FAT32 UHS-I @6: SPI SCLK   24MHz: buf=512byte read: 1058KB/s write: 88KB/s
DMA     SanDisk    16G FAT32 UHS-I @6: SPI SCLK   12MHz: buf=512byte read:  766KB/s write: 83KB/s
DMA     SanDisk    16G FAT32 UHS-I @6: SPI SCLK    6MHz: buf=512byte read:  498KB/s write: 73KB/s
DMA     SanDisk    16G FAT32 UHS-I @6: SPI SCLK    3MHz: buf=512byte read:  294KB/s write: 62KB/s
DMA     SanDisk    16G FAT32 UHS-I @6: SPI SCLK  1.5MHz: buf=512byte read:  161KB/s write: 44KB/s

DMA     Good-J    16G FAT32 SDHC @10: SPI SCLK  24MHz: buf=512byte read: 916KB/s write: 65KB/s
DMA     Good-J    16G FAT32 SDHC @10: SPI SCLK  12MHz: buf=512byte read: 691KB/s write: 62KB/s
DMA     Good-J    16G FAT32 SDHC @10: SPI SCLK   6MHz: buf=512byte read: 467KB/s write: 57KB/s
DMA     Good-J    16G FAT32 SDHC @10: SPI SCLK   3MHz: buf=512byte read: 282KB/s write: 49KB/s
DMA     Good-J    16G FAT32 SDHC @10: SPI SCLK 1.5MHz: buf=512byte read: 157KB/s write: 39KB/s

DMA     Victor     4G FAT32 SDHC  @4: SPI SCLK  24MHz: buf=512byte read: 936KB/s write: 25KB/s
DMA     Victor     4G FAT32 SDHC  @4: SPI SCLK  12MHz: buf=512byte read: 702KB/s write: 24KB/s
DMA     Victor     4G FAT32 SDHC  @4: SPI SCLK   6MHz: buf=512byte read: 470KB/s write: 22KB/s
DMA     Victor     4G FAT32 SDHC  @4: SPI SCLK   3MHz: buf=512byte read: 284KB/s write: 19KB/s
DMA     Victor     4G FAT32 SDHC  @4: SPI SCLK 1.5MHz: buf=512byte read: 158KB/s write: 15KB/s

DMA     BUFFALO   16G FAT32 SDHC  @4: SPI SCLK  24MHz: buf=512byte read: 774KB/s write: 70KB/s
DMA     BUFFALO   16G FAT32 SDHC  @4: SPI SCLK  12MHz: buf=512byte read: 607KB/s write: 66KB/s
DMA     BUFFALO   16G FAT32 SDHC  @4: SPI SCLK   6MHz: buf=512byte read: 428KB/s write: 60KB/s
DMA     BUFFALO   16G FAT32 SDHC  @4: SPI SCLK   3MHz: buf=512byte read: 268KB/s write: 52KB/s
DMA     BUFFALO   16G FAT32 SDHC  @4: SPI SCLK 1.5MHz: buf=512byte read: 153KB/s write: 40KB/s

DMA     Green House    16G FAT32 UHS-I @10: SPI SCLK   24MHz: buf=512byte read: 663KB/s write: 64KB/s
DMA     Green House    16G FAT32 UHS-I @10: SPI SCLK   12MHz: buf=512byte read: 495KB/s write: 58KB/s
DMA     Green House    16G FAT32 UHS-I @10: SPI SCLK    6MHz: buf=512byte read: 375KB/s write: 53KB/s
DMA     Green House    16G FAT32 UHS-I @10: SPI SCLK    3MHz: buf=512byte read: 248KB/s write: 47KB/s
DMA     Green House    16G FAT32 UHS-I @10: SPI SCLK  1.5MHz: buf=512byte read: 146KB/s write: 37KB/s

DMA     Sony       4G FAT   SDHC  @4: SPI SCLK  24MHz: buf=512byte read: 455KB/s write: 18KB/s
DMA     Sony       4G FAT   SDHC  @4: SPI SCLK  12MHz: buf=512byte read: 391KB/s write: 17KB/s
DMA     Sony       4G FAT   SDHC  @4: SPI SCLK   6MHz: buf=512byte read: 307KB/s write: 16KB/s
DMA     Sony       4G FAT   SDHC  @4: SPI SCLK   3MHz: buf=512byte read: 224KB/s write: 15KB/s
DMA     Sony       4G FAT   SDHC  @4: SPI SCLK 1.5MHz: buf=512byte read: 145KB/s write: 12KB/s

DMA     Sony       8G FAT32 SDHC  @4: SPI SCLK  24MHz: buf=512byte read: 426KB/s write: 18KB/s
DMA     Sony       8G FAT32 SDHC  @4: SPI SCLK  12MHz: buf=512byte read: 370KB/s write: 17KB/s
DMA     Sony       8G FAT32 SDHC  @4: SPI SCLK   6MHz: buf=512byte read: 294KB/s write: 17KB/s
DMA     Sony       8G FAT32 SDHC  @4: SPI SCLK   3MHz: buf=512byte read: 208KB/s write: 16KB/s
DMA     Sony       8G FAT32 SDHC  @4: SPI SCLK 1.5MHz: buf=512byte read: 120KB/s write: 14KB/s
* UHS-I でSPIモード UHS-I対応のSDHCカードでもSPIモードで動くことが判った. というか,SD仕様書にはUHS-I対応の物は"「shall」でSPI対応"と書いてあったので :D 大丈夫だろうと踏んだ。 OKだった。(^^)/ * SDカードリーダ 今回使ったPC用のSDカードリーダは3年くらい前に買ったもので, 当然UHS-I速度など対応している物ではない。USB2.0接続仕様の物。 * マルチ・セクタリード!! 実は,オフィシャルなSDFileSystemは「マルチ・セクタリード/ライト」に未対応だった。 上のグラフは読み出しバッファが512バイトの時で,これをいくら増やしても読み出し速度に 変化がないので,アレ? なんか変だなぁ。。。 :D ChaNさんのFatFsのページを読み直してようやく気づいた。 http://elm-chan.org/fsw/ff/ja/appnote.html#fs2 SDFileSystemのソースにもシングル・セクタモードしか使わないとちゃんと書いてあった。 (^^; で, 今のところマルチ・セクタリードのみ対応した。 今回はSPIクロック(DMA)を最高48MHzまで,転送バッファ16KBまで計測できるように, NUCLEO-F411REを使った。 sdfilesystemdma-speed-test-buffer-vs-spi-clock.png ば,爆速になった (^^)/ 結果: な,なんとダメダメと思われたGreenHouseのUHS-Iカードがマルチセクタ効果と SPIクロック48MHz効果で爆速になった。(^^)/ Sonyも高速になったけど,やっぱりイマイチ感がある。 Good-Jはやっぱり好印象。 SanDisk: SanDiskはSPIクロック48MHzで読み出しバッファ16KBの時, な,なんとGreenHouseの2倍の8.5Mbyte/secをたたき出していたが, 挙動が不安定なので今回は除外した。 不安定な理由はブレッドボードワイヤ接続であることは明かなんだけど, (コラ めんどくさいので今のところは除外する。 SPI clock 48MHz動作: SPI clockはどうやら25MHzが上限らしいので上の図で48MHzの線は規格外の参考値とします。(^^; * NeilさんのSDFileSystem vs SDFileSystemDMA NeilさんのSDFileystem: DMAを使わずにある程度高速化できたのは,ざっくり (1) SPIの転送単位を16bitにした。 (2) マルチセクタ転送に対応した。 その他として, (1) SDカードの挿抜に対応した。 (2) etc. ということが分かりましたが, 注意ポイントとして, (1) 低速なマイコンだと転送速度が遅い。 本家のものより高速だが,マイコンの動作速度に転送速度がかなり依存してしまう。 高速なマイコンなら(個人的には)そこそこ満足できる速度が出るとも言える。 (2) 最新版と苦戦中。(2016/02) (^^; (3) 最新版でもやっぱりTrancendの2GB SDカードは読めなかった。 orz 本家SDFileSystemは全く問題なく読める。 SDFileystemDMA: (1) DMAによりマイコンの速度に依存しない高速転送を実現。 (2) 従って、低速マイコンでも高速転送可能。 というか,マイコンの速度によらずSPIクロック速度のみに依存します。 (3) DMA転送中は他の処理が割り込めないので,処理全体としても余裕ができる。 (4) 本家Officialベースなので本家との互換性が高い。 注意ポイントとしては, (1) mbed STMicroのSTM32マイコン専用であること。
               |
               +
             |:|:|

          |
        |
      |

|-+-|  
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(0) | mbed | このブログの読者になる | 更新情報をチェックする

2015年12月29日

mbed: コンストラクタと初期化に関するメモ 2015/12

mbed: コンストラクタの初期化に関するメモ 2015/12
* はじまり
このメモは2015年12月末頃の物なので,mbed側でそのうち修正されるかも。
されないかも。:D

以下は,STM32F0系(Nucleo/DISCO)だけしか見てません。

* mbed2.0のグローバル・コンストラクタとクロックアップ問題
グローバル・コンストラクタ(スタティック・コンストラクタも含む)
C++言語の場合,リセットスタート直後に以下の処理を大体この順に行う必要がある。
    (1) .bss/.data領域の初期化。
    (2) SystemInit()の呼び出し。
    (3) PLLでシステムクロックを指定 or 最高速度にクロックアップ。
    (4) C++コンストラクタの呼び出し。
    (5) main() へジャンプ。 

実は,現時点で上記の順になっていないことが判ったのだった。orz
で,以下の様になっている。
オンラインコンパイラ(armcc)/uVision4(MDK-ARM)(armcc export)の場合:
    (1) SystemInit()の呼び出し。
    (2) .bss/.data領域の初期化。
    (3) C++コンストラクタの呼び出し。
    (4) PLLでシステムクロックを指定 or 最高速度にクロックアップ。
    (5) main() へジャンプ。 
問題:
上記の様にクロックアップとコンストラクタ呼び出しが逆になっている。(注1)
(armccの場合,"デフォルト"では(2)と(3)は不可分で(2)の部分をスキャッタ・ローディングと言うらしい。)
そうすると,
コンストラクタでシステムクロック値を参照してクラスの初期化をしている場合,
間違ったクロック(内蔵クロック:HSI)でクラスが初期化されたままmain()に実行が移り不具合となる。
で,
パッチ的にmain()に飛ぶ前あたりでクロック依存のクラス,現時点では
Serialクラスのボーレトジェネレータ再設定指示を出して回避してたりするのだった。
もしユーザレベルで新規にクラスを作成し,そのコンストラクタ内でシステムクロック値(SystemCoreClock)を参照した場合,
同様の不具合に見舞われる。
以前,プルリクエストのコメント欄で
「何でそこでSystemCoreClockUpdate()を使う必要があるわけ?」
というツッコミを見かけたが,ようやく解せた。
orz

根本的な対応armcc (1):
初期化順を変えるにはソース非公開のアセンブラレベルの変更が必要で,
できなくはないが。。。う〜〜んどうでしょう。
スキャッタ・ローディング呼ばずに自前でメモリの初期化を
する方法もあるにはあるものの,
いまのところ自分がやるべきことではないという判断。xD
別の回避策があるかどうか。

もう少し詳しく書くとクロックアップルーチンは以下の(2)-(a)と(2)-(b)の
間に実行されなければならない。
(1) SystemInit()
(2) __main
    (a) __scatterload(アセンブラ) : .bss/.data領域の初期化 (スキャッタローディング)
    (b) __rt_entry(アセンブラ)    : C++コンストラクタの呼び出し
    (c) $Sub$$main()              : main()の直前の処理をした後、(3)へジャンプ
(3) main() の実行
で,(2)-(a)を自前で作ったものにして,その後クロックアップルーチンを実行,次に
直接__rt_entryに飛ばす方法を使う。
この方法だと.data領域の圧縮機能が効かなくなるのでFlash容量が増える可能性がある。
参考:
アプリケーションの起動
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0203ij/Beigcihd.html
リセットと初期化
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0471fj/CHDJGDAD.html
スキャッタファイルを使用したスタックとヒープの指定
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0474fj/CJAJBEFD.html

デバッガで逆アセンブル結果を見た後の考察:
__main関数内で最初に呼ばれる _main_scatterload関数がサブルーチンなので
(i)  __main関数全体をコピペして__main_replacement関数と名付ける。
(ii) __main_replacementを改造して_main_scatterloadの直後にクロックアップ・サブルーチンの
     呼び出しを追加。
(iii)リセット直後に__mainの代わりに__main_replacementを呼ぶ様に変更。
やってみたわけではないけど,これでOKそう。

根本的な対応armcc (2): orz
GCCの場合,各コンストラクタにインデックスを付けて実行順を制御できるが,
armccの場合はできない様だ。これができれば最初に実行されるコンストラクタを
クロックアップ・コンストラクタ(自前で作る)に指定すれば解決なんだけど... orz

1.8.2 C++ の初期化、構築、および破棄
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0808c/chr1358938934921.html
2.5.1. C/C++ プログラムでのライブラリ関数の使用方法
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0349bj/Cihfddfg.html

* 挙動確認プログラム
#include "mbed.h"

class ClockTest {
    public:
    ClockTest(){
        SystemCoreClockUpdate();
        _startupClock = SystemCoreClock;
    }

    void show(){
        printf("\nmbed-lib rev.%d", MBED_LIBRARY_VERSION);
        printf("\nSystem Clock in constructor    = %8u Hz", _startupClock);
        SystemCoreClockUpdate();
        printf("\nCurrent System Clock in main() = %8u Hz", SystemCoreClock );
        fflush(stdout);
    }
    private:
    uint32_t _startupClock;
};

ClockTest test;

int main() {
    test.show();
    while(1);
    return 0;
}
上のプログラムをmbed(ムベッド)のオンラインコンパイラでコンパイルして 実行してみます。結果はUARTに9600bpsで出力されます。 以下の様に周波数値が違う場合,不具合に遭遇する可能性あり。
System Clock in constructor    =  8000000 Hz
Current System Clock in main() = 48000000 Hz
というか明らかにバ...以下(ry システム的なバグなんだけど,現時点の仕様とも言う。xD (注意点は上記の周波数が一致したからといって全てOKということではない。 というところが微妙) orz 上にも書いたけど,原理上armcc with C++で"デフォルト"の__mainを呼び出す物は ほとんどこのバグ(仕様 :D)を持つことになると思われる。 orz GCCの場合: ExportされたGCCプロジェクトの場合も同様だが, さらに別の不具合も混ざってもう少しヒドイい状況になっているのだった。:D orz orz それは。。。こう, (注1) (1),(2)も逆だけどSystemInit()内でグローバル,スタティック変数を使わない限り 大丈夫。実はこれも危ない部分。 |-o-| - - - -
posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(0) | mbed | このブログの読者になる | 更新情報をチェックする