chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

剖析毫秒級(jí)延時(shí)防溢出的原理

Linux閱碼場 ? 來源:RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 作者:RTThread物聯(lián)網(wǎng)操作 ? 2021-08-02 17:38 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前文指出了基于系統(tǒng)滴答計(jì)數(shù)實(shí)現(xiàn)的毫秒級(jí)延時(shí)的問題。

uint32_t comm_get_ms(void)

{

return sys_tick_get();

}

void comm_delay(uint32_t ms)

{

uint32_t timeout = comm_get_ms() + ms;

while(comm_get_ms() 《 timeout);

}

comm_get_ms返回當(dāng)前系統(tǒng)時(shí)間(系統(tǒng)滴答計(jì)數(shù)),即系統(tǒng)從啟動(dòng)到現(xiàn)在經(jīng)過了多少毫秒。comm_delay先獲取當(dāng)前時(shí)間,加上延時(shí)時(shí)間以計(jì)算出到期時(shí)間timeout,之后循環(huán)等待當(dāng)前時(shí)間超過timeout以完成延時(shí)。

系統(tǒng)時(shí)間使用uint32_t變量來記錄,經(jīng)過49.71天后將達(dá)到最大值UINT32_MAX(0xffffffff),溢出后回到0重新累加。不僅是當(dāng)前時(shí)間會(huì)溢出,在接近49.71天時(shí),計(jì)算的timeout將會(huì)更先一步溢出,從而使延時(shí)判斷失效。

前文在結(jié)尾給出了解決方案:

void comm_delay(uint32_t ms)

{

uint32_t timeout = comm_get_ms() + ms;

while(comm_get_ms() - timeout 》 UINT32_MAX / 2);

}

其實(shí)改動(dòng)很小,僅僅修改了判斷超時(shí)的條件。為什么要用兩個(gè)時(shí)間差去與UINT32_MAX / 2比較?判斷條件為什么是大于?

了解其中的原理是有必要的。因?yàn)檠訒r(shí)的條件如上,而如果想實(shí)現(xiàn)定時(shí)的話,條件就會(huì)倒過來。知其所以然,方能靈活運(yùn)用。

定時(shí)任務(wù):

uint32_t timeout = 0;

while (1)

{

if (comm_get_ms() - timeout 《 UINT32_MAX / 2)

{

printf(“hello

”);

timeout = comm_get_ms() + 1000;

}

}

主要矛盾

無論是延時(shí)還是定時(shí),我們都是在進(jìn)行時(shí)間的比較。先根據(jù)延時(shí)或定時(shí)時(shí)長計(jì)算出到期時(shí)間timeout,之后不停的判斷當(dāng)時(shí)時(shí)間有沒有超過這個(gè)timeout。

所有的時(shí)間變量都是uint32_t,由于它的最大值非常大,為了方便講解,我們假設(shè)所有的變量都是uint8_t,即8位無符號(hào)整型,取值范圍為0-255。同樣為方便敘述,以cur_time表示當(dāng)前時(shí)間,以timeout表示目標(biāo)到期時(shí)間。

現(xiàn)在的任務(wù)也非常清楚了,在各種場景下比較cur_time是否超過了timeout。比如:

起始cur_time為10,延時(shí)目標(biāo)為5,則timeout為10 + 5 = 15。判斷依據(jù)非常簡單,cur_time 《 15時(shí)視為未超過timeout,或者說cur_time 《 timeout視為未超過timeout。

起始cur_time為250,延時(shí)目標(biāo)為10,則timeout為250 + 10 = 260 = 4。此時(shí)cur_time 《 timeout不再適用。

張三和李四誰跑的快

既然時(shí)間溢出問題讓我們頭疼,那我們先來看一個(gè)簡單的問題,一個(gè)任何人都可以不假思索得出答案的問題:判斷跑道上的張三和李四誰跑的快,或者說誰跑在前面。

如下圖,張三(A)和李四(B)在跑道上跑步,沿逆時(shí)針方向跑。藍(lán)色是起跑線,不過他們并不只跑一圈,假設(shè)跑三圈。并且我們知道,張三和李四的水平相差不大,短短的三圈不足以讓他們拉快過長的距離,更不可能出現(xiàn)套圈。

假設(shè)這個(gè)跑道長256米,從起點(diǎn)開始沿逆時(shí)針方向(即跑步的方向)標(biāo)注坐標(biāo)。那么A和B在坐標(biāo)軸的位置大致如下:

