lk对临界区的操作
来源:互联网 发布:金蝶数据库恢复 编辑:程序博客网 时间:2024/06/05 17:10
在lk中当要进入临界区的时候一般会用enter_critical_section 和 exit_critical_section来保护
static inline __ALWAYS_INLINE void enter_critical_section(void)
{
critical_section_count++;
if (critical_section_count == 1)
arch_disable_ints();
}
从enter_critical_section 函数中可以看到只有第一次进入的时候才关掉中断。
static inline __ALWAYS_INLINE void exit_critical_section(void)
{
critical_section_count--;
if (critical_section_count == 0)
arch_enable_ints();
}
其中arch_enable_ints 和 arch_disable_ints的实现分别如下
/* void arch_enable_ints(void); */
FUNCTION(arch_enable_ints)
mrs r0, cpsr
bic r0, r0, #(1<<7)/* clear the I bit */
msr cpsr_c, r0
bx lr
/* void arch_disable_ints(void); */
FUNCTION(arch_disable_ints)
mrs r0, cpsr
orr r0, r0, #(1<<7)
msr cpsr_c, r0
bx lr
可见在这两个临界区中是是禁止中断的。进入临界区的时候critical_section_count 会加1
离开临界区的时候会减1,可以临界区是可以嵌套的。
当临界区嵌套是可以直接调用两次enter_critical_section
对应的离开临界区也要调用两次exit_critical_section。
对应的code 类似:
enter_critical_section()
enter_critical_section()
.
.
.
exit_critical_section()
exit_critical_section()
第二次进入临界区的时候,可以调用
static inline void inc_critical_section(void) { critical_section_count++; }
对应的离开临界区的时候
static inline void dec_critical_section(void) { critical_section_count--; }
对应的code 类似:
enter_critical_section()
inc_critical_section()
.
.
.
dec_critical_section()
exit_critical_section()
当某些操作需要判断当前是否在临界区中,例如临界区中中断是被关掉的。可以用in_critical_section来判断,
static inline __ALWAYS_INLINE bool in_critical_section(void)
{
return critical_section_count > 0;
}
static inline __ALWAYS_INLINE void enter_critical_section(void)
{
critical_section_count++;
if (critical_section_count == 1)
arch_disable_ints();
}
从enter_critical_section 函数中可以看到只有第一次进入的时候才关掉中断。
static inline __ALWAYS_INLINE void exit_critical_section(void)
{
critical_section_count--;
if (critical_section_count == 0)
arch_enable_ints();
}
其中arch_enable_ints 和 arch_disable_ints的实现分别如下
/* void arch_enable_ints(void); */
FUNCTION(arch_enable_ints)
mrs r0, cpsr
bic r0, r0, #(1<<7)/* clear the I bit */
msr cpsr_c, r0
bx lr
/* void arch_disable_ints(void); */
FUNCTION(arch_disable_ints)
mrs r0, cpsr
orr r0, r0, #(1<<7)
msr cpsr_c, r0
bx lr
可见在这两个临界区中是是禁止中断的。进入临界区的时候critical_section_count 会加1
离开临界区的时候会减1,可以临界区是可以嵌套的。
当临界区嵌套是可以直接调用两次enter_critical_section
对应的离开临界区也要调用两次exit_critical_section。
对应的code 类似:
enter_critical_section()
enter_critical_section()
.
.
.
exit_critical_section()
exit_critical_section()
第二次进入临界区的时候,可以调用
static inline void inc_critical_section(void) { critical_section_count++; }
对应的离开临界区的时候
static inline void dec_critical_section(void) { critical_section_count--; }
对应的code 类似:
enter_critical_section()
inc_critical_section()
.
.
.
dec_critical_section()
exit_critical_section()
当某些操作需要判断当前是否在临界区中,例如临界区中中断是被关掉的。可以用in_critical_section来判断,
static inline __ALWAYS_INLINE bool in_critical_section(void)
{
return critical_section_count > 0;
}
1 0
- lk对临界区的操作
- 对临界区的使用
- 对临界区对象的一点感悟
- 对信号量的临界区保护
- java 多线程 临界区的操作
- 临界区操作的原子性
- OpenMP对临界区/变量的保护方法
- 使用VC的API函数操作临界区
- 使用MFC的CCriticalSection类来实现操作临界区
- 临界区(临界段)的含义
- 多线程【临界区-临界资源的理解】
- 临界区的使用
- 临界区的理解
- Linux的临界区
- 临界区的实现
- 临界区的使用
- 多线程的临界区
- 临界资源、临界区、信号量、P,V操作
- 检测图书ISBN编号校检位
- Ten years of pedestrian Detection-论文整理
- Android实现滑动的七种方法
- shutdown,init,reboot
- ExtJS4 Ext用法汇总
- lk对临界区的操作
- Codeforces Problem 711B Chris and Magic Square(constructive algorithms)
- Method Swizzling的各种姿势
- Python open()函数文件打开、读、写操作详解
- tomcat,Jboss,weblogic区别与比较
- android之屏幕适配
- android 安卓APP获取手机设备信息和手机号码的代码示例
- Spring Quartz定时器 配置文件详解
- JavaScript中的argument