Comments
Description
Transcript
FM3マイコン対応 NETMicroFramework入門
FM3マイコン対応 NETMicroFramework入門 2010年6月30日 関本 健太郎 内容 • • • • • アーキテクチャと移植作業 FM3マイコン基板NETMF仕様 C#アプリケーション説明 Emulator SDKサンプル アーキテクチャと移植作業 クラスライブラリ層 ランライム層 ハードウェア層 C# ・ VB アプリ ユーザアプリケーション&ライブラリ アプリケーション層 ライブラリ Managed .NET WPF Comms … CLR 実行エンジ ン Type System GC Interop 実装 移植テスト アプリ ブート ローダ 実装 PAL Timer RAM I/O … 実装 実装 実装 実装 HAL Drivers Drivers 実装 実装 実装 実装 実装 実装 実装 実装 OS プロセッサおよび周辺機能 Native 同じ これだけ実装すれば、NETMFが利用できる 移植作業 ①ターゲットボードの機能の実装 ② PKから必要な機能(Proj)の選択 NativeSample ①タイマ ②シリアル通信 ③フラッシュ書き込み ④GPIO : TinyBooter “ソルーション” と呼ぶ TinyCLR 移植の流れ ターゲットボード・CPU選定 開発環境構築 移植・デバッグ C#(Visual Basic)アプリ動作確認 ライブラリ拡張 ターゲットボード・CPU選定 • CPU – Porting KitにCortex M3サンプル – FM3 (MB9BF618T), STM32 (STM32F103VET6) – 最低 Flash 256KB, SRAM 64KB – 現実 Flash 512KB, SRAM 96KB – GraphicおよびNetwork含めると、512K – 1MB Flash インターフェース誌 FM3マイコン基板 FLASH 1MB SRAM 128KB ストロベリーリナックス社 STBEE ボード FLASH 512KB SRAM 64KB CQ_FRK_FM3 仕様 機能 GPIO シリアル SPI I2C PWM アナログ USBファンクション USBホスト SDカード イーサネット LCD表示 タッチパネル 拡張メモリ VK_MENU VK_SELECT VK_LEFT VK_RIGHT VK_UP VK_DOWN VK_HOME VK_BACK FM3基板 CQ_FRK_FM3 ○ 3チャンネル (ch0, 3,4) WX-MP3PLCD-F ○ 3チャンネル (ch0, 3,4) 2チャンネル (ch6, 5) 1チャンネル (ch5) ○ ○ ○ 未実装 オプション(*1) オプション(*2) オプション(*3) オプション(*5) オプション(*6) WKFM3拡張ボード ○ 3チャンネル (ch0, 3,4) 2チャンネル (ch6, 5) (1チャンネルはSDカード) 1チャンネル (ch5) ○ ○ ○ 未実装 ○ ○ オプション(*3) オプション(*5) オプション(*6) NONE NONE NONE NONE NONE NONE NONE NONE NONE NONE NONE NONE NONE NONE NONE NONE P59 (SW_C) P95 (SW_D) P54 (SW_A) P56 (SW_B) NONE NONE NONE NONE 2チャンネル (ch6, 5) 1チャンネル (ch5) ○ ○ ○ 未実装 ○ オプション(*2) ○ ○ ○ MB9BF618T用 NETMFメモリ配置例 SRAM (128KB) 20010000 • • スタック Heap (C#・VBアプリ) 1FFF0000 00100000 プログラム&変数 内蔵フラッシュ (1MB) 設定情報 000E0000 ER_CONFIG 製造情報、IPアドレスなど Deployment 領域 (C#・VBアプリ用) 最新版は 0x000A0000 00080000 TinyCLR 00020000 TinyBooter (ブートローダ) 00000000 ER_FLASH Flashのセクタ分割が重要 TinyCLR領域とアプリケーション領域 配分調整が必要 開発環境構築 1 GCC(+eclipse)または商用コンパイラインストール (Sourcery CodeBench, Eclipse, Zylin Pluginなど) 2 VS 2010 Expressインストール 3 .NET Micro Framework 4.2 SDKインストール 4 .NET Micro Framework 4.2 PKインストール 5 コンパイラ環境設定, eclipse + JTAGが便利 (setenv_base.cmd) 6 プラットフォームサポートライブラリ作成 (msbuild pk.proj 実行、metadataprocessorビルド) 7 ターゲットソルーション作成 (SolutionWizard, 既存の手動複製) 8 ターゲットソルーションビルド (msbuild .¥Solutions¥CQ_FRK_FM3¥dotNetMF.proj /t:build /p:flavor=debug;memory=flash) MSBUILDによる自動ビルド MSBUILD • .NET Frameworkランタイムに含まれるMakeに似たビルドツール • XMLベースのプロジェクト設定ファイルを使用 • Visual Studioで作成したソルーション、プロジェクトを実行 例. Pk.projファイル – Porting Kitの初期ライブラリの作成 Projファイルが入れ子構造になっている /v:d オプションはエラー解析に非常に有用 Porting Kitの構造 主にDeviceCodeおよびSolutionsディレクトリ下の ファイルを変更する ツール類、特にブートローダー関連のプログラム ほぼすべての 出力ファイル ビルド結果作成されるファイル CLRライブラリを構成するCPU Nativeコード 暗号化関連のファイル 周辺機能実装 移植の5割 CPU、あるいは周辺ハードウェア依存のコード CHM形式のヘルプファイル C#で記載されたCLRライブラリ C#のサンプルプログラム プロジェクトのテンプレート 暗号キーファイル ターゲットごと 移植の5割 移植対象のターゲットボードに依存したファイル CRC, デバッグ通信ライブラリなど TinyCLR移植後のC#テストプログラム msbuildで参照するビルドルール USBサンプルドライバ 移植・デバッグ ひな形ソルーションの作成 ターゲットCPU周辺機能、ターゲットボードの設定を含むprojファイルの集合 NativeSampleの移植 (オプション) ターゲットCPUに特化した周辺機能の実装 TinyBooterの移植(オプション) 暗号化機能を持つブートローダ、TinyCLRのテストに有用 TinyCLRの移植 移植した周辺機能をC#, VBから動作確認 実際には、周辺機能の移植ごとにNativeSample -> TinyCLRの実装、テストの繰り返し ひな形ソルーション作成 • ソルーション – ターゲットボード毎 – 設定情報 – プロジェクトファイルの集合 • 作成 – ソルーションウィザード – PKStudio – 既存の複製 ソルーションウィザードによるひな形ソルーション作成ステップ フォルダ コピー MSBUILD プロジェクトファイル ターゲットCPUボード毎にクロックなど設定値を変更する c NativeSample 移植 Native アプリケーション • Startupコード -> ApplicationEntryPoint 移植手順 • 周辺機能の選択 -> NativeSample.proj • メモリ配置 -> scatterfile • 周辺機能テスト作成 -> NativeSample.cpp Cortex-M3固有、FM3 CPU固有 • 割込み処理コード(Global Lock)の実装 • FM3周辺機能実装 -> FM3_xxxx FM3周辺機能の実装 他のCPUの例を参考 FM3マイコン基板固有 • • メモリ配置 -> Blockstorage設定 IPアドレス、USB ID、SDカード、… NativeSample 実行フロー スタートアップファイル (FirstEntry.s) • スタック設定、割り込みベクタ Bootstrapコード • CPU固有 クロック設定など – DeviceCode下 • ボード固有 外部バスなど – Solutions下 テスト対象機能APIを呼び出すプログラムを追加していく BootEntryコード • 周辺ライブラリの初期化 ApplicationEntryPoint (NativeSample.cpp) 例. タイマ機能確認のNativeSample.cpp TinyBooter移植 • ブートローダ ホスト上のMFDeployと通信し、TinyCLR, 設定情報を更新 • 移植手順 周辺機能をTinyBooter.projに登録 NativeSampleで動作確認済みの機能の呼び出しのため、ビルドのみ 20010000 SRAM (128KB) スタック Heap (C#・VBアプリ) 1FFF0000 プログラム&変数 内蔵フラッシュ(1MB) 00100000 設定情報 000E0000 ER_CONFIG Deployment 領域 (C#・VBアプリ用) 00080000 TinyCLR ER_FLASH 00020000 TinyBooter (ブートローダ) 00000000 ホスト上のMFDeployがデバイス上のTinyBooterと 通信し、TinyCLR, 設定情報をデバイスに書き込む TinyCLR移植 機能 • .NET Framework CLI インタプリタ • C#からNativeライブラリを呼ぶ仕組み • Nativeライブラリ – CMSISに相当 移植手順 • 機能の選択 -> TinyCLR.proj • メモリ配置 -> scatterfile • C#アプリからの動作確認 補足 • ソースコードの変更ほとんど必要なし • メモリ制限のために機能選択が必要 C# ・ VB アプリ 内蔵フラッシュ(1MB) 設定情報 Deployment 領域 (C#・VBアプリ用) TinyCLR TinyBooter (ブートローダ) CLR PAL HAL Native ライブラリ CPU固有 TinyCLR 移植の参考資料 • インターフェイス2011年3月号 – 組み込みで使うVisual C#と.NET Micro Framework • .NET Micro Framework SDKヘルプファイル • .NET Micro Framework Porting Kit ヘルプファイル • .NET Micro Framework Home Page • http://www.microsoft.com/en-us/netmf/default.aspx • .NET Micro Framework 開発者向け技術情報 • http://msdn.microsoft.com/ja-jp/netframework/bb267253 • CodePlex .NET Micro Framework • http://netmf.codeplex.com/ C#(Visual Basic)アプリ動作確認 C# ・ VB ソースファイル C#・VB コンパイラで中間言語(CIL)作成 .NET アセンブリ Metadata processor – 最適化peファイル作成 .NET Micro Frameworkアセンブリ MFDeploy ・Visual Studo経由でDeployment (配置) デバイス Visual Studio経由で実行、デバック Deployコマンドを実行すると、ホスト上のVisual Studio からデバイス上のTinyCLRと通信し、PEファイル形式 の.NETアセンブリを書きこむ SDK 構成 • C:¥Program Files¥Microsoft .NET Micro Framework • Assembly – NETMFクラスライブラリ ファイル • Font • Tools - MFDeploy: デバイスへの書き込みなどを行う - TFConvert: フォントファイルの変換ツール - http://blogs.msdn.com/b/hirosho/archive/2011/08/19/howt oembedjapanesefontinnetmfdevice.aspx SDK サンプル プログラム Clock ExtendedWeakReference FileSystem HelloWorldClient_MF HelloWorldClient_WCF HelloWorldServer_MF HelloWorldServer_WCF HttpClient HttpServer IEEE_802_15_4_Network IEEE_802_15_4_PHY InkCanvasSample Mouse Puzzle SampleEmulator SimpleService SimpleServiceClient SimpleTouchInput SimpleWPFAppliaction SocketCilent SocketServer TemperatureEmulator TemperatureSample Threading TouchCalibration WeakDelegates WKFM3拡張 ボード + WX拡張メ FM3基板 WKFM3拡張 WXMP3PLCD-F LCD モリ NET CQ_FRK_FM3 ボード MP3PLCD-F (1MB) 必要 必要 必要 × × × ○ ○ ○ ○ ○ 必要 必要 × × ○ ○ × × × ○ N/A N/A N/A ○ × × × × N/A N/A N/A N/A 推奨 必要 × △ × ○ 必要 × ○ × ○ NotTested NotTested NotTested NotTested NotTested NotTested NotTested NotTested 必要 必要 × × ○ ○ NotTested NotTested NotTested NotTested 必要 必要 × × ○ ○ N/A N/A N/A N/A 推奨 必要 × × × ○ 推奨 必要 × × × ○ 必要 必要 × × ○ ○ 必要 必要 × × ○ ○ 推奨 必要 × △ × ○ 必要 × ○ × ○ N/A N/A N/A N/A 必要 必要 × × ○ ○ ○ ○ ○ ○ 必要 必要 × × ○ ○ ○ ○ ○ ○ 備考 NNTPで時刻設定 データをフラッシュに保存 SDカードのファイルの表示 WKFM3はメモリ不足で動作しない ホスト上で動作。デバイス上では動作しない WKFM3はメモリ不足で動作しない ホスト上で動作。デバイス上では動作しない メモリ増設推奨。Webページにアクセス httpsとMFUpdate機能を削除。 お絵かきプログラム Serial Firmwareが必要。USBマウスとなる。 3x3のパズル ホスト上で動作。デバイス上では動作しない WKFM3はメモリ不足で動作しない WKFM3はメモリ不足で動作しない タッチパネルの操作 アイコンメニュー メモリ増設推奨。Webページにアクセス HTTPサーバ。 ホスト上で動作。デバイス上では動作しない Virtual キーの定義が必要 スレッド。 タッチパネルのキャリブレーション データをフラッシュに保存 8月号第1章デモ実演 • Visual Studioのメニュー • リスト1の説明 – C#の文法概要 – – – – Using : ライブラリの使用宣言 Namespase : クラスの階層構造 Class : オブジェクトの設計図 参照 : ライブラリの登録。 • オブジェクトブラウザでAPIの仕様の確認 – ライブラリAPIの調べ方 • SDK オンラインヘルプファイル。 • http://msdn.microsoft.com/en-us/library/ee435793.aspx • 実行・デバッグ 注意点 • 配置エラーの対応 – 処理が中断し、配置エラーのダイアログが表示され たら、いいえを選択。FM3マイコン基板のリブート後、 配置を再実行する。 – 処理が中断しない場合は、Taskmgrを起動、Visual Studioを強制終了。その後、配置を再実行する • 配置処理が実行中(中断していないとき)、デバ イスをリブートすると、OSがハングする場合があ る。中断するまで待つか、TaskmgrでVisual Studioを強制終了し、再起動する C# サンプル1 SampleLED using System.Threading; using Microsoft.SPOT; using Microsoft.SPOT.Hardware; namespace SampleLED { public class Program { #if CQ_FRK_FM3 static Cpu.Pin pinLED = (Cpu.Pin)0xF3; // LED: PF3 pin #endif #if CQ_FRK_RX62N static Cpu.Pin pinLED = (Cpu.Pin)0x0D; // LED: P15 pin (CN2-18) = 1*8+5 = 13 #endif #if CQ_FRK_NXP_ARM static Cpu.Pin pinLED = (Cpu.Pin)50; // LED: P1[18] pin = 1*32+18 = 50 #endif public static void Main() { OutputPort GPIO_Out = new OutputPort(pinLED, true); Int32 i = 0; while (true) { Debug.Print("Hello, World! " + i.ToString() + " times"); GPIO_Out.Write(false); Thread.Sleep(500); GPIO_Out.Write(true); Thread.Sleep(500); i++; } } } } C# サンプル2 SampleTimer using System; using System.Threading; using Microsoft.SPOT; namespace SampleTimer { public class Program { static void RunMe(object o) { Debug.Print("From timer!"); } public static void Main() { Timer MyTimer = new Timer(new TimerCallback(RunMe), null, 5000, 1000); Debug.Print( "The timer will fire in 5 seconds and then fire priodically every 1 second"); Thread.Sleep(Timeout.Infinite); } } } C# サンプル3 SampleGPIOInputPort using using using using System; System.Threading; Microsoft.SPOT; Microsoft.SPOT.Hardware; namespace SampleGPIOInputPort { public class Program { static Cpu.Pin pinButton = (Cpu.Pin)0xF6; public static void Main() { InputPort GPIO_In = new InputPort(pinButton, false, Port.ResistorMode.PullUp); Int32 i = 0; while (true) { if (GPIO_In.Read()) Debug.Print("Botton is High"); else Debug.Print("Botton is Low"); Thread.Sleep(1000); i++; } } } } C# サンプル4 SampleGPIOInterruptPort using using using using System; System.Threading; Microsoft.SPOT; Microsoft.SPOT.Hardware; namespace SampleGPIOInterruptPort { public class Program { static Cpu.Pin pinButton = (Cpu.Pin)0xF6; static void GPIO_Interrupt_OnInterrupt(uint data1, uint data2, DateTime time) { Debug.Print("The button is pressed"); } public static void Main() { InterruptPort GPIO_Interrupt = new InterruptPort(pinButton, false, Port.ResistorMode.PullUp, Port.InterruptMode.InterruptEdgeLow); GPIO_Interrupt.OnInterrupt += new NativeEventHandler(GPIO_Interrupt_OnInterrupt); Int32 i = 0; while (true) { Thread.Sleep(1000); i++; } } } } C# アプリケーション参考サイト • CodePlex .NET Micro Framework • http://netmf.codeplex.com/ • 他のCPUの移植例 • 便利なクラスライブラリ • Netduino Forum • http://forums.netduino.com/ • TinyCLR wiki • http://wiki.tinyclr.com/index.php?title=Main_Page • GHI製品中心だが、豊富なサンプルプログラム エミュレーターの実行 実機がなくとも、LCDやネットワークプログラムが 可能 • Puzzle • Clock • FileSystem • HttpClient • SimpleWPFApplication ライブラリ拡張 CLRのGPIO機能を利用して、C#から呼べるボタン機能の実装 • Managed Driver – TinyCLRを呼び出すC# (Manageコード)のライブラリ – 追加機能の実現 – 例. TinyCLRのGPIO APIで Buttom機能の実装 (SDK) public class Button : IDisposable { protected InterruptPort m_interruptPort; public Button( Cpu.Pin pin, NativeEventHandler callback ) { m_interruptPort = new InterruptPort( pin, true, Port.ResistorMode.PullUp, Port.InterruptMode.InterruptEdgeLow ); if(callback != null) { m_interruptPort.OnInterrupt += callback; } • Custom Interop Library – NativeコードとC#(Manage コード)のライブラリ – 高速化が要求される場合 – 例. フレームバッファ(物理ア ドレス)アクセスのAPIの実装 } public Cpu.Pin Id { get { return m_interruptPort.Id; } } public void Dispose() { m_interruptPort.Dispose(); } } http://blogs.msdn.com/b/smaillet/archive/2009/04/27/using-interop-in-the-net-micro-framework-v3-0.aspx : AddressSpace Sample作成方法 補足: SD カード使い方 • FM3マイコンの実装では、拡張ボードありなしでSD カードの実装は異なる。 – FS_Config.cppの設定が異なる。 – 拡張ボードなし: StorageDevice.MountSDで明示的にマウ ントする – 拡張ボードあり: SDカード挿入で自動マウント • StorageDeviceはNativeコードとManageコードからなる 拡張ライブラリ。CQ.NETMF.SD。Visual Studioでスケル トンを作成し、実装する • 参考: AddressSpace http://blogs.msdn.com/b/smaillet/archive/2009/04/27 /using-interop-in-the-net-micro-framework-v3-0.aspx