日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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閱碼場(chǎng) ? 來源: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;

}

}

主要矛盾

無(wú)論是延時(shí)還是定時(shí),我們都是在進(jìn)行時(shí)間的比較。先根據(jù)延時(shí)或定時(shí)時(shí)長(zhǎng)計(jì)算出到期時(shí)間timeout,之后不停的判斷當(dāng)時(shí)時(shí)間有沒有超過這個(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是否超過了timeout。比如:

起始cur_time為10,延時(shí)目標(biāo)為5,則timeout為10 + 5 = 15。判斷依據(jù)非常簡(jiǎn)單,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不再適用。

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

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

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

假設(shè)這個(gè)跑道長(zhǎng)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跑在前面。這是為什么呢?

大家在判斷誰(shuí)在前面時(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ì)于一圈的長(zhǎng)度而言是一個(gè)較小的距離。假設(shè)李四(B)快,則B沿順時(shí)針方向需要跑大半圈才能遇到張三(A)。如果李四確實(shí)比張三快的話,那么快了不只一點(diǎn)點(diǎn),而是超前大半圈。先前說過,張三和李四的水平相差不大,短短的三圈不足以讓他們拉快過長(zhǎng)的距離。所以我們更愿意相信第一種假設(shè)成立,即張三(A)比李四(B)跑的快。

人腦做上述判斷的時(shí)候,并沒有給跑道建立坐標(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ì)立的。

回歸代碼

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

還是假設(shè)這個(gè)跑道長(zhǎng)256米,從起點(diǎn)開始沿逆時(shí)針方向(即跑步的方向)標(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的前面。

溢出情況

再來看看復(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ū)分簡(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和沒加是一樣的。

驗(yàn)證

還是上一個(gè)例子的場(chǎng)景,我們來假設(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í)間判斷,有沒有豁然開朗呢?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í)間久了必然溢出。

筆者之前也為溢出問題感到頭疼,而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)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 延時(shí)
    +關(guān)注

    關(guān)注

    0

    文章

    110

    瀏覽量

    26427

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    安科瑞逆流電表:毫秒級(jí)響應(yīng)+WiFi通信,破解光伏逆流與布線

    巡檢因 “逆流” 問題開具罰單、布線施工破壞裝修還耗時(shí)費(fèi)力、后期運(yùn)維要反復(fù)調(diào)試…… 這些痛點(diǎn),讓原本省心的陽(yáng)臺(tái)光伏變成了 “麻煩事”。19821800313 安科瑞逆流免布線電表以 “毫秒級(jí)
    的頭像 發(fā)表于 05-06 17:57 ?169次閱讀
    安科瑞<b class='flag-5'>防</b>逆流電表:<b class='flag-5'>毫秒</b><b class='flag-5'>級(jí)</b>響應(yīng)+WiFi通信,破解光伏逆流與布線

    毫秒級(jí)精準(zhǔn)+AI全自動(dòng)!智能孤島負(fù)載

    在光伏逆變器與儲(chǔ)能變流器(PCS)的并網(wǎng)測(cè)試中,孤島保護(hù)測(cè)試是核心安全指標(biāo)。傳統(tǒng)固定RLC負(fù)載 調(diào)節(jié)繁瑣、精度低 ,難以滿足嚴(yán)苛的國(guó)際認(rèn)證要求。 智能RLC孤島負(fù)載。搭載ALRC3.0智能平臺(tái)
    的頭像 發(fā)表于 04-27 10:48 ?172次閱讀
    <b class='flag-5'>毫秒</b><b class='flag-5'>級(jí)</b>精準(zhǔn)+AI全自動(dòng)!智能<b class='flag-5'>防</b>孤島負(fù)載

    人形機(jī)器人開發(fā)觀察:如何搞定全身40+關(guān)節(jié)的亞毫秒級(jí)同步控制?

    人形機(jī)器人開發(fā)觀察:如何搞定全身40+關(guān)節(jié)的亞毫秒級(jí)同步控制?
    的頭像 發(fā)表于 02-04 15:33 ?1326次閱讀
    人形機(jī)器人開發(fā)觀察:如何搞定全身40+關(guān)節(jié)的亞<b class='flag-5'>毫秒</b><b class='flag-5'>級(jí)</b>同步控制?

    AI服務(wù)器機(jī)柜BBU的毫秒級(jí)瞬態(tài)功率缺口:為什么“混合型超級(jí)電容(LIC)+BBU”更合適?

    AI服務(wù)器機(jī)柜在訓(xùn)練/推理負(fù)載快速切換時(shí),會(huì)出現(xiàn)毫秒級(jí)(典型1–50ms)的功率突變與直流母線(DCBus)掉壓風(fēng)險(xiǎn)。NVIDIA在介紹GB300NVL72電源架設(shè)計(jì)時(shí)提到,其電源架內(nèi)集成能量存儲(chǔ)
    的頭像 發(fā)表于 01-15 14:00 ?686次閱讀
    AI服務(wù)器機(jī)柜BBU的<b class='flag-5'>毫秒</b><b class='flag-5'>級(jí)</b>瞬態(tài)功率缺口:為什么“混合型超級(jí)電容(LIC)+BBU”更合適?

    疆鴻智能ETHERCAT轉(zhuǎn)Modbus TCP/IP:高端PLC與通用設(shè)備毫秒級(jí)對(duì)話

    疆鴻智能ETHERCAT轉(zhuǎn)Modbus TCP/IP:高端PLC與通用設(shè)備毫秒級(jí)對(duì)話 在智能工廠的建設(shè)浪潮中,如何高效整合不同通信協(xié)議的設(shè)備,實(shí)現(xiàn)數(shù)據(jù)無(wú)縫流通與精準(zhǔn)控制,是提升生產(chǎn)效率的關(guān)鍵挑戰(zhàn)。某
    的頭像 發(fā)表于 01-06 15:12 ?323次閱讀
    疆鴻智能ETHERCAT轉(zhuǎn)Modbus TCP/IP:高端PLC與通用設(shè)備<b class='flag-5'>毫秒</b><b class='flag-5'>級(jí)</b>對(duì)話

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

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

    使用系統(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í)同步無(wú)卡頓

    對(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 ?828次閱讀
    數(shù)據(jù)采集 “延遲高”?5G + 實(shí)時(shí)采集,<b class='flag-5'>毫秒</b><b class='flag-5'>級(jí)</b>同步無(wú)卡頓

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

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

    如何利用蜂鳥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)用場(chǎng)景,告訴你三
    的頭像 發(fā)表于 09-28 10:58 ?964次閱讀
    三<b class='flag-5'>防</b>手持機(jī)是什么?工業(yè)<b class='flag-5'>級(jí)</b>三<b class='flag-5'>防</b>手持機(jī)抗摔能力怎么樣?

    探頭的延時(shí)介紹

    探頭的延時(shí)是指信號(hào)從被測(cè)點(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 ?1019次閱讀
    探頭的<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)從被測(cè)點(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 ?929次閱讀
    認(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í)代,為我國(guó)氣象數(shù)值預(yù)測(cè)現(xiàn)代化建設(shè)注入澎湃動(dòng)力。
    的頭像 發(fā)表于 07-31 17:17 ?1304次閱讀
    上蔡县| 高要市| 鄂托克前旗| 巴里| 常德市| 兴隆县| 贡觉县| 广安市| 英吉沙县| 巧家县| 崇文区| 桃江县| 海原县| 建始县| 大厂| 南汇区| 岳池县| 石狮市| 乌苏市| 衡阳县| 巩义市| 蒲城县| 阜南县| 济南市| 祁东县| 兴仁县| 嘉鱼县| 土默特右旗| 建昌县| 宜良县| 鄄城县| 长汀县| 元谋县| 临猗县| 鞍山市| 泗阳县| 曲水县| 泾源县| 南涧| 云和县| 台州市|