RTT内核线程上锁方式只有一种吗?

发布于 2020-01-18 15:56:03


看RTT内核代码,关于线程锁定(就是禁止切换线程),只有关中断一种方式吗?有没有线程调度器上锁的方式呢?

查看更多

关注者
0
被浏览
295
5 个回答
还没想好
还没想好 2020-01-18
线程的同步方式有很多种,其核心思想都是:在访问临界区的时候只允许一个 (或一类) 线程运行。进入 / 退出临界区的方式有很多种:

1)调用 rt_hw_interrupt_disable() 进入临界区,调用 rt_hw_interrupt_enable() 退出临界区;详见《中断管理》的全局中断开关内容。

2)调用 rt_enter_critical() 进入临界区,调用 rt_exit_critical() 退出临界区。
chinacool_00
chinacool_00 2020-01-19
还没想好 发表于 2020-1-18 19:42
线程的同步方式有很多种,其核心思想都是:在访问临界区的时候只允许一个 (或一类) 线程运行。进入 / 退出 ...



RTT中进出临界区实质上还是通过开关中断实现的,如下:
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);
}

如果进入临界区,这时有中断来了,像这样处理是不是就不响应这个中断。

什么方法能达到这种效果:?
在进入临界段时,有中断发生,在退出临界段时中断会得到响应,临界段只是延迟了中断的响应时间,并没有真正的阻止中断。
pinxue
pinxue 2020-01-19
你是在找这个?

src/cpu.c

static void rt_preempt_disable(void);
shjic
shjic 2020-01-20
    本帖最后由 shjic 于 2020-1-20 08:32 编辑


rtt中rt_enter_critical不是靠关中断来实现的,而是通过不切任务达到只有一个任务进入临界区的目的,在rt_enter_critical之后,中断仍然可以响应,所以不要用rt_enter_critical来保护中断中要访问到资源。

另一个函数rt_hw_interrupt_disable它才是关掉了cpu的中断响应,用它就可以保护中断中会访问的资源。

什么方法能达到这种效果:?
在进入临界段时,有中断发生,在退出临界段时中断会得到响应,临界段只是延迟了中断的响应时间,并没有真正的阻止中断。

就是rt_hw_interrupt_disable和rt_hw_interrupt_enable, rt_hw_interrupt_disable之后,中断被暂时屏蔽了,在rt_hw_interrupt_enable之后,cpu会响应中断屏蔽过程中悬起的中断。
chinacool_00
chinacool_00 2020-02-17
shjic 发表于 2020-1-20 08:30
rtt中rt_enter_critical不是靠关中断来实现的,而是通过不切任务达到只有一个任务进入临界区的目的,在rt_e ...


感谢,明白了

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友