Sim's blog

電子工作はじめてみました

Netduinoでマルチスレッド

2010-08-25 01:15:20 | Netduino
Netduinoがきましたの続きになります。

マルチスレッドで遊んでみました。マルチスレッドがあると並列実行(実際はCPUは一つなので時分割で交互に動作)を簡単に記述できます。
以下の例題では、2つのLEDを、LED1はスレッドで250ミリ秒毎、LED2はメインスレッドで150ミリ秒毎に反転します。
using System;
using System.Threading; // Thread
using Microsoft.SPOT;   // Debug
using Microsoft.SPOT.Hardware; // OutputPort
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino; // Pins

namespace ThreadTest1
{
    public class Program
    {
        static OutputPort LED1 = new OutputPort(Pins.ONBOARD_LED, false);
        static OutputPort LED2 = new OutputPort(Pins.GPIO_PIN_D13, false);

        public static void Main()
        {
            // write your code here
            Debug.Print("Hello, Multi-Threading");
            
            Thread thread = new Thread(flash);  // 新しいスレッドの作成
            thread.Start();                     // スレッドの実行開始(ここで実行が並列になる)

            // 本スレッド側でもLED2をチカチカ
            // 無限ループ
            while (true)
            {
                LED2.Write(!LED2.Read());       // LED2反転
                Thread.Sleep(150);              // 150ミリ秒待つ
            }
        }

        // スレッド本体
        static void flash()
        {
            // 無限ループ
            while (true)
            {
                LED1.Write(!LED1.Read());       // LED1反転
                Thread.Sleep(250);              // 250ミリ秒待つ
            }
        }
    }
}

スレッドを使うには、まず準備として「using System.Threading;」をすることでThreadクラスを使えるようにします。
次に「Thread thread = new Thread(flash);」とすることでスレッドを実行するメソッド(flash)を指定します。スレッドを実行するメソッドはvoid f()という形でないといけません。この段階ではスレッド自体はスタートしていません。
最後に「thread.Start();」とすることでスレッドが実行開始されます。この段階で処理は2つに分かれて並列実行(CPUは一つなので時分割で交互に実行)されます。
すごく簡単です。

今回はスレッドの優先順位を変えたりとか、スレッドの終了待ちとかをしないので、「new Thread(flash).Start();」のように書いても動きます。1行で済んじゃいます。

残念ながら、RTOSのかわりに使えるほどではありません。RTOS(リアルタイムOS)は時間制約に関する最悪値が保証されていますが、.Net Microframeworkでは保証されていません。RTOS的な機能が必要なときは、RTOS上に.Net Microframeworkを実装することになるみたいです。例えば日立超LSIでT-Kernel上に.Net Microframeworkを載せるというソリューションを提供しています(ニュースリリース)。

通常の.Net Frameworkではdelegateを作ってBeginInvokeをする方法でもマルチスレッドを実現できるそうですが、.Net Micro Frameworkで動かそうとするとサポートしていないというエラーが出て実行できませんでした。


参考にしたのは以下の3つの記事です。
@ITの連載「.NETマルチスレッド・プログラミング入門
PS3とLinux、電子工作もさんのブログ「FEZ Dominoでマルチスレッドを動かす
TinyCLRの「Beginners Guide to C# and .NET Micro Framework」(pdf)のThreadingの章

最新の画像もっと見る

コメントを投稿