两个任务使用同一个临界资源时需要进入临界区
什么是临界资源和临界区点击打开链接
taskENTER_CRITICAL();
taskEXIT_CRITICAL();
使用临界区前:
static void hello_task(void *pvParameters)
{
for (;;)
{
PRINTF("Hello world1.\r\n");
}
}
static void hello_task2(void *pvParameters)
{
for (;;)
{
PRINTF("Hello world2.\r\n");
}
}
输出
Hello wHelloorld2. world
Hell1.
Ho worlello wd2.
Horld1ello w.
Helorld2.lo wo
Hellrld1.o worl
Helld2.
Ho worlello wd1.
orld2.Hello
Hellworldo worl1.
Hed2.
Hllo wello world1.orld2.
Hel
Helllo woro worlld1.d2.
H
Helloello w worldorld21.
He.
Helllo wolo world1.rld2.
Hello
Hell worldo worl1.
Hed2.
llo woHello rld1.world
Hello2.
He worldllo w1.
Heorld2.llo wo
Helrld1.lo wor
Hellold2. world
Hello1.
He worlllo wod2.
Hrld1.ello
Helloworld2 world.
He1.
Hello wollo world2.rld1.
Hell
Helloo worl world2.
Hd1.
Hello wello orld2.world1
Hell.
Heo worlllo wod2.
Hrld1.ello w
Hellorld2.o wor
Hellld1.
o worlHellod2.
H worldello w1.
Horld2.ello w
Hellorld1o worl.
Held2.
Hlo woello wrld1.orld2.
Hell
Hello worlo world1.
d2.
HHello ello wworld1orld2.
Hel.
Hello worlo wold1.
rld2.Hello
Hellworld1o worl.
Held2.
lo worHello ld1.
worldHello 2.
Heworld1llo w.
Helorld2.lo wor
使用临界区后:
static void hello_task(void *pvParameters)
{
for (;;)
{
taskENTER_CRITICAL();
PRINTF("Hello world1.\r\n");
taskEXIT_CRITICAL();
}
}
static void hello_task2(void *pvParameters)
{
for (;;)
{
taskENTER_CRITICAL();
PRINTF("Hello world2.\r\n");
taskEXIT_CRITICAL();
}
}
输出:
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
Hello world2.
Hello world1.
void *pvTimerGetTimerID( const TimerHandle_t xTimer )
{
Timer_t * const pxTimer = ( Timer_t * ) xTimer;
void *pvReturn;
configASSERT( xTimer );
taskENTER_CRITICAL();
{
pvReturn = pxTimer->pvTimerID;
}
taskEXIT_CRITICAL();
return pvReturn;
}