0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

時(shí)間戳使用技巧

玩轉(zhuǎn)單片機(jī) ? 來源:玩轉(zhuǎn)單片機(jī) ? 2023-12-18 09:17 ? 次閱讀

好久前寫過一篇相關(guān)的推文,當(dāng)時(shí)也是第一次接觸和使用,由于沒有深入的了解和研究, 這段時(shí)間一直存在疑惑,趁著這段時(shí)間就回顧一下和解決疑惑.

|疑惑

很多知識(shí)其實(shí)是自學(xué)的, 有些知識(shí)雖然學(xué)了, 但是并沒有認(rèn)真深入了解. 時(shí)間戳的實(shí)現(xiàn)往往是使用u32類型的變量在1ms定時(shí)中自加,那么:

u32極限值:4294967295
約等于4294967秒
約等于71582分
約等于1193小時(shí)
約等于49.7天

從結(jié)果就可以看出49.7天后就會(huì)溢出, 由此就可以看出時(shí)間戳并不能保證唯一性,這就是時(shí)間戳最明顯的bug,導(dǎo)致項(xiàng)目不敢使用這個(gè)技巧,后來發(fā)現(xiàn)好像不對(duì)勁, 為啥這么多大佬在用不會(huì)出問題,所以就抽空深入研究一下.

|解惑

時(shí)間戳: 簡(jiǎn)單可以理解為某一時(shí)刻的時(shí)間點(diǎn), 并不是常規(guī)計(jì)算機(jī)理解的時(shí)間戳(時(shí)間戳是指格林威治時(shí)間1970年01月01日00時(shí)00分00秒(北京時(shí)間1970年01月01日08時(shí)00分00秒)起至現(xiàn)在的總秒數(shù))!

持續(xù)時(shí)間:持續(xù)時(shí)間是指時(shí)間間隔的長(zhǎng)度,即定義間隔開始和結(jié)束的時(shí)刻之間的時(shí)間距離。

要明確區(qū)分常規(guī)的概念和特定場(chǎng)景下的概念, 高級(jí)語言是可以通過時(shí)間戳相減獲取時(shí)間間隔與持續(xù)時(shí)間做對(duì)比, 而本文說的時(shí)間戳并不是唯一的, 所以直接使用時(shí)間戳相減意義并不是很大. 通過觀察可以發(fā)現(xiàn),一個(gè)數(shù)有最大值, 并且時(shí)間間隔又是固定的, 那是不是意味著有規(guī)律可循, 由于u32的數(shù)太大, 就直接使用u8的數(shù)來驗(yàn)證猜想:

#include"stdio.h"
#include"stdint.h"

