RTOS: RTOSのためのpthread、その1
RTOSで処理をするためにpthreadの体験をするのが目的。RTOSとは?スレッド処理とは?というのは他の解説に任せる。
TIのCCS上で直接いろいろ試してもよいが、汎用的なC言語でのpthreadをまず触ってみる。
C言語の環境整備
GCCが使える環境があればそれを利用すればよく、ここは飛ばしてOK。経験のない方向けにPleiades (プレアデス) をインストールする手順の記録
https://mergedoc.osdn.jp/
eclipseフォルダの下にあるeclipse.exeを起動する。
ワークスペースを聞かれるが、そのまま起動。C管理ビルド
プロジェクト名に、Helloといれる
お決まりの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つとしても基本的に数が増えるだけ。
コメント
コメントを投稿