找回密码
 注册
关于网站域名变更的通知
查看: 210|回复: 3
打印 上一主题 下一主题

请问调用rt_thread_create()创建线程,初始化定时器有何用处

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-7-13 13:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
调用rt_thread_create()创建线程的时候,调用了下面的代码,作用是什么?
1 ~$ d8 R' E/ l) Y9 W6 l( Y
. p' Y" e3 l! h- F$ q. u/* initialize thread timer */
* \+ g3 n' _* t- |$ q4 jrt_timer_init(&(thread->thread_timer),thread->name,rt_thread_timeout,thread,0,RT_TIMER_FLAG_ONE_SHOT);8 ?. j% ^5 I" T2 d
为什么要创建这个定时器?$ c6 |1 k, h4 N8 B% }

' ]" l7 w+ S# {! k+ q在系统时钟中断回调函数里面,已经调用了下面的代码. ]1 P$ D8 S( b4 T
: q: @2 ?8 `/ T$ R5 z
void rt_tick_increase(void)) t8 D8 D3 ]7 f5 w/ S6 G
{  C3 i6 f5 A3 @
struct rt_thread thread;
. n) o. o) d) p: l* ~7 W/ increase the global tick /9 ]9 Y1 x9 p1 ~: P4 f
++ rt_tick;/ H6 k8 w1 j, u+ q# u. d
/ check time slice /
6 r! W# c& _) _' k( a  M' s$ ]& mthread = rt_thread_self();
4 b% [9 y3 k% q1 |-- thread->remaining_tick;
4 z8 S, P2 U  ?- G! d4 J( qif (thread->remaining_tick == 0)' x8 ]+ f- p0 P: _8 i% m. v
{
3 m6 P6 p# j, r1 T6 X! m, {+ M  \4 i/ change to initialized tick /* r2 Q* m9 A- K4 k7 A
thread->remaining_tick = thread->init_tick;
! S) W. _/ q# p7 i2 ]# [$ L8 k) a" Q/ yield /  z! \6 L# O- ?6 R$ W: P  h# k/ p( x
rt_thread_yield();1 a' l8 k. d! o3 g$ K3 q3 {! u
}  ]3 Y/ k; c1 [/ W" {
/ check timer */
$ f4 d5 c4 s- [: f  N% p5 O6 brt_timer_check();
/ B$ g% L* @; T/ P$ Q2 T1 X}
; e) k, J$ S5 p  s) P( k' l, y上面的代码已经会去判断remaining_tick,这个为0就执行让出cpu操作了。
  Z! k, q; l7 j# [

该用户从未签到

2#
发表于 2022-7-13 13:51 | 只看该作者
用来控制挂起时间的。例如你主动调用delay或者阻塞于获取信号量等都会用到这个定时器。截取了一段信号量获取函数中的源码:
) l! }% }) H( a* R) x/ k) d`
9 e4 [- q5 g3 g/ start /4 |# d2 M) }" f% t
rt_ipc_list_suspend(&(sem->parent.suspend_thread),
2 \8 X+ p& B+ rthread,. V- R: P1 T! P' o1 x% I8 m% Z
sem->parent.parent.flag);# C" E) U8 |+ `; g
8 Y4 J  R  G* A" b! g( k
/* has waiting time, start thread timer */0 [% b! D: O+ P+ j7 J4 {
if (time > 0); ^$ q& _4 [" W8 ?! ?+ e9 c/ i: L
{
$ V$ ^/ N: g! V- W* zRT_DEBUG_LOG(RT_DEBUG_IPC, ("set thread:%s to timer list\n",  o( Z" K) E' o# H: W9 Z& Z! ]0 @
thread->name));
7 P- g2 I5 F3 j' P" y3 W! G/* reset the timeout of thread timer and start it */) `  R$ A; @2 B" `$ I
rt_timer_control(&(thread->thread_timer),
. S/ v3 Q0 U, K7 y7 k( |RT_TIMER_CTRL_SET_TIME,
% d+ y1 P2 K0 t) _. m& f3 _&time);9 {& u5 w, P6 W* n( ]* ~/ f
rt_timer_start(&(thread->thread_timer));3 X) [; f+ Y$ ?3 {0 i! u" g
}
0 {' y# n' N) W% M- @: v/* enable interrupt */! G4 l  x' G& `3 h, K3 p# s
rt_hw_interrupt_enable(temp);
1 G: H7 n* B8 @- h( z/* do schedule */  A2 L. C8 _+ x
rt_schedule(); rt_ipc_list_suspend(&(sem->parent.suspend_thread),
0 y5 P% w' {( ]. p! dthread,! Q. c/ g& P9 D& P
sem->parent.parent.flag);) a4 b" ~1 C- k0 R" _& Z
/* has waiting time, start thread timer */
& a, [- A  M+ g3 s& q5 x& i3 L9 aif (time > 0)( v; q: h6 h* ^6 C
{( ]& }7 p2 R9 n) H: G0 Y
RT_DEBUG_LOG(RT_DEBUG_IPC, ("set thread:%s to timer list\n",
7 w/ G( w" G& L* G4 G# O' n2 Pthread->name));
* s5 Q; X0 ?6 x9 e3 E/* reset the timeout of thread timer and start it */
7 |$ _, Z6 B2 q2 \4 hrt_timer_control(&(thread->thread_timer),
6 `# G& t7 B# O0 q; E8 RRT_TIMER_CTRL_SET_TIME,& v+ R) `1 a2 S; z( V& z( W
&time);
) P; z3 f5 k* u/ |( |' Q# K( vrt_timer_start(&(thread->thread_timer));- J) c! D* @$ S9 B! v  o7 L* h
}, ]4 W3 ~3 Q! F+ u) t6 I  j
/* enable interrupt */0 |1 M5 U: f* P& f1 Q
rt_hw_interrupt_enable(temp);
) T4 }% x" ?) E' Z. U0 s/* do schedule */9 K1 d7 }7 b( G% c! Y
rt_schedule();`' j! ?4 M1 _% x. i+ H5 P9 U. `
  • TA的每日心情
    开心
    2023-6-2 15:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2022-7-13 14:50 | 只看该作者
    楼上说的很不错的5 a: `# k8 g) p# X8 S* z

    该用户从未签到

    4#
    发表于 2022-7-13 15:23 | 只看该作者
    可以试试一楼的方法
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-23 17:49 , Processed in 0.156250 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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