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

Smart Timing Mechanism

[复制链接]
发表于 2009-4-20 09:50:13 | 显示全部楼层 |阅读模式
Smart Timing Mechanism
7 j% M: |6 u" v  e
+ S9 ~  S, b  |5 @8 A0 r
1. Why need this mechanism2 V, A/ O0 f+ M% }' {3 L
& [# }1 S8 ?, C4 |! G' E; u, O
   最近在跑一个超薄NB专案,这个专案的power sequence比较奇怪,很多地方需要很多的定时一段时间然后再去调整某一部分的时序。我真是受够了code base中的定时方式。每次定时都要定义一个变量,需要使用时给它赋值,然后再8051的定时器中断到来时,再计数累加。一个函数非常的长,而且充斥着乱七八糟的变量。经过这么多年的发展,代码里到处都是坏味道,看的我非常不爽,于是就产生了改造这个机制的想法。
* j- x5 y7 E/ R
/ y2 D# I, F6 O9 }/ @' L& ]
2. How to improve it?
. j6 _( \, f: a
6 e* s- e  _3 l# f; q  既然决定了那么就行动吧! 打开google 大神进入code search,看看有没有什么好东西(J我不想重新造轮子,如果有好的代码那么就拿来参考)搜来搜去,发现linux 2.6内核中的定时机制很酷,可是不适合我的环境,它太大了,光这个机制就能把我的EC搞爆了L。然后再狂搜!果然不负我一番苦心,我发现linux 0.95内核中的定时机制挺适合。可是仔细阅读之后发现这个机制有些缺陷,它只处理了插入结点时间比头结点时间长的情况,而没有处理插入结点时间比链表头结点短的状况。下面就是我修改后的source code
8 \0 S  g+ t2 N/ r1 f. E) y; S8 {5 f% `! ^" G: C
//header file1 N( `3 d, j/ n* l3 Q
/////////////////////////////////////////////////
5 z, I3 E3 V* c. e! n#ifndef
! ]% E1 y) D' _1 b; |/ `, \' ZOEM_TIMER_SERVICE__H
5 }) J3 ~- H! K& Z* f
#define
9 M4 L( ~9 O9 {% w# H: mOEM_TIMER_SERVIEC__H
( R% q/ S4 T4 j$ W. }

- J" g7 r% C3 i* y, ]  L4 M' h3 y2 X0 i9 u0 F
void add_timer(unsigned short
; M- V) c$ Q6 ?- _+ Q, Qjiffies,void (*callback)());

: ?- B& G5 v3 u9 @' ^0 {7 o* t7 I( c: s# G+ N/ ~
void do_timer(void);' C1 T; E9 A2 P3 O
/ B3 k9 O6 R+ V  f! o
#endif
( L6 q8 q! j' Q) o, j/////////////////////////////////////////////////
( d# n5 V& z4 @# \/////////////////////////////////////////////////! X. [; o  [# @  F/ p; c8 C: T
//impl file
* s- g! f& c7 u3 f+ Y#include <stdio.h>
* ~  C: M) v: v+ t' x% b* ]6 \#include "OEMTimerService.H"; O% @& ^9 w. ~/ S- m

' P' Z8 h) n6 D" A  b
; {1 A/ {0 N$ V#define
+ G& ?7 Z+ {5 P& oTIMER_REQUESTS
; {, k5 U% ^, y" @/ }# ?0x30
% [) C& i7 X4 M# }2 o) p$ s( w
% f$ ?4 r- A2 p' ?2 N
struct timer_list - E' z. x! s6 c6 D) d" u* `
{
; I8 z/ F# j3 o6 y4 n% k
+ p$ F( v5 M2 p2 ystruct timer_list *next;
0 d3 Q, K8 P  e( ]* e. `9 r  s  O
; n9 ~4 S" k' g1 y1 [
unsigned short jiffies;
1 I' {( p" t* _

/ o1 T5 E: O8 u) `) z; Ovoid (*callback)(void);
6 Y9 @7 x8 h' a/ T
};
# p4 [6 W; Z1 c" Y! Q8 J
+ ?, p9 ^. Q. o+ G+ t. k4 Z( b; q  m8 z4 K: `! j- M! X3 c! d( k
struct timer_list timer_list[TIMER_REQUESTS] = {NULL};
+ e0 z* \7 H/ U1 e! o7 c+ [( Y& K& ^! ^
struct timer_list *timer_header = NULL;7 p- h$ v+ Z& `
# t$ G6 R% S; s! a

" U6 Q6 G% k1 l6 p3 Y' Yvoid add_timer(unsigned short
, N: x; F5 J& Q! }+ |' Njiffies,void (*callback)())

8 P) J3 h. P4 h- R0 J{
1 {+ o1 u% t9 B3 A+ a8 ?( v2 ^" b5 v3 T
struct timer_list *ptmp;
6 N1 W: W3 ~% ?" j

/ h& S; W  k9 K3 i2 u$ \9 l8 N$ o% [: {* [' q4 O
if(!callback)
' L+ F, B7 \& H5 J

2 i+ I9 Y( ?9 s# p0 n* Ireturn ;
2 P3 F& D" A9 E7 e- i( [

8 e1 @8 M( ]0 O3 ?# F  q
3 Q1 w; l# {) k0 m. q

6 X! X! |5 G* @: f# V" }' yEA = 0;

8 X1 S& q. x6 M( N% M& G
/ Y  W6 j  h) b
$ E. l, {. Z# y! [if(jiffies <= 0)
; V, I1 }/ n) ]/ H

- x) V9 @2 C5 H+ l(*callback)();

+ Q2 P4 L1 l% w0 p
- b! L2 T, d% u  Z9 k
- [/ \* |% ~  K

" o( b1 Z2 K" d8 f' C- ]0 r/ @for(ptmp = timer_list; ptmp < timer_list + TIMER_REQUESTS; ptmp++)

0 M1 M- M0 \$ n7 }) u# p0 }- {0 X
if(ptmp->callback == NULL)

+ O1 K# ]& P& {; `  D! `* f; Y
- k2 H" h6 \, D! H. Kbreak;

: Z' }7 n, l: m0 w9 m) X/ x' C7 @+ O, Y" x" s6 Z
0 q# c0 G( C! \& ~/ y( K  E& Z8 r3 Z
4 V# W& q; O/ p
if(ptmp >= timer_list + TIMER_REQUESTS)
) R" O. R+ w7 v& \3 h
5 _) C1 K) q. G0 n9 C: [
{
3 O( ]; x# i7 Z" [7 e

  O( O( x- u4 r" e3 q. jgoto EXIT;

2 A) Z( \1 r/ Q3 h5 j8 D9 u8 q& j9 B) e7 ^! p& f* m( V
}
& H2 o8 I3 q- |
0 O* R) g2 b" W& P, s
! ]: c8 o/ [1 T5 [
ptmp->jiffies = jiffies;

; l3 [3 Q) }& q4 Y/ f! q. d% |, ^, b' X
ptmp->callback = callback;
8 p( g" ]& D: K- _4 C3 l+ _5 N

: H! M0 o* r  B& d1 [
" y3 X. L3 j- o% z+ l
% T9 X/ K7 j+ _
ptmp->next = timer_header;

- _: _! V% w$ E% {9 R
# ~* v+ i6 q% l/ I( n! P! etimer_header = ptmp;

$ {1 e' Y( u. i% X8 C( v. Q- {: m/ j& L
$ L9 Z4 {$ t' {' e; \0 H6 w
; Y6 |- [% e- v+ H- S, m7 r//add bellow code to fix linux on timer’s bugs ++

, ~8 x; |( y  E( N6 c2 t2 s2 j( _( y+ }7 A
if(ptmp->next && ptmp->next->jiffies > ptmp->jiffies)

- [2 X* f5 u1 e* w' J5 l. q, |+ `8 W$ C$ Q: k. ]* l+ ?
{

8 N" q  E  }, t4 c( n  ]! W! q4 I/ g! R/ Z
ptmp->next->jiffies -= ptmp->jiffies;

8 a6 ~% i2 J) {% S2 |0 f' F5 p0 s1 z; c( T. u
}//end ++
; _/ |/ y. X+ U- v0 b+ O1 W% l
, Y) y3 G$ `2 a
else
6 i% {( Z0 L& N1 \
; b3 i5 N2 a! [" x
{
# C2 d( P* w5 O8 w

8 O; O  R0 q9 j/ ~: S/ t; l" bwhile(ptmp->next && (ptmp->next->jiffies < ptmp->jiffies))' N1 Y# w( K& [2 O
; l7 @0 o. h- B' t9 h: [9 o: y- i6 Z

' Z( \5 {+ f) {9 K# W3 Q1 r6 m{

: @  n, |; C  Q3 {% F. ?6 C% _% ]7 V0 \; _/ R. a+ O6 V8 ?
ptmp->jiffies -= ptmp->next->jiffies;
; l5 g' B" g# r9 t, m. g

7 j& Z) y$ R/ n0 R, }2 S( q! B3 G/ Ycallback = ptmp->callback;
; |% k" X( O1 W4 _; x
: p6 A$ f, W: w- {# k2 d* x4 ]# b
ptmp->callback = ptmp->next->callback;
) T2 ]$ t/ S& d& R* b
" q+ e5 o/ y; k9 Q
ptmp->next->callback = callback;
' l3 T1 e- d- G9 g  g+ a
5 {3 ^9 K* E0 m/ q" I5 ^
jiffies = ptmp->jiffies;
' }/ T4 c9 C7 o% O( E; [
# l! m& G% N  Q
ptmp->jiffies = ptmp->next->jiffies;

: t: d; s1 q& e7 l9 G% K
' c7 i2 ?. j  x8 X! Cptmp->next->jiffies = jiffies;

; P: A5 T$ {* L
7 |+ b+ g& x2 L4 z: ?' wptmp = ptmp->next;
( Z" I9 |9 G/ O5 [8 o7 W

1 b9 ^& |* ]/ u3 f, E}

9 d) f( ?' t4 S+ G2 H( w; D; v5 j  ?* I6 \
}

' p7 j% g' r/ A) O  Q5 K$ \# |
7 V. }: f0 ^9 Y0 T* }5 W7 h* E# TEXIT:* n  d0 q, m! P6 e
- _/ p( F. A! q& q, A" ~
EA = 1;
+ x  a( j+ @! m! }
- f: I# d$ X' D: ?& m
return;
  f: C0 v  A( N
}
( c. d0 |' a+ @- r5 A( \$ q- c% M% q& v6 X1 A: x8 O
void do_timer(void), L6 o7 v5 F: \2 G0 K/ \, F
{. ^! L# `  B5 Q/ I2 T) @7 H+ u) X  o

- x4 a) k- I. t2 K2 @4 |( N: z) o  a& _! o- v( O
while((timer_header != NULL)
$ I1 |4 `5 C: i
; B: q5 f! q! ?" v" g

: y5 W$ v! \1 y8 ^1 j&&(timer_header->callback != NULL)
7 F# c& _* \2 V1 M2 e# E
3 W, e* s" _) R% w2 K: z
0 p9 |: T2 }- m" |2 D
&&(--timer_header->jiffies <= 0))

" ~' X+ M/ ?; u- u/ B2 q7 |' `, q3 B7 c- f, l/ c) ~5 F
{

! P0 n9 z! c7 x6 T1 [
- A/ t, a* a& ^3 o) Xvoid (*callback_fptr)(void);
" u# M) z" V: |- m/ y8 G5 \
9 @! U! ?4 L/ G

6 w* j) b4 ?9 w) E; C6 z! acallback_fptr = timer_header->callback;

! D% C% s6 r& r  `, ?# @* W1 a( k* ^- z/ X5 @
timer_header->callback = NULL;
0 y$ ~2 x4 r$ n0 h% H  e
& C& j+ _8 K5 X% h* S
timer_header = timer_header->next;
& t. \/ }6 ?* L

, h9 S( c6 m5 w0 h0 E; f( s- `% ](*callback_fptr)();

% V1 Z9 H2 H  c: ^3 j& w1 P( k) O4 _3 A2 r6 l2 _
}

$ U" B. [/ Q- j' p" Y$ \- A4 H5 j) h6 f+ I

# V# ^+ j6 \6 {! R% y3 H}
8 _& ~, a; N0 e+ x///////////////////////////////////////////////////' [" B( j+ M, z) F, n7 c: |4 C# r

0 p% E* v& H) z  x  C
8 {  }" V7 R# H) t% C. Y' f  k
上述code,我已经导入并开始测试了,短短几十行代码大大改善了我的code base的感官,降低了代码的耦合度,现在看上去清爽多了J!9 r" ]! a$ j/ Q9 t+ W/ c3 }" o

4 Q- y2 x5 ?9 m& G* ?, S野人献曝,博君一笑- t5 I, G# }5 P5 `/ o

1 w8 Z% h- d" J* s( P9 t1 U, fPeter: E" o9 B9 b/ ], c
  
3 b! Q9 H' u& ^0 w1 g! T, L
  Q8 B% {0 z. q: R" I" U. V0 @9 o[ 本帖最后由 peterhu 于 2009-4-20 09:51 编辑 ]
您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

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

GMT+8, 2025-2-19 06:28 , Processed in 0.085875 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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