當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]最近在做一個8位單片機(jī)項(xiàng)目,其中用到了時間戳轉(zhuǎn)換函數(shù),這個在32位機(jī)上一個庫函數(shù)就解決了問題,沒想到在8位單片機(jī)中沒有對應(yīng)庫(time.h),沒有辦法只有自己來寫。目標(biāo):1,滿足和庫函數(shù)mktime localtime所計算出的

最近在做一個8位單片機(jī)項(xiàng)目,其中用到了時間戳轉(zhuǎn)換函數(shù),這個在32位機(jī)上一個庫函數(shù)就解決了問題,沒想到在8位單片機(jī)中沒有對應(yīng)庫(time.h),沒有辦法只有自己來寫。

目標(biāo):1,滿足和庫函數(shù)mktime localtime所計算出的數(shù)據(jù)一至;2,考慮8位單片機(jī)的處理能力慢軟件效率問題。

分享給大家,方便有同樣需求的朋友。

gcc 環(huán)境進(jìn)行測試:

測試程序:

1 #include

2 #include

3 #include

4 #include

5

6 #if 0

7 struct tm {

8 int tm_sec; /* seconds after the minute, 0 to 60

9 (0 - 60 allows for the occasional leap second) */

10 int tm_min; /* minutes after the hour, 0 to 59 */

11 int tm_hour; /* hours since midnight, 0 to 23 */

12 int tm_mday; /* day of the month, 1 to 31 */

13 int tm_mon; /* months since January, 0 to 11 */

14 int tm_year; /* years since 1900 */

15 // int tm_wday; /* days since Sunday, 0 to 6 */

16 // int tm_yday; /* days since January 1, 0 to 365 */

17 // int tm_isdst; /* Daylight Savings Time flag */

18 };

19 #endif

20 static const char mon_list[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

21 static const char leap_mon_list[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

22

23 /*******************************************************************************

24 * Function Name : fun_mktime

25 * Description : 時間轉(zhuǎn)為時間戳

26 * Input :

27 * Output :

28 * Other :

29 * Date : 2016.11.14

30 *******************************************************************************/

31 int32_t fun_mktime(struct tm *pT)

32 {

33 const char *pDays = NULL;

34 int32_t tmp = 0;

35 int16_t i = 0;

36

37 //計算總共有多少個閏年

38 tmp = (pT->tm_year / 4 - pT->tm_year / 100 + pT->tm_year / 400) - (1970 / 4 - 1970 / 100 + 1970 / 400);

39

40 //如果當(dāng)年是閏年,需要減去當(dāng)年的閏年

41 if ((pT->tm_year % 4 == 0) && ((pT->tm_year % 100 != 0) || (pT->tm_year % 400 == 0)))

42 {

43 tmp = tmp - 1 + (pT->tm_year - 1970) * 365;

44 pDays = leap_mon_list;

45 }

46 else

47 {

48 tmp = tmp + (pT->tm_year - 1970) * 365;

49 pDays = mon_list;

50 }

51

52 for (i = 0; i < pT->tm_mon - 1; i++)

53 tmp += pDays[i];

54

55 tmp = tmp + pT->tm_mday - 1;

56

57 tmp = tmp * 24 + pT->tm_hour;

58

59 tmp = tmp * 60 + pT->tm_min;

60

61 tmp = tmp * 60 + pT->tm_sec;

62

63 return tmp;

64 }

65

66 /*******************************************************************************

67 * Function Name : fun_localtime

68 * Description : 時間戳轉(zhuǎn)為時間

69 * Input : struct tm *pT: 輸出的時間緩沖區(qū) uint32_t tim:當(dāng)前時間戳

70 * Output :

71 * Other :

72 * Date : 2016.11.14

73 *******************************************************************************/

74 void fun_localtime(struct tm *pT, int32_t tim)

75 {

76 const char *pDays = NULL;

77

78 uint16_t index = 0;

79

80 memset(pT, 0, sizeof(*pT));

81

82 //year initialization

83 if (tim > 0x5685C180L) // 2016-1-1 0:0:0

84 {

85 pT->tm_year = 2016;

86 tim -= 0x5685C180L;

87 }

88 else if (tim > 0x4B3D3B00L) // 2010-1-1 0:0:0

89 {

90 pT->tm_year = 2010;

91 tim -= 0x4B3D3B00L;

92 }

93 else if (tim > 0x386D4380L) // 2000-1-1 0:0:0

94 {

95 pT->tm_year = 2000;

96 tim -= 0x386D4380L;

97 }

98 else

99 {

100 pT->tm_year = 1970;

101 }

102

103 //now have year

104 while (tim >= 366L * 24 * 60 * 60)

105 {

106 if ((pT->tm_year % 4 == 0) && ((pT->tm_year % 100 != 0) || (pT->tm_year % 400 == 0)))

107 tim -= 366L * 24 * 60 * 60;

108 else

109 tim -= 365L * 24 * 60 * 60;

110

111 pT->tm_year++;

112 }

113

114 // then 365 * 24 * 60 * 60 < tim < 366 * 24 * 60 * 60

115 if (!(((pT->tm_year % 4 == 0) && ((pT->tm_year % 100 != 0) || (pT->tm_year % 400 == 0))))

116 && (tim > 365L * 24 * 60 * 60))

117 {

118 tim -= 365L * 24 * 60 * 60;

119 pT->tm_year++;

120 }

121

122 // this year is a leap year?

123 if (((pT->tm_year % 4 == 0) && ((pT->tm_year % 100 != 0) || (pT->tm_year % 400 == 0))))

124 pDays = leap_mon_list;

125 else

126 pDays = mon_list;

127

128 pT->tm_mon = 1;

129 // now have mon

130 while (tim > pDays[index] * 24L * 60 * 60)

131 {

132 tim -= pDays[index] * 24L * 60 * 60;

133 index++;

134 pT->tm_mon++;

135 }

136

137 // now have days

138 pT->tm_mday = tim / (24L * 60 * 60) + 1;

139 tim = tim % (24L * 60 * 60);

140

141 // now have hour

142 pT->tm_hour = tim / (60 * 60);

143 tim = tim % (60 * 60);

144

145 // now have min

146 pT->tm_min = tim / 60;

147 tim = tim % 60;

148

149 pT->tm_sec = tim;

150 }

151

152

153 int main (void *parg)

154 {

155 struct tm *pT = {0};

156 time_t timep = 0;

157 uint32_t cur_tim = 0;

158

159 time(&timep);

160

161 pT = localtime(&timep);

162

163 printf("linux time t= %dn", (int32_t)timep);

164 pT->tm_year += 1900;

165 pT->tm_mon += 1;

166 printf("fun_mktime t= %dn", cur_tim = (uint32_t)fun_mktime(pT));

167

168 printf("localtime t= %d-%d-%d %d:%d:%dn", pT->tm_year, pT->tm_mon, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec);

169 memset(pT, 0, sizeof(*pT));

170 fun_localtime(pT, cur_tim);

171 printf("fun_localtime t= %d-%d-%d %d:%d:%dn", pT->tm_year, pT->tm_mon, pT->tm_mday, pT->tm_hour, pT->tm_min, pT->tm_sec);

172 return 0;

173 }


測試結(jié)果:

linux time = 1480133002

fun_mktime = 1480161802

localtime = 2016-11-26 12:3:22

fun_localtime = 2016-11-26 12:3:22

linux time 是庫函數(shù)mktime計算結(jié)果,因?yàn)檫M(jìn)行了時區(qū)處理,所以與fun_mktime計算出來剛好是8 * 3600 秒的差值



本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