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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
调用rt_thread_create()创建线程的时候,调用了下面的代码,作用是什么?6 T, m* K; O0 u- J/ Z* }$ @0 q+ @

! b$ F: J) P1 n. |! a/* initialize thread timer *// r7 t/ |7 T' Z/ i
rt_timer_init(&(thread->thread_timer),thread->name,rt_thread_timeout,thread,0,RT_TIMER_FLAG_ONE_SHOT);
; g/ e( ^& |2 k& b& H5 U为什么要创建这个定时器?
+ L! p9 g5 U  P5 b- Y
) X* A5 e6 ~1 p- l在系统时钟中断回调函数里面,已经调用了下面的代码
8 }+ P3 B+ N( G$ N- D  j) {8 m% J- x- A4 G7 S
void rt_tick_increase(void)1 A$ j/ A" V+ J" ~" y9 a
{( o' X7 q; O  L# q
struct rt_thread thread;
( q5 K- {# q1 E- m/ increase the global tick /
1 S5 n( [$ g% w" `: Z++ rt_tick;
2 u2 w" u% L4 ^0 x/ check time slice /
5 g: V/ s* w8 v2 \* [) Xthread = rt_thread_self();3 F; I/ W2 Z* v" Z5 I4 u0 b
-- thread->remaining_tick;9 [+ v; {6 Q; o' y) w7 p
if (thread->remaining_tick == 0)# b5 E0 i& n' F5 V, z; U
{7 V$ s2 F1 H9 v; A: K8 `. S! s
/ change to initialized tick /
# W; c9 F" P& c' ]1 ~. S0 E; uthread->remaining_tick = thread->init_tick;1 x) J0 L6 F: N8 u7 W/ x' K( t8 q
/ yield /
$ P# R7 t3 P2 u' ]- R( x" Q+ Vrt_thread_yield();' ?. E4 B( k! L. O( X4 n; M% P4 f
}
: ^5 ~9 ]" Y: _" K5 _. O) d/ check timer */  x! S$ K* z' u" M8 s# b
rt_timer_check();% [3 a! m8 j. J
}, G* Z' Z' }* N. n  U
上面的代码已经会去判断remaining_tick,这个为0就执行让出cpu操作了。
" L4 ?9 ~7 ^5 T; h5 x0 U

该用户从未签到

4#
发表于 2022-7-13 15:23 | 只看该作者
可以试试一楼的方法
  • TA的每日心情
    开心
    2023-6-2 15:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2022-7-13 14:50 | 只看该作者
    楼上说的很不错的9 X; D8 q9 R& P0 {3 O: y( w1 p+ `0 I- A

    该用户从未签到

    2#
    发表于 2022-7-13 13:51 | 只看该作者
    用来控制挂起时间的。例如你主动调用delay或者阻塞于获取信号量等都会用到这个定时器。截取了一段信号量获取函数中的源码:8 J* w) |0 A$ Q$ ]+ X5 s0 Y* ?
    `' P  E% c  l# Y* W/ L4 }
    / start /' j8 A* p% ]# i; Z% A( S( L& G( |
    rt_ipc_list_suspend(&(sem->parent.suspend_thread),
    . L+ S" [" r* L( Z$ j: rthread,( c5 f- |& D7 ]( |' u
    sem->parent.parent.flag);
    3 y/ K: g% U' ~7 _- ~0 |+ J
    6 W1 h" s0 k5 B6 I! J/* has waiting time, start thread timer */
    & n+ R9 u* x, s% ?& R. K' Dif (time > 0)
    1 s3 x, R6 J9 P3 ^" k, N2 ?{
      r7 |; G1 d0 D; J. @RT_DEBUG_LOG(RT_DEBUG_IPC, ("set thread:%s to timer list\n",) ?$ G8 l' _$ S( h8 f: p
    thread->name));
    . |# W9 R  e8 m: M, g' i. b' w; m) q/* reset the timeout of thread timer and start it */+ f% C/ ?# K( ~
    rt_timer_control(&(thread->thread_timer),% F! I  v8 }, E* q/ V2 o/ W
    RT_TIMER_CTRL_SET_TIME,
    ) r- K; |; m* n& r9 A9 J&time);. `& [, a% H0 ?* q" {
    rt_timer_start(&(thread->thread_timer));2 j  I9 V. _$ a7 R; U7 X& s
    }
    : a0 g% _) y/ d& j8 K' V# C/* enable interrupt */
      B3 N1 `9 S; y: w$ Rrt_hw_interrupt_enable(temp);
    ! O! B' e) m& X8 O3 ~/* do schedule */
    % a3 T/ X! _4 B6 k" Yrt_schedule(); rt_ipc_list_suspend(&(sem->parent.suspend_thread),$ [$ B3 M" B" i6 E( N' w  B
    thread,8 V+ b1 T  w3 t  U5 Y; a. g
    sem->parent.parent.flag);& F: c7 B! u3 Z- R1 y0 a* Z
    /* has waiting time, start thread timer */
      y3 W0 a5 b6 d% [if (time > 0)
    + l0 i; q3 l2 B' Q, i  [/ p7 ?8 Q{
    8 F0 b2 T$ E; k- L+ ?% F4 ^RT_DEBUG_LOG(RT_DEBUG_IPC, ("set thread:%s to timer list\n",& d7 o1 D' t$ h) M9 ~' p. |0 |
    thread->name));
    1 R# I5 d4 q. M$ u* y5 t  |/* reset the timeout of thread timer and start it */
    , `, k3 e# a8 z; Srt_timer_control(&(thread->thread_timer),0 v9 \+ m* s0 Y* Q, u; ^9 d
    RT_TIMER_CTRL_SET_TIME,
    7 A9 N0 @* _: K; j  K$ g6 C&time);+ y0 |3 n; L, \5 d3 v9 i
    rt_timer_start(&(thread->thread_timer));2 \0 \8 R: M3 q5 i# K3 H* [& w3 w
    }& f) F# `" A* p
    /* enable interrupt */0 N# D8 u. b9 H; P
    rt_hw_interrupt_enable(temp);" [: x* n- O8 s! B; ?/ w* R
    /* do schedule */
    . e" B) e$ }2 f) mrt_schedule();`. n- l1 i) O7 Q  {$ [
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-11-23 19:06 , Processed in 0.171875 second(s), 24 queries , Gzip On.

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

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

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