前言
本文对ucosiii中的临界区代码进行分析
正文
ucos源码中经常出现如下代码:
CPU_SR_ALLOC();
OS_CRITICAL_ENTER();
OS_CRITICAL_EXIT_NO_SCHED();
这是为了开启临界区,临界区内将不会出现任务切换。
假设没有临界区,如果有甲乙
两个任务,甲
要执行一段代码把abc
三个值设置成123
,如果甲
把ab
设置完12
后出现任务切换,切换到任务乙
,乙
要把a
设置成3
,那么切换回来后,甲
继续把c
设置成3
,这时甲
认为abc
的值为123
,实际上却是323
。
在OS_CRITICAL_ENTER()
和OS_CRITICAL_EXIT_NO_SCHED()
之间的代码称为临界区,临界区内将不会产生任务切换。
CPU_SR_ALLOC()
的源码如下:
#define CPU_SR_ALLOC() CPU_SR cpu_sr = (CPU_SR)0
只是声明了一个变量cpu_sr
OS_CRITICAL_ENTER()
的源码如下: