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

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

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

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

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

Linux閱碼場(chǎng) ? 來(lái)源: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í)的問(wèn)題。

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)過(guò)了多少毫秒。comm_delay先獲取當(dāng)前時(shí)間,加上延時(shí)時(shí)間以計(jì)算出到期時(shí)間timeout,之后循環(huán)等待當(dāng)前時(shí)間超過(guò)timeout以完成延時(shí)。

系統(tǒng)時(shí)間使用uint32_t變量來(lái)記錄,經(jīng)過(guò)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ì)倒過(guò)來(lái)。知其所以然,方能靈活運(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;

}

}

主要矛盾

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

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

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

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

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

張三和李四誰(shuí)跑的快

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

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

假設(shè)這個(gè)跑道長(zhǎng)256米,從起點(diǎn)開(kāi)始沿逆時(shí)針?lè)较颍磁懿降姆较颍?biāo)注坐標(biāo)。那么A和B在坐標(biāo)軸的位置大致如下:

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

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

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

人腦是怎么判斷的

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

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

假設(shè)張三(A)快,那么A沿順時(shí)針跑回B(逆時(shí)針是前進(jìn)方向,往回跑就是順時(shí)針)的距離即為A超前B的距離,如下圖的紅色箭頭,相對(duì)于一圈的長(zhǎng)度而言是一個(gè)較小的距離。假設(shè)李四(B)快,則B沿順時(shí)針?lè)较蛐枰艽蟀肴Σ拍苡龅綇埲ˋ)。如果李四確實(shí)比張三快的話,那么快了不只一點(diǎn)點(diǎn),而是超前大半圈。先前說(shuō)過(guò),張三和李四的水平相差不大,短短的三圈不足以讓他們拉快過(guò)長(zhǎng)的距離。所以我們更愿意相信第一種假設(shè)成立,即張三(A)比李四(B)跑的快。

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

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

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

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

回歸代碼

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

還是假設(shè)這個(gè)跑道長(zhǎng)256米,從起點(diǎn)開(kāi)始沿逆時(shí)針?lè)较颍磁懿降姆较颍?biāo)注坐標(biāo)。

簡(jiǎn)單情況

先看簡(jiǎn)單的情況,即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的前面。

溢出情況

再來(lái)看看復(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的前面。

歸一

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

讓我們?cè)倏匆谎垡绯銮闆r的公式:

L = L1 + L2

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

= Xa - Xb + 256 = Xa - Xb

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

驗(yàn)證

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

L = Xb - Xa = 220 - 30 = 190

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

我們?cè)谂袛嗑嚯x時(shí),用了兩種標(biāo)準(zhǔn):

L遠(yuǎn)小于256

L比較接近256

對(duì)于計(jì)算機(jī)而言,這是無(wú)法實(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í)間判斷,有沒(méi)有豁然開(kāi)朗呢?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位無(wú)符號(hào)整型uint32_t,時(shí)間久了必然溢出。

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

