並列処理について

mbed についてのご質問はこちら。情報交換などにもご利用ください。

並列処理について

投稿記事by 吉田幸司 » 2014年6月05日(木) 23:43

こんにちは、唐津東高校の吉田です。

mbed1つで同時に2つの処理をしたいと思い過去の記事を見てみたところ、
RTOSのスレッド機能を使うと並列処理ができるとのことなのですが、
タイマ割り込みではなく最初から同時に別の処理をさせることなどは可能でしょうか?

http://mbed.org/users/takashikojo/notebook/r/
日本語訳してあるRTOSの説明のそれらしい関数など調べてみたのですが、
mbedでの使用に適していそうなものを見つけられませんでした。

よろしくお願いします。
吉田幸司
 
記事: 23
登録日時: 2013年12月29日(日) 15:01
お住まい: 佐賀県

Re: 並列処理について

投稿記事by yamaguch » 2014年6月06日(金) 10:02

吉田さん、

いろいろありますが、例えば通信のプログラムは、並列処理を使うときれいに書けます。
XBee のライブラリは、rtos を使って作っています。

山口
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37

Re: 並列処理について

投稿記事by 吉田幸司 » 2014年6月08日(日) 12:21

山口様、返信ありがとうございます。
とりあえず一番シンプルな
Thread A (B)の形でやってみようと思います。
ありがとうございました。
吉田幸司
 
記事: 23
登録日時: 2013年12月29日(日) 15:01
お住まい: 佐賀県

Re: 並列処理について

投稿記事by yamaguch » 2014年6月09日(月) 10:32

Thread を理解するには具体的な問題を解いてみるとよく分かります。
例えば mbed の 4 個の LED を次のように点滅させてみてください。

LED1 は 0.2 秒ごとに点滅
LED2 は 0.3 秒ごとに点滅
LED3 は 0.5 秒ごとに点滅
LED4 は 0.7 秒ごとに点滅

Ticker でもできますが、Thread を使って書いてみると面白いと思います。

山口
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37

Re: 並列処理について

投稿記事by yamaguch » 2014年6月13日(金) 12:15

解答例です ;)

コード: 全て選択
#include "mbed.h"
#include "rtos.h"

struct Params {
    Params(PinName pinName, float period) :
        led(pinName), period(period) {
    }

    DigitalOut led;
    float period;
};

void blinker(void const *args)
{
    Params& params = *(Params *) args;
    while (true) {
        params.led = 1;
        wait(params.period);
        params.led = 0;
        wait(params.period);
    }
}

int main()
{
    Params params1(LED1, 0.2);
    Params params2(LED2, 0.3);
    Params params3(LED3, 0.5);
    Params params4(LED4, 0.7);

    Thread thread1(blinker, &params1);
    Thread thread2(blinker, &params2);
    Thread thread3(blinker, &params3);
    Thread thread4(blinker, &params4);

    Thread::wait(osWaitForever);
}


山口
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37

Re: 並列処理について

投稿記事by 吉田幸司 » 2014年6月13日(金) 22:22

山口様、返信ありがとうございます。

一つのスレッドを複数のものとして利用することもできるのですね、参考になります。
すべて理解できるように勉強します。
ありがとうございます。
吉田幸司
 
記事: 23
登録日時: 2013年12月29日(日) 15:01
お住まい: 佐賀県

Re: 並列処理について

投稿記事by 吉田幸司 » 2014年6月17日(火) 17:27

唐津東高校、吉田です。

Thread::wait()と通常のwait()はどのように違うのですか?
実際に使ってみても特に違いが判らないのですが、
Thread::wait()のより有効な使い方がありましたら教えていただけるとありがたいです。
吉田幸司
 
記事: 23
登録日時: 2013年12月29日(日) 15:01
お住まい: 佐賀県

Re: 並列処理について

投稿記事by yamaguch » 2014年6月18日(水) 10:50

吉田さん、

私の解答例のコードでは偶然両方を使っています ;)

ドキュメントは見ましたか。
ドキュメントで分からなければソースコードを見てください。

山口
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37

Re: 並列処理について

投稿記事by 吉田幸司 » 2014年6月18日(水) 18:08

山口様、返信ありがとうございます。

ドキュメントとはこれでしょうか?
http://mbed.org/handbook/RTOS

wait()とThread::wait()では指定する秒数の細かさのみが異なる、ということでしょうか。

よろしくお願いします。
吉田幸司
 
記事: 23
登録日時: 2013年12月29日(日) 15:01
お住まい: 佐賀県

Re: 並列処理について

投稿記事by yamaguch » 2014年6月18日(水) 22:19

前のリプライにヒントを3つあげました。
あとは納得できるまで自分で調べてください。

山口
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37

次へ

Return to mbed 質問箱

cron