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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
调用rt_thread_create()创建线程的时候,调用了下面的代码,作用是什么?
$ ?: t5 ?5 @3 R
- G) X8 ^  ^3 A/ A4 R/* initialize thread timer */6 x1 J, G2 _1 X6 `1 Q; f
rt_timer_init(&(thread->thread_timer),thread->name,rt_thread_timeout,thread,0,RT_TIMER_FLAG_ONE_SHOT);) [! X! I  [0 m' H: x4 G3 l
为什么要创建这个定时器?8 z& i& `* a8 p; }; R4 Y

: y% i% r" `9 A; T1 l$ Z$ _在系统时钟中断回调函数里面,已经调用了下面的代码' i% M. ~/ |$ R2 J6 H* @

9 L+ y2 y8 ^, B. Pvoid rt_tick_increase(void)
+ C# {$ K/ q; Q{4 Y% N5 y  I* W1 z* P
struct rt_thread thread;
9 E  ?6 \, i/ |/ increase the global tick /4 Q) a! p% c5 `( M5 P
++ rt_tick;
, l% L- d, c- a& D% f) l/ check time slice /
, I+ f: r5 F; [* Pthread = rt_thread_self();
' w4 c4 E; |! K9 N-- thread->remaining_tick;
/ t0 o( c& p0 q0 }) Pif (thread->remaining_tick == 0)+ a# F7 v2 I# D# ]9 H! d
{
$ ~, v. w1 {* N+ ?, J/ S/ change to initialized tick /" l$ a  R. h# [& [9 m0 e
thread->remaining_tick = thread->init_tick;
: s- O  P( g$ s+ c" z, ?/ yield /4 V; f9 ]+ L! l' Y- e' D9 {. R( X
rt_thread_yield();" }, V7 i( V; V) A$ D$ g% o7 Q& J
}8 @3 x+ |$ o" }! [( s
/ check timer */
8 f: p0 |+ d# m1 y- drt_timer_check();$ D, Q: x6 g& y4 |3 j: g  j9 b; s
}1 @0 L7 ]- R/ U0 R# d% R
上面的代码已经会去判断remaining_tick,这个为0就执行让出cpu操作了。
+ B# w8 S, l7 \

该用户从未签到

2#
发表于 2022-7-13 13:51 | 只看该作者
用来控制挂起时间的。例如你主动调用delay或者阻塞于获取信号量等都会用到这个定时器。截取了一段信号量获取函数中的源码:, s3 |9 e2 k5 c$ ~& j; N0 M
`
' g3 E. C5 C6 x$ \0 G3 N/ start /9 q* d: ~+ q7 @5 D- a& t+ U
rt_ipc_list_suspend(&(sem->parent.suspend_thread),- {/ ^. F/ T: l; N9 _) g
thread,5 C& Q5 X1 ~. S3 y/ i5 E1 T
sem->parent.parent.flag);+ H; h3 o# u: Z+ q- [
) t" H) J2 p, R0 A: g
/* has waiting time, start thread timer */
5 ?# n5 v8 [* u: ?if (time > 0)- z2 F; x: e* o( O, D" e2 i
{
$ `) N2 F( W+ O9 R$ aRT_DEBUG_LOG(RT_DEBUG_IPC, ("set thread:%s to timer list\n",0 p% z! M9 F8 w$ A. M1 O2 c
thread->name));. h* I  }0 }0 K" x6 ?5 ?! B  h
/* reset the timeout of thread timer and start it */
( P8 \) Z; N% A2 v3 art_timer_control(&(thread->thread_timer)," O2 k' j3 x# R8 @
RT_TIMER_CTRL_SET_TIME,, f0 W( W2 g9 k! o' t
&time);0 K& q- @( R; g. J1 }1 [) F& X
rt_timer_start(&(thread->thread_timer));7 @+ s9 w: i- X; c
}
0 ?4 T% r3 _' t' v! ~) b' U( z/* enable interrupt */
7 I- W) e. x1 b1 K2 nrt_hw_interrupt_enable(temp);8 ^6 ^0 A: {* P* _. C" }
/* do schedule */5 l4 J$ ?+ D) ~4 ^0 l
rt_schedule(); rt_ipc_list_suspend(&(sem->parent.suspend_thread),
" d$ b2 {" D# w  ]' M  ~9 P" E* mthread,
$ A8 f3 L; _8 F6 w4 N" d; C. q  Esem->parent.parent.flag);
. u8 T9 q) f9 Z2 g, K/ y/* has waiting time, start thread timer */
* g. O) G" m$ f& p( ?, ?. ~) Eif (time > 0)7 [+ ^! H. `7 Q! `; S
{5 n# X9 j4 S: B  Y' R
RT_DEBUG_LOG(RT_DEBUG_IPC, ("set thread:%s to timer list\n",5 E6 M4 x: ?# b$ z
thread->name));
: g+ D$ G/ z% R% r! P3 h' d/* reset the timeout of thread timer and start it */
% h! n7 u- z4 n" R3 G* f: x$ rrt_timer_control(&(thread->thread_timer),
8 B' r$ _7 ]3 {5 c! sRT_TIMER_CTRL_SET_TIME,
2 V$ A4 M2 E, p9 b& X7 ]1 ^6 M&time);. h+ a4 n/ @) {
rt_timer_start(&(thread->thread_timer));! v- Z* S+ d4 |! ^( ^. ?4 p
}' @6 q4 K* W. ~+ G9 a7 z6 Q
/* enable interrupt */2 P; i+ l0 D9 I# D! @
rt_hw_interrupt_enable(temp);
% P; V6 b# k$ I5 I% a, D' y+ x/* do schedule */+ H* b4 {, q5 d+ l1 B* f9 q
rt_schedule();`5 C1 A+ Y: X$ W% y* ^3 m
  • TA的每日心情
    开心
    2023-6-2 15:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2022-7-13 14:50 | 只看该作者
    楼上说的很不错的8 A. W& \5 P; `- s2 B

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

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

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

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

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