intmain()
{
uint8_ttick_now=0;//當(dāng)前的時(shí)間戳
uint8_ttick_old=0;//過去的時(shí)間戳
uint8_twait=3;//等待的時(shí)間
uint8_tdiff=0;//時(shí)間差
uint32_tj=0;
printf("tick_old:%d,j:%d
",tick_old,j);
for(uint32_ti=0;i

結(jié)果輸出:

tick_old:0,j:0
tick_old:3,j:1
tick_old:6,j:2
tick_old:9,j:3
tick_old:12,j:4
tick_old:15,j:5
tick_old:18,j:6
tick_old:21,j:7
tick_old:24,j:8
tick_old:27,j:9
tick_old:30,j:10
tick_old:33,j:11
tick_old:36,j:12
tick_old:39,j:13
tick_old:42,j:14
tick_old:45,j:15
tick_old:48,j:16
tick_old:51,j:17
tick_old:54,j:18
tick_old:57,j:19
tick_old:60,j:20
tick_old:63,j:21
tick_old:66,j:22
tick_old:69,j:23
tick_old:72,j:24
tick_old:75,j:25
tick_old:78,j:26
tick_old:81,j:27
tick_old:84,j:28
tick_old:87,j:29
tick_old:90,j:30
tick_old:93,j:31
tick_old:96,j:32
tick_old:99,j:33
tick_old:102,j:34
tick_old:105,j:35
tick_old:108,j:36
tick_old:111,j:37
tick_old:114,j:38
tick_old:117,j:39
tick_old:120,j:40
tick_old:123,j:41
tick_old:126,j:42
tick_old:129,j:43
tick_old:132,j:44
tick_old:135,j:45
tick_old:138,j:46
tick_old:141,j:47
tick_old:144,j:48
tick_old:147,j:49
tick_old:150,j:50
tick_old:153,j:51
tick_old:156,j:52
tick_old:159,j:53
tick_old:162,j:54
tick_old:165,j:55
tick_old:168,j:56
tick_old:171,j:57
tick_old:174,j:58
tick_old:177,j:59
tick_old:180,j:60
tick_old:183,j:61
tick_old:186,j:62
tick_old:189,j:63
tick_old:192,j:64
tick_old:195,j:65
tick_old:198,j:66
tick_old:201,j:67
tick_old:204,j:68
tick_old:207,j:69
tick_old:210,j:70
tick_old:213,j:71
tick_old:216,j:72
tick_old:219,j:73
tick_old:222,j:74
tick_old:225,j:75
tick_old:228,j:76
tick_old:231,j:77
tick_old:234,j:78
tick_old:237,j:79
tick_old:240,j:80
tick_old:243,j:81
tick_old:246,j:82
tick_old:249,j:83
tick_old:252,j:84
tick_old:255,j:85

尋找規(guī)律:

//剛開始
tick_old:0,j:0
//第一次溢出
tick_old:255,j:85
tick_old:2,j:86
//第二次溢出
tick_old:254,j:170
tick_old:1,j:171
//第三次溢出
tick_old:253,j:255
tick_old:0,j:256
//第四次溢出
tick_old:255,j:341
tick_old:2,j:342
//第五次溢出
tick_old:254,j:426
tick_old:1,j:427
//第六次溢出
tick_old:253,j:511
tick_old:0,j:512
...

通過觀察可以發(fā)現(xiàn)等待的時(shí)間的設(shè)定和溢出多少次后再次回到0值是有關(guān)系的, 上面設(shè)定的等待時(shí)間為3就意味著溢出三次就進(jìn)入下一個(gè)循環(huán),同時(shí)可以看到每次觸發(fā)的時(shí)間間隔都是3, 并不會(huì)因?yàn)橐绯龆鴮?dǎo)致出現(xiàn)問題.

4757ee6a-9d39-11ee-8b88-92fbcf53809c.png

注意: 時(shí)間間隔只有保證在49.7天內(nèi)才會(huì)正常使用!

所以規(guī)避時(shí)間溢出BUG 的方法就是對(duì)時(shí)間戳做減法,直接使用時(shí)間戳就必然需要解決時(shí)間溢出的BUG!

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7292

    瀏覽量

    87523
  • 時(shí)間戳
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    2563

原文標(biāo)題:技巧|時(shí)間戳

文章出處:【微信號(hào):玩轉(zhuǎn)單片機(jī),微信公眾號(hào):玩轉(zhuǎn)單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32L051同時(shí)開啟RTC時(shí)間和秒喚醒后,使用GPIO引腳無法觸發(fā)時(shí)間中斷如何解決?

    STM32L051同時(shí)開啟RTC時(shí)間和秒喚醒后,使用GPIO引腳無法觸發(fā)時(shí)間中斷。但使用一個(gè)3.3V的電源接到PC13能夠觸發(fā)RTC時(shí)間
    發(fā)表于 04-01 06:37

    時(shí)間同步獲取時(shí)間

    新手一枚,對(duì)單片機(jī)原理還不是很清楚,求教:TinyOS中的時(shí)間同步首先要獲取本地時(shí)間,getStartTime(),想知道它是怎么獲取時(shí)間
    發(fā)表于 03-20 10:37

    如何查詢時(shí)間

    有的時(shí)候,我們破解的某些軟件,需要修改時(shí)間,比如Mybase這款筆記軟件,破解的時(shí)候主要是修改時(shí)間。查詢方法一:假如我使用的是python,>>> import time>
    發(fā)表于 02-15 16:54

    uCOSIII的時(shí)間出現(xiàn)錯(cuò)誤

    想關(guān)掉時(shí)間簡(jiǎn)單地進(jìn)行下移植但已經(jīng)關(guān)掉卻沒作用還是出現(xiàn)下面這種錯(cuò)誤
    發(fā)表于 03-28 06:35

    ERTC 時(shí)間的使用

    示例目的演示AT32F415以及AT32F421 ERTC時(shí)間的使用。支持型號(hào):AT32F415xxAT32F421xx主要使用外設(shè):ERTC1.快速使用方法1.1 硬件資源1
    發(fā)表于 08-18 19:55

    什么是Unix時(shí)間

    1.什么是Unix時(shí)間Unix時(shí)間是從1970年1月1日(UTC/GMT的午夜)開始所經(jīng)過的秒數(shù),不考慮閏秒。 [1]Unix時(shí)間
    發(fā)表于 01-12 08:30

    時(shí)間的簡(jiǎn)介與實(shí)現(xiàn)

    時(shí)間時(shí)間簡(jiǎn)介時(shí)間的實(shí)現(xiàn)時(shí)間
    發(fā)表于 02-28 06:23

    LittleFS時(shí)間與Windows時(shí)間不兼容要怎么處理?

    上次更新的文件時(shí)間。但是,這似乎與 Windows 時(shí)間不兼容,因此: 1. 如果我使用 LittleFS 編輯文件然后顯示 Last Write,它會(huì)按預(yù)期顯示最近的日期/
    發(fā)表于 06-01 08:18

    基于橢圓曲線盲簽名的安全數(shù)字時(shí)間方案

    時(shí)間能為電子文件或電子交易提供準(zhǔn)確的時(shí)間證明。該文在時(shí)間相對(duì)認(rèn)證和時(shí)間
    發(fā)表于 04-18 09:45 ?17次下載

    時(shí)間在區(qū)塊鏈中是如何工作的

    所謂時(shí)間,按官方定義,就是能表示其他的數(shù)據(jù)在某個(gè)特定時(shí)間之前已經(jīng)完整存在、 并且可以驗(yàn)證的一種數(shù)據(jù),一般是一個(gè)字符序列,能唯一地標(biāo)識(shí)某一刻的時(shí)間。
    發(fā)表于 03-05 11:59 ?1697次閱讀

    UNIX時(shí)間和北京時(shí)間的相互轉(zhuǎn)換

    文章目錄什么是時(shí)間頭文件time.h介紹UNIX時(shí)間轉(zhuǎn)北京時(shí)間北京時(shí)間轉(zhuǎn)UNIX
    發(fā)表于 11-21 19:06 ?11次下載
    UNIX<b class='flag-5'>時(shí)間</b><b class='flag-5'>戳</b>和北京<b class='flag-5'>時(shí)間</b>的相互轉(zhuǎn)換

    uCOS-III(2) 時(shí)間

    時(shí)間時(shí)間簡(jiǎn)介時(shí)間的實(shí)現(xiàn)時(shí)間
    發(fā)表于 01-14 16:04 ?4次下載
    uCOS-III(2) <b class='flag-5'>時(shí)間</b><b class='flag-5'>戳</b>

    相機(jī)和激光雷達(dá)之間的時(shí)間同步解析

    相機(jī)和激光雷達(dá)之間的時(shí)間同步問題一直是實(shí)時(shí)跑SLAM的先決條件。本文試圖以最清晰的思路去講明白這個(gè)事情。
    的頭像 發(fā)表于 10-19 15:22 ?1886次閱讀

    相機(jī)和激光雷達(dá)的時(shí)間同步問題

    相機(jī)和激光雷達(dá)之間的時(shí)間同步問題一直是實(shí)時(shí)跑SLAM的先決條件。本文試圖以最清晰的思路去講明白這個(gè)事情。
    的頭像 發(fā)表于 11-28 16:08 ?1436次閱讀

    Java中時(shí)間的使用

    ());System.out.println(nowTime); 輸出: 2022-06-08 11:15:51.014 Long型時(shí)間 Long timeLong
    的頭像 發(fā)表于 01-13 15:30 ?706次閱讀