Try  HackMD Logo HackMD

RT-Thread IPC Scheduler lock

rt_enter_critical()
    /*
     *  critical region 
     */
rt_exit_critical()
  • 使用此方式可確保當前 thread 不會被 scheduler 踢出,但還是有可能會被中斷影響。

進入 scheuler 鎖

File: scheduler.c

rt_enter_critical

功能 回傳值
進入 scheuler 鎖 void
/** * This function will lock the thread scheduler. */ void rt_enter_critical(void) { register rt_base_t level; /* disable interrupt */ level = rt_hw_interrupt_disable(); /* * the maximal number of nest is RT_UINT16_MAX, which is big * enough and does not check here */ rt_scheduler_lock_nest ++; /* enable interrupt */ rt_hw_interrupt_enable(level); } RTM_EXPORT(rt_enter_critical);
  • 即,將 rt_scheduler_lock_nest 加一

離開 scheduler 鎖

rt_exit_critical

功能 回傳值
離開 scheuler 鎖 void
/** * This function will unlock the thread scheduler. */ void rt_exit_critical(void) { register rt_base_t level; /* disable interrupt */ level = rt_hw_interrupt_disable(); rt_scheduler_lock_nest --;
  • 即,將 rt_scheduler_lock_nest 減一
if (rt_scheduler_lock_nest <= 0) { rt_scheduler_lock_nest = 0; /* enable interrupt */ rt_hw_interrupt_enable(level); rt_schedule(); } else { /* enable interrupt */ rt_hw_interrupt_enable(level); } }
  • 如果 rt_scheduler_lock_nest 被減至 0 或以下,進行一次調度

rt_critical_level

功能 回傳值
回傳 scheuler 鎖的值 scheuler 鎖的值
/** * Get the scheduler lock level * * @return the level of the scheduler lock. 0 means unlocked. */ rt_uint16_t rt_critical_level(void) { return rt_scheduler_lock_nest; } RTM_EXPORT(rt_critical_level);
  • 即,回傳 rt_scheduler_lock_nest
tags: RT-Thread kernel ipc