找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 5539|回复: 0

Smart Timing Mechanism

[复制链接]
发表于 2009-4-20 09:50:13 | 显示全部楼层 |阅读模式
Smart Timing Mechanism
/ o- [3 t" K+ ]( e

3 X/ v: ^/ {) n8 l8 \: W1. Why need this mechanism7 M" ]1 }7 ^9 K' S' ]( R

; ^/ P  j2 c0 w0 \' D3 S
   最近在跑一个超薄NB专案,这个专案的power sequence比较奇怪,很多地方需要很多的定时一段时间然后再去调整某一部分的时序。我真是受够了code base中的定时方式。每次定时都要定义一个变量,需要使用时给它赋值,然后再8051的定时器中断到来时,再计数累加。一个函数非常的长,而且充斥着乱七八糟的变量。经过这么多年的发展,代码里到处都是坏味道,看的我非常不爽,于是就产生了改造这个机制的想法。

  |9 i, b& E6 u- t6 D# ]! q  i) g0 o; B: i
2. How to improve it?1 t$ w' a3 W  T/ R
+ @8 L/ @  i  b+ Y; {
  既然决定了那么就行动吧! 打开google 大神进入code search,看看有没有什么好东西(J我不想重新造轮子,如果有好的代码那么就拿来参考)搜来搜去,发现linux 2.6内核中的定时机制很酷,可是不适合我的环境,它太大了,光这个机制就能把我的EC搞爆了L。然后再狂搜!果然不负我一番苦心,我发现linux 0.95内核中的定时机制挺适合。可是仔细阅读之后发现这个机制有些缺陷,它只处理了插入结点时间比头结点时间长的情况,而没有处理插入结点时间比链表头结点短的状况。下面就是我修改后的source code
! J8 M) q$ Z8 |* B; ?4 w! z9 @
$ o$ }% \* G) a- w. R+ z2 p//header file( l$ F8 x; f8 G% b, @9 E
/////////////////////////////////////////////////
# d4 L/ ?4 f( G5 C7 k#ifndef
7 w  p: P  U+ F& v# @  m$ fOEM_TIMER_SERVICE__H

2 G' o/ ?, C+ h% U' _#define% @$ Y; k2 l1 ~+ l- y& z
OEM_TIMER_SERVIEC__H