77309ec8-e032-11eb-9e57-12bb97331649.png

假設(shè)A為10,B為240,A 《 B,但是從跑道的圖中大家不假思索就得出A跑在前面。這是為什么呢?

大家在判斷誰在前面時(shí),其實(shí)根本沒去管那根藍(lán)色的線(起點(diǎn)或終點(diǎn))。因?yàn)榕艿朗孜蚕噙B,而且張三和李四要跑好幾圈,必將多次經(jīng)過起終點(diǎn),所以起終點(diǎn)沒有任何判斷價(jià)值。

人腦是怎么判斷的

筆者反復(fù)自我剖析,覺得可能是這樣判斷的:

人腦會(huì)做兩種假設(shè),張三(A)快,或者李四(B)快。最終選擇一個(gè)最合理的假設(shè)。

假設(shè)張三(A)快,那么A沿順時(shí)針跑回B(逆時(shí)針是前進(jìn)方向,往回跑就是順時(shí)針)的距離即為A超前B的距離,如下圖的紅色箭頭,相對(duì)于一圈的長度而言是一個(gè)較小的距離。假設(shè)李四(B)快,則B沿順時(shí)針方向需要跑大半圈才能遇到張三(A)。如果李四確實(shí)比張三快的話,那么快了不只一點(diǎn)點(diǎn),而是超前大半圈。先前說過,張三和李四的水平相差不大,短短的三圈不足以讓他們拉快過長的距離。所以我們更愿意相信第一種假設(shè)成立,即張三(A)比李四(B)跑的快。

人腦做上述判斷的時(shí)候,并沒有給跑道建立坐標(biāo)系,也不是判斷張三和李四的坐標(biāo)值哪個(gè)大,而是判斷張三和李四的距離。這個(gè)距離是有方向性的。

假設(shè)張三(A)快,則目測A跑回B的距離L(A-B)。這個(gè)距離比較小,所以判斷成立,A確實(shí)在B前面。

假設(shè)李四(B)快,則目測B跑回A的距離L(B-A)。這個(gè)距離比較大,所以判斷不成立,B其實(shí)在A的后面。

其實(shí)根本不需要驗(yàn)證兩種假設(shè),只需要驗(yàn)證一個(gè)就行了,因?yàn)樗鼈兪菍?duì)立的。

回歸代碼

人腦通過視覺來估測張三與李四的距離,但是計(jì)算機(jī)不行,它需要一個(gè)明確的方法,還是需要坐標(biāo)系的。

還是假設(shè)這個(gè)跑道長256米,從起點(diǎn)開始沿逆時(shí)針方向(即跑步的方向)標(biāo)注坐標(biāo)。

簡單情況

先看簡單的情況,即A和B在起點(diǎn)的同側(cè)。對(duì)應(yīng)到坐標(biāo)系上為:

77be2e96-e032-11eb-9e57-12bb97331649.png

A在40米處(記為Xa),B在20米處(記為Xb)。A返回到B的距離為

L = Xa - Xb = 40 - 20 = 20

這個(gè)距離遠(yuǎn)小于256,所以A在B的前面。

溢出情況

再來看看復(fù)雜的溢出情況,即A和B在起點(diǎn)兩側(cè)。

對(duì)應(yīng)在坐標(biāo)系上時(shí),為方便繪制,將A、B與起終點(diǎn)的距離拉遠(yuǎn)一點(diǎn)。Xa=30,Xb=220。A返回到B的距離為:

L = L1 + L2 = (Xa - 0) + (256 - Xb) = 30 + (256 - 220) = 66

66也是遠(yuǎn)小于256的,所以A還是在B的前面。

歸一

有沒有發(fā)現(xiàn)什么不對(duì)?剛才討論區(qū)分簡單情況和溢出情況,在計(jì)算L時(shí)的公式是不同的,這可有點(diǎn)小麻煩。如果有統(tǒng)一的公式就好了。

讓我們再看一眼溢出情況的公式:

L = L1 + L2

= (Xa - 0) + (256 - Xb)

= Xa - Xb + 256 = Xa - Xb

這么一調(diào)整就和簡單情況一樣了吧。為什么把加256給去掉了?因?yàn)槲覀冇懻揦a和Xb是uint8_t,加256和沒加是一樣的。

驗(yàn)證

還是上一個(gè)例子的場景,我們來假設(shè)B在A前面。B返回到A的距離為:

