...

FM3マイコン対応 NETMicroFramework入門

by user

on
Category: Documents
23

views

Report

Comments

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
Fly UP