RTOSのセマフォの使い方についての疑問
今、H8S2368というマイコンを使って、RTOSのuCOSについて勉強しているところなのですが、RTOSがどのように動いているのかというのをイメージすることができなくて質問させていただきます。
たとえば、3つのタスクを宣言して、Swというタスクで、OscWaitというセマフォを使って、”OSSemPend(OscWait, 500, &err);”の500ミリ秒でタイムアウトが発生して、”OSSemPost(OscWait);”でセマフォを解除して、OscWaitで止まっていたOsc,Osc02のタスクを動かした場合、この場合、どのようにタスク内のプログラムは動きだすのでしょうか。
たぶんなのですが、Oscのタスクの方がプライオリティが高いので、こちらがまず動いて、while文で再度”OSSemPend(OscWait, 100, &err);”でOscWaitの信号が赤になって止まって、それから、Osc02のタスクが動き始めて、というのを繰り返すものと考えているのですが、そのように考えてよいのでしょうか?
#define TASK_SW_ID 5
#define TASK_OSC_ID 6
#define TASK_OSC02_ID 7
#define TASK_SW_PRIORITY 30
#define TASK_OSC_PRIORITY 31
#define TASK_OSC02_PRIORITY 32
#define TASK_OSC_STK_SIZE 0x200
#define TASK_OSC02_STK_SIZE 0x200
#define TASK_SW_STK_SIZE 0x200
DECLARE_TASK(Sw,TASK_SW_STK_SIZE,TASK_SW_ID);
DECLARE_TASK(Osc,TASK_OSC_STK_SIZE,TASK_OSC_ID);
DECLARE_TASK(Osc02,TASK_OSC02_STK_SIZE,TASK_OSC02_ID);
CAEATE_TASK(Sw ,TASK_SW_STK_SIZE ,TASK_SW_PRIORITY,0x00/*OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR*/);
CAEATE_TASK(Osc ,TASK_OSC_STK_SIZE ,TASK_OSC_PRIORITY,0x00/*OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR*/);
CAEATE_TASK(Osc02 ,TASK_OSC02_STK_SIZE ,TASK_OSC02_PRIORITY,0x00/*OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR*/);
OS_EVENT *OscWaitt;
DECLARE_TASK_FUNC(Sw)
{
BYTE err;
OscWait = OSSemCreate(0);
parg = parg;
while(1)
{
OSSemPend(OscWait, 500, &err);
OSSemPost(OscWait);
}
}
DECLARE_TASK_FUNC(Osc)
{
BYTE err;
OscWait = OSSemCreate(0);
parg = parg;
while(1)
{
OSSemPend(OscWait, 100, &err);
if(err != 0){
continue;
}
OSC_temp++;
printf("OSC_temp %d \n\r",OSC_temp);
}
}
DECLARE_TASK_FUNC(Osc02)
{
u16 cur,old;
u8 OSC_temp02=0;
BYTE err;
OscWait = OSSemCreate(0);
parg = parg;
while(1)
{
OSSemPend(OscWait, 100, &err);
if(err != 0){
continue;
}
OSC_temp02++;
printf("OSC_temp02 %d \n\r",OSC_temp02);
}
}
お礼
仰るとおりですね。 回答ありがとうございました。