FreeRTOS临界区应用

两个任务使用同一个临界资源时需要进入临界区

什么是临界资源和临界区点击打开链接

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;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值