L = Xb - Xa = 220 - 30 = 190

190比較接近256,所以假設(shè)不成立,B并不在A前面,而是A在B前面。

我們在判斷距離時(shí),用了兩種標(biāo)準(zhǔn):

L遠(yuǎn)小于256

L比較接近256

對(duì)于計(jì)算機(jī)而言,這是無法實(shí)現(xiàn)的,它需要一個(gè)明確的標(biāo)準(zhǔn)。那是什么呢?就一刀切吧,以256 / 2為閾值。

L 《 256 / 2:假設(shè)成立

L 》 256 / 2:假設(shè)失敗至于L == 256 / 2的情況,隨便歸入哪個(gè)都行。

再看時(shí)間判斷

void comm_delay(uint32_t ms)

{

uint32_t timeout = comm_get_ms() + ms;

while(comm_get_ms() - timeout 》 UINT32_MAX / 2);

}

再看這時(shí)間判斷,有沒有豁然開朗呢?comm_get_ms()是張三,timeout是李四,變量范圍由uint8_t變成了uint32_t,僅此而已。

后記

這種超時(shí)判斷方法并非由筆者想出,是筆者在閱讀RT-Thead操作系統(tǒng)的timer源碼時(shí)發(fā)現(xiàn)的。rt_timer是RT-Thread定時(shí)器模塊,提供基于系統(tǒng)滴答計(jì)數(shù)的定時(shí)功能,其計(jì)數(shù)值就是32位無符號(hào)整型uint32_t,時(shí)間久了必然溢出。

筆者之前也為溢出問題感到頭疼,而RT-Thread號(hào)稱不懼溢出,于是筆者懷著好奇的心態(tài)挖掘了其解決方法。在rt_timer中,有多處這樣的判斷,現(xiàn)在看起來是不是感覺很親切呢?

/*

* It supposes that the new tick shall less than the half duration of

* tick max.

*/if ((current_tick - t-》timeout_tick) 《 RT_TICK_MAX / 2)

編輯:jq

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

    關(guān)注

    0

    文章

    110

    瀏覽量

    26228

