いろんなものはつながっている

エンベデッドシステム(3) リアルタイムOS

エンベデッドスペシャリスト試験の午後の問題では状態遷移図やタスク関連図を用いてシステム(多くはリアルタイムOS)が説明されている。システムは各々の機能を担う「タスク」同士が「メッセージ」をやりとりすることで動作している。問題文はあくまで問題であるが実際にリアルタイムOSを作成したことはない人間にとってはシステムの設計手順を知ることができて勉強になる。もちろん現実は問題文のように単純ではないだろうが初心者がいきなり複雑な設計をみてもわからないから、これはこれでいいのではないかと思う。

タスクの状態遷移

起動しているタスクは、実行可能状態、実行状態、待ち状態という状態の間を遷移する。OSが複数の間で実行権を移すために実行状態と実行可能状態との間で遷移させることをディスパッチという。

・実行状態
タスクがCPUで実行されている

・実行可能状態
タスクを実行するための準備はすべて整っているが優先度の高いタスク、または同じ優先度をもつほかのタスクが実行状態にあるためタスクを実行できずにまたされている状態

・待ち状態
外部からインベントを待っていたり実行が止まっている状態

リアルタイムOS2

同期制御

タスク同士が連携して動作するためには複数のタスクがタイミングをあわせて動作する機能が必要となる。主なものにセマフォ、ミューテックス、イベントフラグがある。

・セマフォ
排他制御が必要な資源の管理に利用される。該当資源に対応するセマフォを獲得したらその資源を使うことができるという仕組み。資源を獲得する操作をP操作、資源を解放する操作をV操作という。

リアルタイムOS3

WindowsにはCreateSemaphoreというセフォマを生成するAPIが準備されている。

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <process.h>

HANDLE hSemaphore;

unsigned __stdcall func1(void* p)
{
	printf("func1が呼び出されました\n");
	Sleep(5000);

	// セマフォの所有権を要求(P操作)
	WaitForSingleObject(hSemaphore, INFINITE);

	printf("func1がセフォマ獲得\n");
	int* pSleepTime = (int*)p;
	printf("%d\n", *pSleepTime);
	Sleep(*pSleepTime);
	
	// セマフォの所有権を解放(V操作)
	LONG nPreviousCount;
	ReleaseSemaphore(hSemaphore, 1, &nPreviousCount);
	printf("func1がセフォマ解放\n");

	return 0;
}

unsigned __stdcall func2(void*)
{
	printf("func2が呼び出されました\n");

	// セマフォの所有権を要求(P操作)
	WaitForSingleObject(hSemaphore, INFINITE);

	printf("func2がセフォマ獲得\n");
	Sleep(5000);

	// セマフォの所有権を解放(V操作)
	LONG nPreviousCount;
	ReleaseSemaphore(hSemaphore, 1, &nPreviousCount);
	printf("func2がセフォマ解放\n");

	return 0;

}

int main(int argc, char* argv[])
{
	// セマフォを作成
	hSemaphore = CreateSemaphore(NULL, 1, 1, "sample_semaphore");

	// スレッドを呼び出す
	HANDLE hThread1, hThread2;
	unsigned int thrdID1, thrdID2;
	int nArg = 5000;
	hThread1 = (HANDLE)_beginthreadex(NULL, 0, func1, &nArg, 0, &thrdID1);
	hThread2 = (HANDLE)_beginthreadex(NULL, 0, func2, NULL, 0, &thrdID2);

	WaitForSingleObject(hThread2, INFINITE );
	WaitForSingleObject(hThread1, INFINITE );
	
	CloseHandle(hThread1);
	CloseHandle(hThread2);
	CloseHandle(hSemaphore);

	return 0;
}

・イベントフラグ
インベントフラグの値でタスクの状態を制御する。たとえば、イベントフラグが0のときは待ち状態、1のときは実行可能状態にというようにタスクを制御し、他のタスクがイベントフラグをオン、オフすることで、タスク間で同期をとった動作が可能となる。
リアルタイムOS1

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

スポンサード リンク

カテゴリー

スポンサード リンク