RTOS: RTOSのためのpthread、その1

 RTOSで処理をするためにpthreadの体験をするのが目的。RTOSとは?スレッド処理とは?というのは他の解説に任せる。

TIのCCS上で直接いろいろ試してもよいが、汎用的なC言語でのpthreadをまず触ってみる。

C言語の環境整備

GCCが使える環境があればそれを利用すればよく、ここは飛ばしてOK。経験のない方向けにPleiades (プレアデス) をインストールする手順の記録

https://mergedoc.osdn.jp/


DLしたzipを展開して適当なフォルダに置くと終わり。

eclipseフォルダの下にあるeclipse.exeを起動する。

ワークスペースを聞かれるが、そのまま起動。


C管理ビルド


プロジェクト名に、Helloといれる


新規→ソースファイル

ソース・ファイルにHello.cと拡張子.cまで入れたファイル名を入れる

お決まりのHello.cをコンパイルして実行する。

/*

 * Hello.c

 *

#include <stdio.h>

int main(void)

{

    printf("hello, world\n");

    return 0;

}


コンソールにHello, worldが表示されていればOK。ここまではC言語の環境の整備をしているだけ。

Pthread

Pleiadesの場合、特にpthreadを別にインストールしてこなくても動く。Mingwなどを利用している場合で最初に入れていない場合は別途ダウンロードする。

以下を新たたソースファイルでタイプする。

/*This is a test for pthread.

 * A simple test which has 2 threads.

 * Always randamly thread excutes.

 * (last finish A or B, randamly changed.)

 */

#include <stdio.h>

#include <pthread.h>

void* funcA(void* ptr) {

    int i = 0;

    for (i = 1; i <= 1000; i++) {

        printf("A:%d\n",i);

    }

}

void* funcB(void* ptr) {

    int i = 0;

    for (i = 1; i <= 1000; i++) {

        printf("B:%d\n",i);

    }

}

int main()

{

    pthread_t thread1, thread2;

    pthread_create(&thread1, NULL, funcA, NULL);

    pthread_create(&thread2, NULL, funcB, NULL);

    pthread_join(thread1, NULL);

    pthread_join(thread2, NULL);

    return 0;

}

解説:

#include <pthread.h>

をインクルードする。

 pthread_tでスレッドのハンドルを定義する。上の例はスレッドを2つ宣言している。

 pthread_createの関数は

引数1:ハンドルのバッファのアドレス(アドレスで渡すので&をつける)

引数2:属性(これは後ほど。属性の中で優先順位等を与える、ここではNULLとしデフォルトの値)

引数3:新しいスレッドのエントリポイント。処理を割り当てる。ポインタ渡しなので関数(funcAとかfuncB)の前に*がついている。

引数4:スレッドに渡す引数。何か値を渡す場合はここにいれる。これももちほど。

 pthread_createでスレッドを生成して、pthread_join を呼ぶことによって、生成したスレッドが終了するまで待機

実行結果:



実行するたびにAで終わったり、Bで終わったりとランダムになる。コマンドプロンプトから実行するとAとBが入れ替わり実行(平行して実行)されているのが確認できる。

スレッド2つの例だが、3つ、4つとしても基本的に数が増えるだけ。


ThreadテストのCソースファイル



コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

CH9329で日本語キーボード109で正しく表示する方法