原文標(biāo)題:從rtthread timer模塊中找到裸機(jī)定時(shí)問題的解決方案

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    超級(jí)電容黑科技:毫秒級(jí)快充,賦能設(shè)備瞬時(shí)動(dòng)力爆發(fā)

    超級(jí)電容作為一種介于傳統(tǒng)電容與電池之間的儲(chǔ)能器件,憑借其毫秒級(jí)充放電速度、超高功率密度和超長循環(huán)壽命,正成為能源存儲(chǔ)領(lǐng)域的“黑科技”。其核心優(yōu)勢在于突破了傳統(tǒng)電池的能量釋放瓶頸,為設(shè)備提供瞬時(shí)動(dòng)力爆發(fā)能力,同時(shí)在快充場景中展現(xiàn)出顛覆性潛力。
    的頭像 發(fā)表于 12-10 17:21 ?148次閱讀

    使用系統(tǒng)定時(shí)器SysTick來實(shí)現(xiàn)精確延時(shí)微秒和毫秒函數(shù)

    );//定時(shí)1ms即SysTick定時(shí)器每1ms中斷一次,如果我們定義全局變量,然后在中斷函數(shù)中,讓此變量遞減,而在延時(shí)函數(shù)中,一直判斷此變量是否減到了0,那么這樣就實(shí)現(xiàn)了一個(gè)延時(shí)毫秒的函數(shù)。同理改變定時(shí)器
    發(fā)表于 11-20 07:12

    數(shù)據(jù)采集 “延遲高”?5G + 實(shí)時(shí)采集,毫秒級(jí)同步無卡頓

    對(duì)于企業(yè)而言,數(shù)據(jù)采集的 “快” 與 “準(zhǔn)”,不再是可選的加分項(xiàng),而是生存的必修課。5G + 實(shí)時(shí)采集,正在讓 “毫秒級(jí)同步” 從技術(shù)概念變?yōu)榭陕涞氐膬r(jià)值創(chuàng)造,為工業(yè)數(shù)字化轉(zhuǎn)型按下 “加速鍵”。
    的頭像 發(fā)表于 11-19 14:05 ?197次閱讀
    數(shù)據(jù)采集 “延遲高”?5G + 實(shí)時(shí)采集,<b class='flag-5'>毫秒</b><b class='flag-5'>級(jí)</b>同步無卡頓

    感知再進(jìn)化,新增“觸發(fā)延時(shí)”功能!

    在智能感知的世界里,毫秒級(jí)的判斷往往決定了用戶體驗(yàn)的成敗。我們公司始終致力于打磨產(chǎn)品的每一個(gè)細(xì)節(jié)。今天,我們自豪地宣布,明星產(chǎn)品HLK-LD2410B24GHz人體存在感應(yīng)模組迎來重磅功能更新
    的頭像 發(fā)表于 11-10 11:05 ?321次閱讀
    感知再進(jìn)化,新增“觸發(fā)<b class='flag-5'>延時(shí)</b>”功能!

    數(shù)字毫秒表存在意義、用途及挑選指南 存儲(chǔ)式數(shù)字毫秒計(jì)、數(shù)字毫秒計(jì)

    在追求精準(zhǔn)計(jì)時(shí)的現(xiàn)代社會(huì),電秒表與智能毫秒計(jì)憑借其獨(dú)特的性能,成為多個(gè)領(lǐng)域不可或缺的工具。它們不僅解決了傳統(tǒng)計(jì)時(shí)方式精度不足的問題,更隨著技術(shù)發(fā)展不斷升級(jí),為各行業(yè)的高效運(yùn)轉(zhuǎn)與創(chuàng)新研究提供有力支撐
    的頭像 發(fā)表于 11-04 18:20 ?1869次閱讀
    數(shù)字<b class='flag-5'>毫秒</b>表存在意義、用途及挑選指南 存儲(chǔ)式數(shù)字<b class='flag-5'>毫秒</b>計(jì)、數(shù)字<b class='flag-5'>毫秒</b>計(jì)

    如何利用蜂鳥HbirdV2-SoC自帶外設(shè)PWM進(jìn)行毫秒級(jí)延時(shí)和計(jì)時(shí)

    1 隊(duì)伍介紹 本篇主要介紹如何利用蜂鳥HbirdV2-SoC自帶外設(shè)PWM進(jìn)行毫秒級(jí)延時(shí)和計(jì)時(shí)。 2 TIM0配置 在上一個(gè)帖子中,介紹了HbirdV2-SoC自帶外設(shè)PWM的寄存器
    發(fā)表于 10-30 07:47

    手持機(jī)是什么?工業(yè)級(jí)手持機(jī)抗摔能力怎么樣?

    手持機(jī)是什么?本文深入解析工業(yè)級(jí)手持機(jī)的防水、防塵、摔性能,解讀IP等級(jí)與MIL-STD標(biāo)準(zhǔn),結(jié)合物流、電力、巡檢等實(shí)際應(yīng)用場景,告訴你三
    的頭像 發(fā)表于 09-28 10:58 ?279次閱讀
    三<b class='flag-5'>防</b>手持機(jī)是什么?工業(yè)<b class='flag-5'>級(jí)</b>三<b class='flag-5'>防</b>手持機(jī)抗摔能力怎么樣?

    探頭的延時(shí)介紹

    探頭的延時(shí)是指信號(hào)從被測點(diǎn)傳輸?shù)绞静ㄆ鬏斎攵说臅r(shí)間間隔,即信號(hào)經(jīng)過探頭的探針、傳輸電纜、內(nèi)部電路等路徑后,到達(dá)示波器采樣系統(tǒng)的總時(shí)間延遲,(以下討論低速信號(hào)情景,忽略示波器通道間ps級(jí)延時(shí)誤差)。不同型號(hào)的探頭
    的頭像 發(fā)表于 09-17 17:32 ?661次閱讀
    探頭的<b class='flag-5'>延時(shí)</b>介紹

    毫秒級(jí)響應(yīng)!配網(wǎng)行波故障預(yù)警與定位裝置煥新效率

    在電力配網(wǎng)運(yùn)行中,故障預(yù)警與定位始終是保障供電可靠性的關(guān)鍵環(huán)節(jié)。一旦發(fā)生線路短路、接地等故障,故障區(qū)域的持續(xù)停電會(huì)給工業(yè)生產(chǎn)、居民生活帶來巨大影響。而如今,配網(wǎng)行波故障定位裝置的出現(xiàn),以其“毫秒級(jí)
    發(fā)表于 09-03 13:45

    認(rèn)識(shí)探頭的延時(shí)

    探頭的延時(shí)是指信號(hào)從被測點(diǎn)傳輸?shù)绞静ㄆ鬏斎攵说臅r(shí)間間隔,即信號(hào)經(jīng)過探頭的探針、傳輸電纜、內(nèi)部電路等路徑后,到達(dá)示波器采樣系統(tǒng)的總時(shí)間延遲,(以下討論低速信號(hào)情景,忽略示波器通道間ps級(jí)延時(shí)誤差
    的頭像 發(fā)表于 08-26 17:04 ?649次閱讀
    認(rèn)識(shí)探頭的<b class='flag-5'>延時(shí)</b>

    中科曙光讓氣象數(shù)據(jù)解碼邁入毫秒級(jí)時(shí)代

    依托曙光超智融合與液冷技術(shù),某氣象大數(shù)據(jù)云平臺(tái)的數(shù)據(jù)并發(fā)處理能力躍升顯著,數(shù)據(jù)解碼速度進(jìn)入毫秒級(jí)時(shí)代,為我國氣象數(shù)值預(yù)測現(xiàn)代化建設(shè)注入澎湃動(dòng)力。
    的頭像 發(fā)表于 07-31 17:17 ?966次閱讀

    智能安邊緣計(jì)算的技術(shù)解析

    維度,剖析核心板如何推動(dòng)安從"被動(dòng)記錄"到"主動(dòng)決策"的升級(jí),并給出選型建議。 ? --- 一、核心板的硬件架構(gòu)創(chuàng)新** ? 1. 異構(gòu)計(jì)算架構(gòu):算力與能效的平衡? 以SSD2351為例,其采用**"CPU+NPU+IVE"三級(jí)
    的頭像 發(fā)表于 06-26 11:56 ?381次閱讀

    智能電網(wǎng)第6期 毫秒級(jí)時(shí)延如何實(shí)現(xiàn)?電力設(shè)備狀態(tài)實(shí)時(shí)監(jiān)控優(yōu)化

    隨著新型電力系統(tǒng)建設(shè)加速推進(jìn),電力設(shè)備狀態(tài)監(jiān)控對(duì)通信時(shí)延的要求已提升至毫秒級(jí)。在變電站自動(dòng)化、輸電線路監(jiān)測等場景中,傳統(tǒng)通信方案面臨嚴(yán)峻挑戰(zhàn): ? 時(shí)延瓶頸:保護(hù)控制類業(yè)務(wù)要求端到端時(shí)延 可靠性挑戰(zhàn)
    的頭像 發(fā)表于 04-25 09:40 ?426次閱讀
    智能電網(wǎng)第6期 <b class='flag-5'>毫秒</b><b class='flag-5'>級(jí)</b>時(shí)延如何實(shí)現(xiàn)?電力設(shè)備狀態(tài)實(shí)時(shí)監(jiān)控優(yōu)化

    條碼比對(duì)錯(cuò)呆掃描系統(tǒng)提升生產(chǎn)效率,避免重碼錯(cuò)碼漏碼等問題

    高速掃描器(如LV3000U、FM430EX),結(jié)合光學(xué)識(shí)別與圖像處理技術(shù),毫秒級(jí)響應(yīng)生產(chǎn)線條碼信息。通過預(yù)設(shè)規(guī)則與數(shù)據(jù)庫實(shí)時(shí)校驗(yàn),發(fā)現(xiàn)重復(fù)、錯(cuò)誤或缺失條碼時(shí)立即觸
    的頭像 發(fā)表于 03-03 16:29 ?1293次閱讀
    條碼比對(duì)<b class='flag-5'>防</b>錯(cuò)<b class='flag-5'>防</b>呆掃描系統(tǒng)提升生產(chǎn)效率,避免重碼錯(cuò)碼漏碼等問題

    電子產(chǎn)品三處理技術(shù)全面剖析

    在電子產(chǎn)品設(shè)計(jì)與應(yīng)用中,三處理(防潮、鹽霧、防霉)是確保設(shè)備長期穩(wěn)定運(yùn)行、提升可靠性和耐用性的關(guān)鍵環(huán)節(jié)。 隨著電子設(shè)備應(yīng)用環(huán)境的多樣化,尤其是向極端環(huán)境拓展,三處理的必要性愈發(fā)顯著。 本文通過
    的頭像 發(fā)表于 02-20 09:28 ?1355次閱讀
    電子產(chǎn)品三<b class='flag-5'>防</b>處理技術(shù)全面<b class='flag-5'>剖析</b>