! M+ @% z  m$ v/ `- A
/ p- J, X3 v, D, ~, ~- E) [
! R: H5 R7 o, A: C& _8 S- E+ v8 W: bvoid add_timer(unsigned short
  q+ Y0 u! H1 O- O- O4 p% b+ d. q# ]jiffies,void (*callback)());

8 q2 l" ]7 l+ E0 n5 d4 m% K4 k4 o1 y2 W+ _1 X% z
void do_timer(void);
. f" c  ~4 ]* D/ V! L! {$ ]' P
  Y/ A8 U) X1 p6 V9 I: f/ t1 V#endif
5 o! s% {: B9 A  B6 q/////////////////////////////////////////////////
8 @3 l, j. |* z9 E  J0 h; H% d/////////////////////////////////////////////////! t4 `7 [; n9 {  S
//impl file# R! L2 ^/ S0 m( v9 T: i' k
#include <stdio.h>+ Z% F9 Y8 R+ R; W7 q6 @
#include "OEMTimerService.H"2 h1 x& u+ y) V
% Y6 q8 Z: P( y# ]

1 f* ^4 X2 U, u( f' G9 W  t8 F#define
# V# Y5 S2 y6 O( e5 l- V0 r& yTIMER_REQUESTS( v* S" z2 ?  G" t1 B4 f
0x30
0 n( \2 e) m2 [6 |4 {7 |

7 U5 F$ ?  r! R/ H; a. Y9 J3 w" @struct timer_list ' {: j9 y7 Z1 R  E! V) i
{
& l$ u7 C6 a3 P
! U( r) q9 B  X  B# `3 lstruct timer_list *next;
) O9 h, g& C; h. i& G( L: c

  n% k$ z' E( Y# v4 t! x7 \, yunsigned short jiffies;
/ {6 g  ~% A- k
4 \9 x& \. C6 S4 F# e
void (*callback)(void);

1 x, G# c. {7 {};. {) w& P7 y/ @2 b: S! E

4 X5 Q- _- T0 f! }) N- f; T5 {
8 t. m, z0 l: r# B# W  Bstruct timer_list timer_list[TIMER_REQUESTS] = {NULL};
# P$ ?+ m8 u+ z% z' q2 U  S5 T8 d2 I7 A  a' h- v1 d
struct timer_list *timer_header = NULL;
6 T  }) O! M2 Z7 W
2 K, l! G! v' F# T  g/ A% e, ?+ d0 K' H0 S( }1 r; }, \( `# {0 D. Y% X. b! N' Q
void add_timer(unsigned short
- q$ M6 H( k% @5 fjiffies,void (*callback)())

- L- d# @5 M" I8 A% {0 |' V  H2 T{5 g; G. s5 r* z
: q5 v# [+ V! _7 E0 }$ j; A
struct timer_list *ptmp;

' ?/ ^* q2 `& b7 e% e$ U
) M/ k/ H  o8 W1 `0 s: T9 J) q4 E9 Q+ n6 I1 p
if(!callback)

) _, X$ Y; z+ Z# G; \0 \
7 w: O- z. G1 lreturn ;

. r( d8 |3 Y$ Y- c8 T2 a; D/ b2 F* C  J4 @$ D+ e
3 }" i" Y' z% k% t; i$ ?$ O

" j+ N6 ]' D# e; G0 ]- iEA = 0;
6 S- |" ~! K7 T( C0 K1 }, K

8 i0 b: h( p! n, A9 y
! \% c/ p1 Y# p3 Oif(jiffies <= 0)
0 q, y. J7 V/ W6 V6 {, v) f
3 M5 B- c, f1 ~; Y" x* I
(*callback)();
& [8 }4 m( n0 R  c- H& ?* ?
% H5 |, d/ k8 w* O5 M: u
1 P/ H. ]+ F" b8 |' _  r

; W& X3 ]. {" u, X  {. ifor(ptmp = timer_list; ptmp < timer_list + TIMER_REQUESTS; ptmp++)
. Q3 R. ], c# D3 M9 f+ O" L

& Y7 f3 w! r, j% Z7 ^, U6 S+ w  h2 dif(ptmp->callback == NULL)

9 i9 G, b. I: \! |
0 {; C0 o7 d7 g/ K! d9 M) Zbreak;
% y( k+ J, J& N; j' C
  M$ J% z% t$ d$ y
  @" r3 Y% W8 M

  }, U* g0 x' g$ lif(ptmp >= timer_list + TIMER_REQUESTS)
1 h/ u3 w6 H! o! ]6 ?! V4 {9 C0 H8 ]
. j% H" u! S3 t: @5 W2 o
{

, a5 I3 u# n, Y' F) F' S3 V
( z( b: l& ~2 P/ o, k+ xgoto EXIT;
1 M+ X+ }; |+ K& p  L
# Z  A/ _1 i4 w* X
}
. k- j2 a) N' H, R5 n0 d
3 C# N/ T% Q* j1 Q/ @1 [' J
8 ]% N- T/ ~9 f; l
ptmp->jiffies = jiffies;

4 P! f2 y8 V5 v+ s
0 `: f0 i% H. c+ Cptmp->callback = callback;

% B# {& d' ]+ C7 i- W# \
$ ]" ?9 t- e4 ]4 A
$ |. `* j- X" Y0 m; X. }/ c) c
; r& g4 N6 X: |0 }( D1 p) y7 ~
ptmp->next = timer_header;
9 k$ e. q2 G6 b  @# j% T6 b4 M
" k6 U. F* f( l$ {0 d3 u
timer_header = ptmp;
! U1 T+ A+ R" Y  T
4 U3 p9 F7 _4 i. I: Q

" D5 Q( d5 M# h) z//add bellow code to fix linux on timer’s bugs ++

# h+ M  I4 k  J8 c- f% ?
2 c% x; L5 D  H: \7 h/ yif(ptmp->next && ptmp->next->jiffies > ptmp->jiffies)
' _) ]7 y0 R7 ~: f1 t/ n
5 h( O& P! F- ]' a% f2 W) b3 e$ B# {
{

/ u* K: _% b5 w% c# q9 N
) d1 B$ D8 U, uptmp->next->jiffies -= ptmp->jiffies;

. v  G$ H7 |; O1 x
; o: v: t  n. X. t% x9 o' ]# T}//end ++

& M0 R5 q- m) k: Z7 `6 D' E
$ H* Z4 e4 i8 ?# L0 Q# _# Felse

/ m0 z( |8 x* k
% y9 I9 D% t9 M/ S{

$ ]5 H" O% n* \! ^  z0 Z3 S
$ G8 z4 d' B5 T5 f  R1 ]while(ptmp->next && (ptmp->next->jiffies < ptmp->jiffies))
8 k! J, Y% ^3 h2 z, w. u
5 c2 z6 q- k4 o0 D4 H
4 O7 X1 P: W4 n
{
0 O$ O5 e  _. W( e! e$ s! p8 e

1 [6 M& C* x( p, e2 hptmp->jiffies -= ptmp->next->jiffies;

2 E. ?' U3 m& A
, x9 j0 w; P" f" v% ]callback = ptmp->callback;
4 i% I+ h1 [9 e( d- N0 E2 b3 C
/ d7 a* D( t  O5 J  c3 b# X8 J( o
ptmp->callback = ptmp->next->callback;

' h' E7 i, {1 a% H- X& k
! l+ |7 u( r( g% Z4 A( Mptmp->next->callback = callback;

4 q. h# G2 [" }% I- @+ |$ p. O, o6 v4 e6 T5 l
jiffies = ptmp->jiffies;

0 T  G2 p5 j: P7 |8 A! h9 _5 k
4 z1 h  t$ c( B& w& ^7 ?/ I5 ]ptmp->jiffies = ptmp->next->jiffies;

# Q: z) v% K- h) i0 E. e; ]% y3 x$ l, j4 u* j( l7 J8 Y3 k0 l9 x
ptmp->next->jiffies = jiffies;
6 i! E( q4 T  p  R( G7 x

$ }* S5 t+ T6 J$ n! F' Jptmp = ptmp->next;
- `& H4 ^5 w* H7 g0 p

: S9 D" q- ?$ x}
8 w: P9 y- S/ X9 @
$ s# |. M* z% V# m7 F- @9 V
}
& }0 X) X, o) n2 u
$ J) N0 e) o- \; {8 h
EXIT:3 e  }3 C5 Q! W

0 D  V. o( K! @* GEA = 1;

0 h$ M5 _5 n  _$ F
9 d$ X( r, l! g2 e$ `# Ireturn;
6 e  O' R1 {& D
}8 w7 o7 z6 n9 r/ M
* x. S7 a' [3 Q! s9 h' @9 e
void do_timer(void)& E! a) K( q- m! U% b: Y
{
8 Q$ H& C1 r7 ?  i* b9 E

/ @/ o6 b/ K+ K4 F8 J$ O; V8 X, J" l" }2 f, E! m
while((timer_header != NULL)
/ d) C: [0 p1 W! K- E6 E
  ^3 {4 e) Z* y/ W4 f
9 o, p% M8 f& P9 V
&&(timer_header->callback != NULL)

8 Q( Z. V3 A+ }8 T: K" i2 S
. d2 J5 c5 Q4 z5 x. L5 O+ N
, h* i* J( Y; p5 j+ G5 e6 C&&(--timer_header->jiffies <= 0))
: b, w. N& ^3 N9 {& F0 P$ L

& r7 y9 T5 o0 K- |" g8 J' [  E" p. e{
) i9 j- Z& J8 A4 `' [' U0 @
/ Z/ Q, F) Y- x2 |1 g
void (*callback_fptr)(void);
% R: G( l! O3 o0 Q6 L' H

5 j7 W9 }/ L# U6 T0 S$ N3 ]8 |. u" d1 B& }
callback_fptr = timer_header->callback;

3 B! b: x0 a: t8 x% p" U7 |: B1 B9 V  d9 O, Q  ]1 u" y
timer_header->callback = NULL;
- A' t6 l6 d: K6 m- F( w# V
: U/ `7 U7 O5 p4 c3 ~
timer_header = timer_header->next;
3 C  X+ ~% R# s% y6 H: d1 m  r
% H) X" N& t: o
(*callback_fptr)();

# c$ ^7 `5 I4 j4 H+ U2 l
- Y6 p) u) s' l8 q! \2 r}

& r( R" n5 @% Y; I1 W# W" Q5 _0 A
+ t3 }- n+ c3 F

5 m. ?: o3 {1 ]. T) q/ D; h) |* X}3 a% F3 P$ V0 @6 j* ]9 }" N. k
///////////////////////////////////////////////////2 B: [1 A0 c# ?/ |  ]% ?: R
8 {3 z& c4 R9 p: r7 D

' R. ~1 d2 s& b4 a) `上述code,我已经导入并开始测试了,短短几十行代码大大改善了我的code base的感官,降低了代码的耦合度,现在看上去清爽多了J!0 B" m5 {% l7 d1 K, Y
( _; `" x2 Q8 k! d! B
野人献曝,博君一笑
3 x: S% Y' I: l$ s5 Z4 C+ _- H& O2 x8 Q" {8 k
Peter; S% m# h4 k% B, B& q
  
) D, n0 e, w  h. L) j- i5 k, s
[ 本帖最后由 peterhu 于 2009-4-20 09:51 编辑 ]
您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2025-6-16 12:23 , Processed in 0.052883 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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