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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
调用rt_thread_create()创建线程的时候,调用了下面的代码,作用是什么?$ z) v8 @1 q1 G) y, C8 n6 u3 v
# X  r: E+ q4 R% n6 D( D
/* initialize thread timer */
* Q- H# L$ A& G6 _2 r2 j* p, `rt_timer_init(&(thread->thread_timer),thread->name,rt_thread_timeout,thread,0,RT_TIMER_FLAG_ONE_SHOT);3 b3 f' X. y/ B3 c/ b' m
为什么要创建这个定时器?
" i$ Q5 U8 s. s1 l+ E  C5 f0 J/ @3 \3 f0 Y. S, i/ @
在系统时钟中断回调函数里面,已经调用了下面的代码6 B& }* U7 B' e/ A# g9 J: q
% f7 C7 `! S7 Q, _* I3 M7 j
void rt_tick_increase(void)  E4 V% z; J! y2 q$ t
{
- v4 }# ?  T, q# R: H/ g2 F, g$ z' fstruct rt_thread thread;- z+ U7 [5 }3 D2 M) N
/ increase the global tick /; K$ t1 H" e, S9 B. Z' _
++ rt_tick;, O4 @; x0 C* ]
/ check time slice /7 G1 c# v$ [7 h" ^/ H3 h" d
thread = rt_thread_self();6 b/ \' \2 F! f) b) X+ d6 o! n
-- thread->remaining_tick;
. }: g' a8 ?* `0 [  |if (thread->remaining_tick == 0)8 ^4 u4 x1 a2 T  I; D
{5 U+ H4 v, J0 m$ ?5 u
/ change to initialized tick /
/ U1 W4 \2 f0 a8 kthread->remaining_tick = thread->init_tick;: {. A6 U: d+ ]: X
/ yield /! Y) m) y  _, E  H" e$ j
rt_thread_yield();* O! [, H, n' Z/ f: J$ Q) |0 S" X
}
0 Y+ ^3 [% a  t( X4 c8 @4 L/ check timer */
; l- ?  w6 u0 Y( ?: O  D4 Vrt_timer_check();/ P6 ?) \0 H% _
}- p, ?  P9 [: {1 b" w3 T
上面的代码已经会去判断remaining_tick,这个为0就执行让出cpu操作了。
# s' K$ ?: a6 U0 M2 S7 e

该用户从未签到

2#
发表于 2022-7-13 13:51 | 只看该作者
用来控制挂起时间的。例如你主动调用delay或者阻塞于获取信号量等都会用到这个定时器。截取了一段信号量获取函数中的源码:$ |9 n: H2 M1 V% ^1 X9 X
`$ y0 h$ U% s8 }4 ^5 L
/ start /, y, x; W$ S" M! F4 r7 X
rt_ipc_list_suspend(&(sem->parent.suspend_thread),
4 H% \+ e1 W* k0 rthread,& R% `; A$ e  R( \6 o7 D
sem->parent.parent.flag);
+ W' [* c, y' [3 g" _( M" h
- y. `. c! B. o) k/ T$ x+ V/* has waiting time, start thread timer */0 K8 L, c! p( C9 o
if (time > 0)1 Z. N" X3 e" y$ p  [
{+ e3 T6 Z* Y& Z% C
RT_DEBUG_LOG(RT_DEBUG_IPC, ("set thread:%s to timer list\n",3 ^4 P, I# k0 H. {+ ~9 w7 _
thread->name));
9 N9 H/ R! j. Q9 S8 \/* reset the timeout of thread timer and start it */) s5 m/ ^# k2 u1 a
rt_timer_control(&(thread->thread_timer),1 {  @; E4 h, [' W
RT_TIMER_CTRL_SET_TIME,6 C% {7 |* m" d7 _" X
&time);
% L! N4 b  Y! |" U. \+ [* brt_timer_start(&(thread->thread_timer));/ |# ]7 M: V8 Z. E2 k* z, L
}7 F: [; k* k9 m' ~( X! I7 W! _
/* enable interrupt */" P% g/ M3 M/ \
rt_hw_interrupt_enable(temp);' E- m' I  e: K# |1 F
/* do schedule */
/ R( X. O* F* @1 _/ }8 Rrt_schedule(); rt_ipc_list_suspend(&(sem->parent.suspend_thread),) h( E/ N% u! {/ h: ^4 T
thread," H/ {+ q+ [8 R6 [
sem->parent.parent.flag);
3 `; s8 G+ H" z0 {) v" L/* has waiting time, start thread timer */& Y, J5 v, ^0 G1 S, `7 }9 w- f  B; \
if (time > 0)7 b# r8 H$ @2 q. [5 F# _
{! L  l2 a0 c6 S- t, E
RT_DEBUG_LOG(RT_DEBUG_IPC, ("set thread:%s to timer list\n",2 I, ~# h! r! A0 K! w3 ~
thread->name));* a+ [- ?  e" d
/* reset the timeout of thread timer and start it */9 U" F' j( U: G- X0 X  ~
rt_timer_control(&(thread->thread_timer),
8 ]3 T* d: O$ y4 m" R+ KRT_TIMER_CTRL_SET_TIME,8 H5 ]7 g6 r. e3 Q! w, i
&time);
$ {) y/ ^0 W2 E+ b! S' t. S  F4 r! krt_timer_start(&(thread->thread_timer));
3 C4 t1 i; s) L4 K}$ U4 e$ R) M. a
/* enable interrupt */
4 j6 F5 \# i& o  v* zrt_hw_interrupt_enable(temp);6 H4 L+ f, i, y8 Y0 s# |
/* do schedule */
3 R( P6 r* E" h1 c7 A- Xrt_schedule();`
: ^3 Y3 f- m" W* `: u
  • TA的每日心情
    开心
    2023-6-2 15:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2022-7-13 14:50 | 只看该作者
    楼上说的很不错的7 K4 ^: ?  s' C4 d! l( M- }

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-30 11:41 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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