« FEZ Domino Get | トップページ | FEZ Domino Tips (1) - プログラム実行を少し早くする方法 »

FEZ Dominoでマルチスレッドを動かす

TinyCLR.comに.NET Micro Frameworkの使い方を解説したビギナーズガイドを見つけました。まだ読みかけですが、この内容を理解すればFEZの機能を一通り使うことができそうです。今回は、マルチスレッド機能を使って2つのLEDを異なるインターバルで点滅するサンプルを書いてみました。


サンプルコード

サンプルコードをコンパイルするためには、アセンブリ(コンパイル済みのライブラリ)への参照を追加設定する必要があります。今回は以下のアセンブリを設定しました。詳しくは、ビギナーズガイドの7.2章を参照して下さい。

  • FEZDomino_GHIElectronics.NETMF.FEZ(FEZMini_GHIElectronics.NETMF.FEZも参照設定に加えると、名前空間の定義が重複してエラーとなります。使っているハードに合わせて、FEZDomino or FEZMiniの何れかを設定)
  • GHIElectronics.NETMF.Hardware
  • GHIElectronics.NETMF.System
  • Microsoft.SPOT.Hardware
  • Microsoft.SPOT.Native
  • System

サンプルコードは以下です:

using System;
using System.Threading;
using GHIElectronics.NETMF.FEZ;
using GHIElectronics.NETMF.Hardware;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;

namespace FezMultiThred
{
    public class Program
    {
        static OutputPort LED1;
        static OutputPort LED2;
        static OutputPort OnboardLED;

        public static void Main()
        {
            LED1 = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.Di0, false);
            LED2 = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.Di1, false);
            OnboardLED = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.LED, false);
            Thread thread1 = new Thread(Led1Thread);
            Thread thread2 = new Thread(Led2Thread);

            thread1.Start();
            thread2.Start();

            Thread.Sleep(Timeout.Infinite);
        }


        // Thread to blink LED1
        public static void Led1Thread()
        {
            while (true)
            {
                LED1.Write(!LED1.Read());   // Read LED1 port -> Invert -> Write new status
                Thread.Sleep(100);
            }
        }

        // Thread to blink LED2
        public static void Led2Thread()
        {
            while (true)
            {
                LED2.Write(!LED2.Read());   // Read LED2 port -> Invert -> Write new status
                Thread.Sleep(1000);
            }
        }

    }
}
  • 18~19行:LED1としてDi0、LED2としてDi1ピンを割り当てています
  • 21~22行:LED1とLED2を制御するスレッドを生成
  • 24~27行:LED制御スレッドを起動し、自身(メインスレッド)はスリープ状態に遷移
  • 31行以降:Led1Threadは100ms周期でLED1を点滅、Led2Threadは1000ms周期でLED2を点滅させます
  • 36行目のコードはドキュメントから持ってきましたがちょっとトリッキー。先ず、現在の出力ポートの状態を読み取って(Pin value register: FIOPINを読み取っているのではないかと想像)、それを反転して書き込むことによって、LEDの点滅状態を反転します

ピン番号の指定は、OutputPort((Cpu.Pin)FEZ_Pin.Digital.まで入力すると、インテリセンス君がDigitalOutで使えるポート(この場合は全ピンが対象)を候補として示してくれるので楽ちんです。

ちなみにPWMを使いたい場合は、PWM((PWM.Pin)FEZ_Pin.PWM.まで入力すると、PWMが使用できるピンの候補(Di3, Di5, Di6, Di9, Di10 LED)を出してくれます。Visual Studioを使った方ならご存知だと思いますが、関数・パラメーター名の補完機能も非常に賢いため、実際のタイプ量は文字数の半分以下で済みます。自分はこのせいで、メンバー変数・メソッド名をいつまでたっても覚えられないです・・

LEDは写真のように、電流制限抵抗をかましてMCUから直接ドライブしています。電流はLEDあたり10mA程度にしているため、2個くらいならMCUで直接ドライブしてもOKでしょう。

TwoLED_Control


Digitalピンの初期値

20行目のコードを入れずにこのサンプルを動かすと、起動後もオンボードLEDが半点灯状態となります。(制御対象のLEDもリセット中は半点灯状態)。オンボードLEDの電圧を計ると1.6Vちょい出ています。LPC2388はリセット時全ピンの機能選択がGPIO、入力、プルアップとなるため、プルアップ抵抗経由の電圧が見えているのではと思います。LEDを消すために、20行目のコードでオンボードLEDをつないでいるポートを出力、Lowレベルに初期化しています。

上記のLED制御くらいファーム(CLR)の初期化処理でやってくれてもよいのにと思いますが、、ちなみに、mbedでもオンボードLEDがうっすらと(自分の固体では電気を消さないと見えないくらい)点灯します。


マルチスレッドはRTOS相当?

自分はRTOSを使ったことがないため比較ができないのですが、マルチスレッドを使うと、今回のように複数の制御を行う処理がエレガントに記述できますね。割り込みを使えばリアルタイム処理もできるのではないかと思います。TinyCLR.comのFAQには、「FEZ(.NET MF)はリアルタイムか?」という問いに対して、厳密なリアルタイムではないが、1~10ms程度のレスポンスは可能でありこの範囲では「ほぼリアルタイム」だと言っています。

« FEZ Domino Get | トップページ | FEZ Domino Tips (1) - プログラム実行を少し早くする方法 »

dotNet MF」カテゴリの記事

コメント

「1~10ms程度のレスポンスは可能であり」
10msなら確実であるなら、10msのリアルタイム性が有るとは言えるのかもしれない。

スレッドの優先度はいじれないのかなぁ?。
確か使っているマイコンはARMでしたっけ、遅いマイコンを使っている訳では無いので、マイコンの性能からすれば一般的なRTOSを使えば数マイクロ秒の応答性は出せると思うけれど。

コメントありがとうございます。
スレッドの優先度は5段階で設定できます(通常の.Net Frameworkと同様で、Heigest, AboveNormal, Normal, BelowNormal, Lowest)。


FAQには、クリティカル処理中は他のスレッドを止める・優先度を下げるなどしてレスポンス時間を下げることができるようなことが書いてありました。ただ、NETMF本来の方向性はリアルタイム処理ではなく、LCDにWPFベースのきれいなメニューを出して、それをタッチパネルで操作するような使い方を念頭に置いているように思います。


FEZ DominoのMCUはLPC 2388 72MHzです。

この記事へのコメントは終了しました。

« FEZ Domino Get | トップページ | FEZ Domino Tips (1) - プログラム実行を少し早くする方法 »

2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