学会用Linux0.11-启动时间的计算函数

 m     ai      n.c下时间初始化代码,可以体会到位运算的精简

#define CMOS_READ(addr) ({ /

outb_p(0x80|addr,0x70); /

inb_p(0x71); /

})

#define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10)

sta     ti   c void  TI me_init(void)

{

struct tm  TI me;

do {

 TI me.tm_sec = CMOS_READ(0);

 TI me.tm_     mi   n = CMOS_READ(2);

time.tm_hour = CMOS_READ(4);

time.tm_mday = CMOS_READ(7);

time.tm_mon = CMOS_READ(8);

time.tm_year = CMOS_READ(9);

} while (time.tm_sec != CMOS_READ(0));

BCD_TO_BIN(time.tm_sec);

BCD_TO_BIN(time.tm_min);

BCD_TO_BIN(time.tm_hour);

BCD_TO_BIN(time.tm_mday);

BCD_TO_BIN(time.tm_mon);

BCD_TO_BIN(time.tm_year);

time.tm_mon--;

startup_time = kernel_mktime(&time);

}

#define CMOS_READ(addr) ({ /outb_p(0x80|addr,0x70); /inb_p(0x71); /})#define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10)static void time_init(void){struct tm time;do {time.tm_sec = CMOS_READ(0);time.tm_min = CMOS_READ(2);time.tm_hour = CMOS_READ(4);time.tm_mday = CMOS_READ(7);time.tm_mon = CMOS_READ(8);time.tm_year = CMOS_READ(9);} while (time.tm_sec != CMOS_READ(0));BCD_TO_BIN(time.tm_sec);BCD_TO_BIN(time.tm_min);BCD_TO_BIN(time.tm_hour);BCD_TO_BIN(time.tm_mday);BCD_TO_BIN(time.tm_mon);BCD_TO_BIN(time.tm_year);time.tm_mon--;startup_time = kernel_mktime(&time);}

kernel/mktime.c代码,其中包含了闰年的计算,但是代码确实那么精简,这就是算法和思想

闰年的基本计算方法是:

如果 y 能被 4 除尽且不能被 100 除尽,或者能被 400 除尽,则 y 是闰年。

/*

*     linux   /kernel/mktime.c

*

* (C) 1991 Linus Torvalds

*/

#include

/*

* This isn't the library routine, it is only used in the kernel.

* as such, we don't care about yea     rs   <1970 etc, but assume everything

* is ok. Similarly, TZ etc is hap     pi   ly ignored. We just do everything

* as easily as possible. Let's find something public for the library

* routines (although I think minix times is public).

*/

/*

* PS. I ha     te   whoever though up the year 1970 - couldn't they have gotten

* a leap-year instead? I also hate Gregorius, pope or no. I'm grumpy.

*/

#define MINUTE 60

#define HOUR (60*MINUTE)

#define DAY (24*HOUR)

#define YEAR (365*DAY)

/* interestingly, we assume leap-years */

static int month[12] = {

0,

DAY*(31),

DAY*(31+29),

DAY*(31+29+31),

DAY*(31+29+31+30),

DAY*(31+29+31+30+31),

DAY*(31+29+31+30+31+30),

DAY*(31+29+31+30+31+30+31),

DAY*(31+29+31+30+31+30+31+31),

DAY*(31+29+31+30+31+30+31+31+30),

DAY*(31+29+31+30+31+30+31+31+30+31),

DAY*(31+29+31+30+31+30+31+31+30+31+30)

};

long kernel_mktime(struct tm * tm)

{

long res;

int year;

year = tm->tm_year - 70;

/* magic offsets (y+1) needed to get leapyears right.*/

res = YEAR*year + DAY*((year+1)/4);

res += month[tm->tm_mon];

/* and (y+2) here. If it wasn't a leap-year, we have to adjust */

if (tm->tm_mon>1 && ((year+2)%4))

res -= DAY;

res += DAY*(tm->tm_mday-1);

res += HOUR*tm->tm_hour;

res += MINUTE*tm->tm_min;

res += tm->tm_sec;

return res;

}



学会用Linux0.11_启动时间的计算函数_设计制作_光电显示
86
0
0
84

相关资讯

  1. 1、《双世宠妃2》墨连城流觞霸气维护曲小檀,蓝夜汐嫉妒打人!585
  2. 2、由岳丽娜、于毅领衔主演《娘道》今日19:30登陆北京卫视2253
  3. 3、李连杰唯一的爱徒,34岁身价过亿,大半个娱乐圈都在为他工作5061
  4. 4、《上错花轿嫁对郎》剧组重聚,其他演员成黄奕背景板引争议1980
  5. 5、杨洋不扛剧?可新剧还没定档,就已经被韩国买入4367
  6. 6、中影“欠款”事件升级美电影协会要求官方介入2802
  7. 7、内地选送《邪不压正》,87部强片竞争,姜文能被奥斯卡接纳吗?1018
  8. 8、不怕观众看腻吗?《骊歌行》定档后,还没播出的《XX行》多达6部2877
  9. 9、热播电视剧的四对姐弟恋,四大盛世美颜,你会喜欢哪一对?1849
  10. 10、周杰伦晒女儿周周,还催婚林俊杰,就连陈冠希也加入晒娃圈2274
全部评论(0)
我也有话说
0
收藏
点赞
顶部