Smart Timing Mechanism

Smart Timing Mechanism

 

  1. Why need this mechanism

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

 

  1. How to improve it?

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

 #ifndef OEM_TIMER_SERVICE__H #define OEM_TIMER_SERVIEC__H void add_timer(unsigned short jiffies,void (*callback)()); void do_timer(void); #endif 

 #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[TIMER_REQUESTS] = {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; }//++<< 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

 

你可能感兴趣的:(Smart Timing Mechanism)