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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
调用rt_thread_create()创建线程的时候,调用了下面的代码,作用是什么?
, s6 I/ `0 O) Q+ B0 W. o5 P3 v* |' q, M3 _" [/ B: X; @& A2 F. ?) |
/* initialize thread timer */5 T, l( b1 W1 p0 H. a1 w. s! a
rt_timer_init(&(thread->thread_timer),thread->name,rt_thread_timeout,thread,0,RT_TIMER_FLAG_ONE_SHOT);! C5 m% U' D/ s
为什么要创建这个定时器?' Y5 {1 _. s! S: {$ `; j

. ]* {  c! w/ x) c. l在系统时钟中断回调函数里面,已经调用了下面的代码
  ^) q, ^+ W1 N" _2 s. p0 B, m; B3 e* \- ]! V! o- r6 V
void rt_tick_increase(void)' a' ?- G7 _5 D) ?# l
{& w: l( r9 i" q: O5 L- N
struct rt_thread thread;
* Y# U4 @4 j2 V: w+ v/ increase the global tick /
8 R/ ~3 y2 S% Q  _6 E$ L++ rt_tick;- q1 o; O3 b+ q
/ check time slice /& q* ]  }$ g6 V0 x0 a
thread = rt_thread_self();
8 H+ Z9 I; i/ u* w. |7 A-- thread->remaining_tick;9 e. g  F- I( B! y# N/ }
if (thread->remaining_tick == 0)1 G/ {  K6 E& D8 U$ Z/ W
{
+ Z, Q" i6 _+ T$ O" G6 |/ change to initialized tick /
7 t( s3 D- T2 t6 V- w8 mthread->remaining_tick = thread->init_tick;# ~9 {/ ~9 K2 Q0 V& o
/ yield /
9 a6 `. F- V7 ]8 M; L/ Srt_thread_yield();
* S  o% i. ]9 G. f8 w}
% p5 X1 k! m7 F/ v! s! X/ check timer */# d  A1 g- z( K
rt_timer_check();* o7 f: `8 t, g- P
}, w4 _! X1 c* ~+ H' }; H  |* f
上面的代码已经会去判断remaining_tick,这个为0就执行让出cpu操作了。7 E" O6 \8 g5 g) I

该用户从未签到

2#
发表于 2022-7-13 13:51 | 只看该作者
用来控制挂起时间的。例如你主动调用delay或者阻塞于获取信号量等都会用到这个定时器。截取了一段信号量获取函数中的源码:' h9 ~3 b6 i4 G
`
# R& X* B/ c6 g5 t$ J8 i! D' ~/ start /
* G( z; V1 I! m$ e( Q# Art_ipc_list_suspend(&(sem->parent.suspend_thread),
) l. G9 a! M& B7 fthread,+ C# Y5 ?7 S; S
sem->parent.parent.flag);
# K/ {# Q4 d% b2 x, d9 D  x& R; k/ D
/* has waiting time, start thread timer */* P: |7 }, A6 F# a
if (time > 0)# D4 k2 a( K. y
{
( O4 m1 Z, q- m/ |RT_DEBUG_LOG(RT_DEBUG_IPC, ("set thread:%s to timer list\n",
5 ~; _) e! @6 gthread->name));2 H$ N' }1 {' i6 [1 e7 J7 @2 G# D
/* reset the timeout of thread timer and start it */; ?: [7 D3 q0 i, k  M
rt_timer_control(&(thread->thread_timer),
+ ~( l( S6 ?% Q1 s! ^! a; \RT_TIMER_CTRL_SET_TIME,$ Z( V& n$ W. ~. ~% z+ v
&time);
; Y' w% i4 e  T7 m  j3 s& ~rt_timer_start(&(thread->thread_timer));
7 M. R/ \! R6 m# w}9 M# L. c% Y, h! H: H' ~, j2 ~
/* enable interrupt */
. v6 k* L+ ^/ a9 ?% Zrt_hw_interrupt_enable(temp);- R7 B8 r  m' @0 g( h8 Q
/* do schedule */
8 W3 G3 Y+ w5 ^- s* Y' [rt_schedule(); rt_ipc_list_suspend(&(sem->parent.suspend_thread),
& z5 ~- q2 ~/ pthread,* L3 M$ b4 ?0 J$ q* S. U8 A
sem->parent.parent.flag);" G! X+ M/ M% M5 r- L9 a$ n
/* has waiting time, start thread timer */
7 J7 S8 S9 m$ a8 b  q+ \4 Kif (time > 0)
( p+ o" ]3 M/ F{
% P! M" ]# _2 n. I" \  ?) z9 rRT_DEBUG_LOG(RT_DEBUG_IPC, ("set thread:%s to timer list\n",- r& A4 P( t4 S
thread->name));' h0 h5 T6 l  E9 W. X: j  ]
/* reset the timeout of thread timer and start it */
7 P: \% S* q/ R$ Z$ Urt_timer_control(&(thread->thread_timer),
3 m6 I5 j* K5 hRT_TIMER_CTRL_SET_TIME,. p# y! Z/ Q7 N
&time);
# ~; h9 I: I1 [- D7 W% |rt_timer_start(&(thread->thread_timer));1 A3 k6 c/ x; O
}
# {- Q. `' w& v+ t4 q1 d/ I( o/* enable interrupt */
; N. H7 E7 J8 w" j/ D8 X! N+ urt_hw_interrupt_enable(temp);
( D/ c) Z" h& o2 c4 [( D2 P/* do schedule */8 T  Q+ Z3 {1 W4 q/ @* }
rt_schedule();`
& W5 g& K) i; X7 k( y7 p
  • TA的每日心情
    开心
    2023-6-2 15:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2022-7-13 14:50 | 只看该作者
    楼上说的很不错的
    , f  }5 H) }2 z

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-11-23 21:51 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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