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

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

剖析毫秒級延時防溢出的原理

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

掃碼添加小助手

加入工程師交流群

前文指出了基于系統(tǒng)滴答計數(shù)實現(xià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返回當前系統(tǒng)時間(系統(tǒng)滴答計數(shù)),即系統(tǒng)從啟動到現(xiàn)在經過了多少毫秒。comm_delay先獲取當前時間,加上延時時間以計算出到期時間timeout,之后循環(huán)等待當前時間超過timeout以完成延時。

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

前文在結尾給出了解決方案:

void comm_delay(uint32_t ms)

{

uint32_t timeout = comm_get_ms() + ms;

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

}

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

了解其中的原理是有必要的。因為延時的條件如上,而如果想實現(xiàn)定時的話,條件就會倒過來。知其所以然,方能靈活運用。

定時任務:

uint32_t timeout = 0;

while (1)

{

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

{

printf(“hello

”);

timeout = comm_get_ms() + 1000;

}

}

主要矛盾

無論是延時還是定時,我們都是在進行時間的比較。先根據延時或定時時長計算出到期時間timeout,之后不停的判斷當時時間有沒有超過這個timeout。

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

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

起始cur_time為10,延時目標為5,則timeout為10 + 5 = 15。判斷依據非常簡單,cur_time 《 15時視為未超過timeout,或者說cur_time 《 timeout視為未超過timeout。

起始cur_time為250,延時目標為10,則timeout為250 + 10 = 260 = 4。此時cur_time 《 timeout不再適用。

張三和李四誰跑的快

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

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

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

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

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

大家在判斷誰在前面時,其實根本沒去管那根藍色的線(起點或終點)。因為跑道首尾相連,而且張三和李四要跑好幾圈,必將多次經過起終點,所以起終點沒有任何判斷價值。

人腦是怎么判斷的

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

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

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

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

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

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

其實根本不需要驗證兩種假設,只需要驗證一個就行了,因為它們是對立的。

回歸代碼

人腦通過視覺來估測張三與李四的距離,但是計算機不行,它需要一個明確的方法,還是需要坐標系的。

還是假設這個跑道長256米,從起點開始沿逆時針方向(即跑步的方向)標注坐標。

簡單情況

先看簡單的情況,即A和B在起點的同側。對應到坐標系上為:

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

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

L = Xa - Xb = 40 - 20 = 20

這個距離遠小于256,所以A在B的前面。

溢出情況

再來看看復雜的溢出情況,即A和B在起點兩側。

對應在坐標系上時,為方便繪制,將A、B與起終點的距離拉遠一點。Xa=30,Xb=220。A返回到B的距離為:

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

66也是遠小于256的,所以A還是在B的前面。

歸一

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

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

L = L1 + L2

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

= Xa - Xb + 256 = Xa - Xb

這么一調整就和簡單情況一樣了吧。為什么把加256給去掉了?因為我們討論Xa和Xb是uint8_t,加256和沒加是一樣的。

驗證

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

L = Xb - Xa = 220 - 30 = 190

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

我們在判斷距離時,用了兩種標準:

L遠小于256

L比較接近256

對于計算機而言,這是無法實現(xiàn)的,它需要一個明確的標準。那是什么呢?就一刀切吧,以256 / 2為閾值。

L 《 256 / 2:假設成立

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

再看時間判斷

void comm_delay(uint32_t ms)

{

uint32_t timeout = comm_get_ms() + ms;

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

}

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

后記

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

筆者之前也為溢出問題感到頭疼,而RT-Thread號稱不懼溢出,于是筆者懷著好奇的心態(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

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

    關注

    0

    文章

    110

    瀏覽量

    26118

原文標題:從rtthread timer模塊中找到裸機定時問題的解決方案

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    陽臺儲能逆流電表,毫秒響應保障電網用電

    陽臺光伏是分布式光伏的一種靈活應用形式,指在家庭陽臺、露臺等空間安裝太陽能發(fā)電設備(包括光伏板、小型或微型逆變器、逆流裝置及支架等),實現(xiàn)就地發(fā)電、自發(fā)自用,降低碳排放。系統(tǒng)功率通常在幾百瓦至數(shù)千
    的頭像 發(fā)表于 09-29 16:56 ?387次閱讀
    陽臺儲能<b class='flag-5'>防</b>逆流電表,<b class='flag-5'>毫秒</b><b class='flag-5'>級</b>響應保障電網用電

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

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

    探頭的延時介紹

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

    毫秒響應!配網行波故障預警與定位裝置煥新效率

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

    認識探頭的延時

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

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

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

    智能安邊緣計算的技術解析

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

    陽臺光伏風險歸零:ADL200N-CT/D16-WF 毫秒守護!逆流+相序自診

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

    陽臺光伏逆流電表:智能相序檢測、毫秒響應,安裝更便捷!

    針對陽臺光伏場景中逆流電表安裝成本高、接線調試復雜、空間受限等痛點,安科瑞新一代電表以小體積、導軌安裝、即插即用接線以及人性化軟件設計,顯著降低部署門檻。
    的頭像 發(fā)表于 06-13 09:58 ?134次閱讀
    陽臺光伏<b class='flag-5'>防</b>逆流電表:智能相序檢測、<b class='flag-5'>毫秒</b><b class='flag-5'>級</b>響應,安裝更便捷!

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

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

    深控技術工業(yè)網關如何讓MES數(shù)據“精準到毫秒”,驅動智能決策?

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

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

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

    電子產品三處理技術全面剖析

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

    用TLV320AIC3101配DM368的開發(fā)板做交互通話,音頻延時能調到最低多少毫秒?

    我用DM368的開發(fā)板做交互通話,上面有音頻編解碼芯片TLV320AIC3101,接一個耳麥,在一個開發(fā)板上做自發(fā)自收,就是我說一句再從聽筒聽到,現(xiàn)在能把聲音輸入到輸出的延時調到1s了,示波器測的,但還是達不到實時對話的要求,請問在這個開發(fā)板上延時能調到最低多少
    發(fā)表于 10-28 07:52

    請問PurePath Studio有定時器控件嗎?用AIC3254如何實現(xiàn)毫秒的定時?

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