/*

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

    關(guān)注

    0

    文章

    108

    瀏覽量

    25910

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    智能安邊緣計(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 ?110次閱讀

    陽(yáng)臺(tái)光伏風(fēng)險(xiǎn)歸零:ADL200N-CT/D16-WF 毫秒級(jí)守護(hù)!逆流+相序自診

    安科瑞 王晶淼 Acel-wjm 當(dāng)?shù)聡?guó)陽(yáng)臺(tái)光伏用戶年均省下1800元、法國(guó)推行“零審批”7天極速安裝時(shí),中國(guó)3億城鎮(zhèn)住宅的萬(wàn)億級(jí)市場(chǎng)卻因兩大“攔路虎”步履維艱:(1)政策空白:對(duì)比歐洲的固定電價(jià)
    的頭像 發(fā)表于 06-13 16:41 ?271次閱讀
    陽(yáng)臺(tái)光伏風(fēng)險(xiǎn)歸零:ADL200N-CT/D16-WF <b class='flag-5'>毫秒</b><b class='flag-5'>級(jí)</b>守護(hù)!<b class='flag-5'>防</b>逆流+相序自診

    智能電網(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)測(cè)等場(chǎng)景中,傳統(tǒng)通信方案面臨嚴(yán)峻挑戰(zhàn): ? 時(shí)延瓶頸:保護(hù)控制類業(yè)務(wù)要求端到端時(shí)延 可靠性挑戰(zhàn)
    的頭像 發(fā)表于 04-25 09:40 ?210次閱讀
    智能電網(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)化

    深控技術(shù)工業(yè)網(wǎng)關(guān)如何讓MES數(shù)據(jù)“精準(zhǔn)到毫秒”,驅(qū)動(dòng)智能決策?

    深控技術(shù)解決方案:高精度采集+智能校驗(yàn) 技術(shù)原理:從“原始數(shù)據(jù)”到“可信信息” 毫秒級(jí)實(shí)時(shí)采集: 支持1ms級(jí)高速采樣(如沖壓機(jī)壓力曲線、激光焊機(jī)光強(qiáng)波動(dòng)),覆蓋99%工業(yè)場(chǎng)景。 數(shù)據(jù)流實(shí)時(shí)推送至MES(延遲
    的頭像 發(fā)表于 03-17 15:59 ?336次閱讀
    深控技術(shù)工業(yè)網(wǎng)關(guān)如何讓MES數(shù)據(jù)“精準(zhǔn)到<b class='flag-5'>毫秒</b>”,驅(qū)動(dòng)智能決策?

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

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

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

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

    用TLV320AIC3101配DM368的開(kāi)發(fā)板做交互通話,音頻延時(shí)能調(diào)到最低多少毫秒

    我用DM368的開(kāi)發(fā)板做交互通話,上面有音頻編解碼芯片TLV320AIC3101,接一個(gè)耳麥,在一個(gè)開(kāi)發(fā)板上做自發(fā)自收,就是我說(shuō)一句再?gòu)穆?tīng)筒聽(tīng)到,現(xiàn)在能把聲音輸入到輸出的延時(shí)調(diào)到1s了,示波器測(cè)的,但還是達(dá)不到實(shí)時(shí)對(duì)話的要求,請(qǐng)問(wèn)在這個(gè)開(kāi)發(fā)板上延時(shí)能調(diào)到最低多少
    發(fā)表于 10-28 07:52

    請(qǐng)問(wèn)PurePath Studio有定時(shí)器控件嗎?用AIC3254如何實(shí)現(xiàn)毫秒級(jí)的定時(shí)?

    PurePath Studio有定時(shí)器控件嗎?用AIC3254如何實(shí)現(xiàn)毫秒級(jí)的定時(shí)?
    發(fā)表于 10-25 07:26

    AIC3254可以把mic采集到的音頻相位調(diào)整180度再延時(shí)1毫秒輸出給揚(yáng)聲器?

    把mic采集到的音頻相位調(diào)整180度再延時(shí)1毫秒輸出給揚(yáng)聲器,用AIC3254可以實(shí)現(xiàn)嗎?
    發(fā)表于 10-11 08:14

    Simplelink CC32xx SDK整數(shù)溢出問(wèn)題

    電子發(fā)燒友網(wǎng)站提供《Simplelink CC32xx SDK整數(shù)溢出問(wèn)題.pdf》資料免費(fèi)下載
    發(fā)表于 09-03 10:28 ?0次下載
    Simplelink CC32xx SDK整數(shù)<b class='flag-5'>溢出</b>問(wèn)題

    UCD3138器件上的棧溢出檢測(cè)

    電子發(fā)燒友網(wǎng)站提供《UCD3138器件上的棧溢出檢測(cè).pdf》資料免費(fèi)下載
    發(fā)表于 09-02 09:58 ?0次下載
    UCD3138器件上的棧<b class='flag-5'>溢出</b>檢測(cè)

    延時(shí)開(kāi)關(guān)接線技巧與注意事項(xiàng)有哪些

    延時(shí)開(kāi)關(guān)的接線技巧與注意事項(xiàng)是確保延時(shí)開(kāi)關(guān)正確安裝和穩(wěn)定運(yùn)行的關(guān)鍵。 一、延時(shí)開(kāi)關(guān)接線技巧 1. 理解延時(shí)開(kāi)關(guān)的基本結(jié)構(gòu) 延時(shí)開(kāi)關(guān)通常包含多
    的頭像 發(fā)表于 08-19 15:54 ?2533次閱讀

    延時(shí)開(kāi)關(guān)怎么調(diào)時(shí)間長(zhǎng)短

    延時(shí)開(kāi)關(guān)是一種常見(jiàn)的電子控制設(shè)備,廣泛應(yīng)用于各種場(chǎng)合,如照明、空調(diào)、風(fēng)扇等。它可以根據(jù)用戶的需求,設(shè)定一定的延時(shí)時(shí)間,實(shí)現(xiàn)自動(dòng)控制。 一、延時(shí)開(kāi)關(guān)的工作原理 延時(shí)開(kāi)關(guān)的基本組成
    的頭像 發(fā)表于 08-19 15:46 ?5017次閱讀

    延時(shí)開(kāi)關(guān)上l和a是什么意思

    延時(shí)開(kāi)關(guān)是一種常見(jiàn)的電子控制元件,廣泛應(yīng)用于各種電子設(shè)備和系統(tǒng)中。它可以實(shí)現(xiàn)對(duì)電路的自動(dòng)控制,使電路在一定的延時(shí)后自動(dòng)接通或斷開(kāi)。在延時(shí)開(kāi)關(guān)的標(biāo)識(shí)中,L和A通常代表不同的意義。 一、延時(shí)
    的頭像 發(fā)表于 08-19 15:45 ?8128次閱讀

    IG網(wǎng)關(guān)毫秒采集配置步驟

    (注:目前設(shè)備支持的毫秒采集協(xié)議modbus、opc ua。最低毫秒采集周期100ms) 準(zhǔn)備工作 映翰通網(wǎng)關(guān);PC;網(wǎng)線;谷歌瀏覽器;modbus、opc ua模擬軟件或者PLC等真實(shí)設(shè)備 操作
    發(fā)表于 07-24 07:45