peterhu 发表于 2009-4-20 09:50:13

Smart Timing Mechanism

Smart Timing Mechanism

1. Why need this mechanism?

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

2. How to improve it?

既然决定了那么就行动吧! 打开google 大神进入code search,看看有没有什么好东西(J我不想重新造轮子,如果有好的代码那么就拿来参考)。搜来搜去,发现linux 2.6内核中的定时机制很酷,可是不适合我的环境,它太大了,光这个机制就能把我的EC搞爆了L。然后再狂搜!果然不负我一番苦心,我发现linux 0.95内核中的定时机制挺适合。可是仔细阅读之后发现这个机制有些缺陷,它只处理了插入结点时间比头结点时间长的情况,而没有处理插入结点时间比链表头结点短的状况。下面就是我修改后的source code:

//header file
/////////////////////////////////////////////////
#ifndef
OEM_TIMER_SERVICE__H
#define
OEM_TIMER_SERVIEC__H


void add_timer(unsigned short
jiffies,void (*callback)());

void do_timer(void);

#endif
/////////////////////////////////////////////////
/////////////////////////////////////////////////
//impl file
#include <stdio.h>
#include "OEMTimerService.H"


#define
TIMER_REQUESTS
0x30

struct timer_list
{

struct timer_list *next;

unsigned short jiffies;

void (*callback)(void);
};


struct timer_list timer_list = {NULL};

struct timer_list *timer_header = NULL;


void add_timer(unsigned short
jiffies,void (*callback)())
{

struct timer_list *ptmp;


if(!callback)

return ;



EA = 0;


if(jiffies <= 0)

(*callback)();



for(ptmp = timer_list; ptmp < timer_list + TIMER_REQUESTS; ptmp++)

if(ptmp->callback == NULL)

break;



if(ptmp >= timer_list + TIMER_REQUESTS)

{

goto EXIT;

}


ptmp->jiffies = jiffies;

ptmp->callback = callback;



ptmp->next = timer_header;

timer_header = ptmp;


//add bellow code to fix linux on timer’s bugs ++

if(ptmp->next && ptmp->next->jiffies > ptmp->jiffies)

{

ptmp->next->jiffies -= ptmp->jiffies;

}//end ++

else

{

while(ptmp->next && (ptmp->next->jiffies < ptmp->jiffies))


{

ptmp->jiffies -= ptmp->next->jiffies;

callback = ptmp->callback;

ptmp->callback = ptmp->next->callback;

ptmp->next->callback = callback;

jiffies = ptmp->jiffies;

ptmp->jiffies = ptmp->next->jiffies;

ptmp->next->jiffies = jiffies;

ptmp = ptmp->next;

}

}

EXIT:

EA = 1;

return;
}

void do_timer(void)
{


while((timer_header != NULL)


&&(timer_header->callback != NULL)


&&(--timer_header->jiffies <= 0))

{

void (*callback_fptr)(void);


callback_fptr = timer_header->callback;

timer_header->callback = NULL;

timer_header = timer_header->next;

(*callback_fptr)();

}


}
///////////////////////////////////////////////////


上述code,我已经导入并开始测试了,短短几十行代码大大改善了我的code base的感官,降低了代码的耦合度,现在看上去清爽多了J!

野人献曝,博君一笑

Peter


[ 本帖最后由 peterhu 于 2009-4-20 09:51 编辑 ]
页: [1]
查看完整版本: Smart Timing Mechanism