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

发表在 Kernel2020-1-18 15:56 [复制链接] 5 122

) `9 R) g. y, _- G8 `
$ m2 @( m% [9 G9 D. D9 |
看RTT内核代码,关于线程锁定(就是禁止切换线程),只有关中断一种方式吗?有没有线程调度器上锁的方式呢?0 q) m6 g" ^+ h3 I3 }
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2020-1-18 19:42:14 | 显示全部楼层
线程的同步方式有很多种,其核心思想都是:在访问临界区的时候只允许一个 (或一类) 线程运行。进入 / 退出临界区的方式有很多种:
6 [. E* E" ^8 i0 A5 K
9 i' Y% V0 N! l, s! s1)调用 rt_hw_interrupt_disable() 进入临界区,调用 rt_hw_interrupt_enable() 退出临界区;详见《中断管理》的全局中断开关内容。
. ]* r6 t+ d1 H8 I0 G/ j/ S6 Y! y7 c5 ]! u# r) s
2)调用 rt_enter_critical() 进入临界区,调用 rt_exit_critical() 退出临界区。
使用道具 举报 回复
发表于 2020-1-19 11:46:01 | 显示全部楼层
还没想好 发表于 2020-1-18 19:42
. Q+ C) r8 i5 q: p线程的同步方式有很多种,其核心思想都是:在访问临界区的时候只允许一个 (或一类) 线程运行。进入 / 退出 ...

6 [5 a# `+ w/ v  G. ?* A: o! m; D1 Q) a: U; H. p9 g
RTT中进出临界区实质上还是通过开关中断实现的,如下:
; p7 L& V9 S, T4 D" Q  Y- \2 Kvoid rt_enter_critical(void)2 E6 E3 d0 S" d# L6 l
{
0 v: q( Q" k; z5 ?    register rt_base_t level;& d4 _+ T" x8 P; r# }$ ~
* k- N' t' x; V4 N& y1 D& Q6 r
    /* disable interrupt */
! }5 K: ~& ~6 _    level = rt_hw_interrupt_disable();: Y0 d0 U( }9 F

# `9 [* V8 H% r4 r2 C# P' @    /*
  E' ?' C% q1 u" ]4 q     * the maximal number of nest is RT_UINT16_MAX, which is big
) m# _- q' m6 q  ~" S     * enough and does not check here! Y0 q" d5 H3 l
     */
# A2 d! P9 N. H( w* [! z    rt_scheduler_lock_nest ++;
! _' l. d0 ^: `- C% r4 f9 c+ u5 e( s5 b6 g
    /* enable interrupt */
! |, z: ]9 E$ D* Y    rt_hw_interrupt_enable(level);
% U; H* ]0 }+ p" ?}
- }9 j6 f* \; t* C; J+ x- R7 e0 D/ R; U$ b5 `7 Z1 f% _
如果进入临界区,这时有中断来了,像这样处理是不是就不响应这个中断。6 H6 Y$ j# W! Q! h

3 H9 h5 a$ m" @% d9 S什么方法能达到这种效果:?
6 d- u- @3 k' @5 B; X在进入临界段时,有中断发生,在退出临界段时中断会得到响应,临界段只是延迟了中断的响应时间,并没有真正的阻止中断。
使用道具 举报 回复
发表于 2020-1-19 18:00:42 | 显示全部楼层
你是在找这个?0 |1 f# d. Z$ K1 U$ R

( j. K" C6 S4 E8 i+ esrc/cpu.c: o% [: ?& o) Y+ ]

4 R) U* J0 J# Gstatic void rt_preempt_disable(void);
使用道具 举报 回复
发表于 2020-1-20 08:30:57 | 显示全部楼层
本帖最后由 shjic 于 2020-1-20 08:32 编辑
+ y6 `; ^$ ?# X4 x
) G. `. k' ?8 [; v4 t+ I% m5 Brtt中rt_enter_critical不是靠关中断来实现的,而是通过不切任务达到只有一个任务进入临界区的目的,在rt_enter_critical之后,中断仍然可以响应,所以不要用rt_enter_critical来保护中断中要访问到资源。
+ _' B" f7 p& u4 ?7 E' c/ v* o
7 g" X. B1 c/ V) x, p: }' p+ X3 Y另一个函数rt_hw_interrupt_disable它才是关掉了cpu的中断响应,用它就可以保护中断中会访问的资源。6 _0 T7 X, d) o
0 ^8 E+ _1 q9 ^  p2 Y
什么方法能达到这种效果:?
- {! s: t  b% y# g在进入临界段时,有中断发生,在退出临界段时中断会得到响应,临界段只是延迟了中断的响应时间,并没有真正的阻止中断。

  x% L% a! K& R4 a6 j, e就是rt_hw_interrupt_disable和rt_hw_interrupt_enable, rt_hw_interrupt_disable之后,中断被暂时屏蔽了,在rt_hw_interrupt_enable之后,cpu会响应中断屏蔽过程中悬起的中断。
使用道具 举报 回复
发表于 5 天前 | 显示全部楼层
shjic 发表于 2020-1-20 08:30
/ g9 u/ h7 ?! t( u6 I2 grtt中rt_enter_critical不是靠关中断来实现的,而是通过不切任务达到只有一个任务进入临界区的目的,在rt_e ...

0 f5 {4 s5 {$ A1 S7 B3 Q0 i感谢,明白了
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表