在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

RT-Thread驅(qū)動篇:hwtimer重載值算法

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來源:RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 作者:RTThread物聯(lián)網(wǎng)操作 ? 2022-04-01 10:06 ? 次閱讀

硬件定時器

區(qū)別于 rt-thread 內(nèi)核實現(xiàn)的兩種定時器,這種定時器依賴芯片內(nèi)置的定時器外設(shè),依靠穩(wěn)定高速的晶振實現(xiàn)精確定時,可以實現(xiàn) rt_timer 無法達到的定時精度。硬件定時器最重要的兩個參數(shù)是定時器時鐘和定時器重載值。

定時器時鐘越高,定時器精度越高;重載值越大,實現(xiàn)的定時時間越長。

在定時器時鐘一定的前提下,重載值就決定了定時器定時時間的準確性。

兩種計算重載值算法

hwtimer.c 文件timeout_calc函數(shù)實現(xiàn)

 1floatoverflow;
 2floattimeout;
 3rt_uint32_tcounter;
 4inti,index=0;
 5floattv_sec;
 6floatdevi_min=1;
 7floatdevi;
 8
 9/*changedtosecond*/
10overflow=timer->maxcnt/(float)timer->freq;
11tv_sec=tv->sec+tv->usec/(float)1000000;
12
13if(tv_sec1/(float)timer->freq))
14{
15/*littletimeout*/
16i=0;
17timeout=1/(float)timer->freq;
18}
19else
20{
21for(i=1;i>0;i++)
22{
23timeout=tv_sec/i;
24
25if(timeout<=?overflow)
26{
27counter=timeout*timer->freq;
28devi=tv_sec-(counter/(float)timer->freq)*i;
29/*Minimumcalculationerror*/
30if(devi>devi_min)
31{
32i=index;
33timeout=tv_sec/i;
34break;
35}
36elseif(devi==0)
37{
38break;
39}
40elseif(devi41{
42devi_min=devi;
43index=i;
44}
45}
46}
47}
48
49timer->cycles=i;
50timer->reload=i;
51timer->period_sec=timeout;
52counter=timeout*timer->freq;
53
54returncounter;

第二種實現(xiàn),

 1rt_uint32_tcounter,reload;
 2rt_uint32_ttimer_cnt;
 3inti,index=0,n0,n1;
 4floattv_sec;
 5rt_uint32_tdev,dev_min;
 6
 7/*changedtosecond*/
 8tv_sec=tv->sec+tv->usec/(float)1000000.0;
 9timer_cnt=tv_sec*timer->freq;
10
11if(timer_cnt==0){
12timer_cnt=1;
13}
14if(timer_cntmaxcnt){
15timer->cycles=timer->reload=1;
16timer->period_sec=tv_sec;
17counter=timer_cnt;
18returncounter;
19}
20if(timer_cnt%timer->maxcnt==0){
21timer->cycles=timer->reload=timer_cnt/timer->maxcnt;
22timer->period_sec=tv_sec;
23counter=timer_cnt;
24returncounter;
25}
26n0=timer_cnt/timer->maxcnt+1;
27n1=timer_cnt/2;
28dev_min=n0;
29for(i=n0;i30reload=(rt_uint32_t)(timer_cnt/i);
31dev=timer_cnt-reload*i;
32if(dev==0){
33//end
34index=i;
35break;
36}elseif(dev37dev_min=dev;
38index=i;
39}
40}
41timer->cycles=timer->reload=index;
42timer->period_sec=index/timer->freq;
43counter=timer_cnt/index;
44returncounter;

測試環(huán)境

定時器頻率設(shè)定 1M。定時器最大重載值 65535。

系統(tǒng):win10

IDE:Qt Creator

最大定時范圍

兩種算法,最主要的差別在于前一種用 float 運算,因為 float 可以表達的值范圍更大,定時時間可以更長。

而在 1M 定時器時鐘前提下,用 32 位無符號整型 timer_cnt,最大可以處理時間僅有 4294.967295s。

精度 PK

5bb68cf0-b15d-11ec-aa7f-dac502259ad0.jpg

這里不支持嵌入 html 表格,只好貼圖了

分別選各個量級的時間,用兩種算法計算,第二種算法可以把誤差降低到0,但是也暴露出一些問題,在某些時間,例如 3.230970s、12.230970s、14.230970s... 誤差是很小,定時器重載值也很小,這是我們不愿意看到的。

第一種算法,在計算大于 1000 的數(shù)時,誤差也隨之增大。比如 1000s 誤差為 3.236ms;4293.0s 誤差為 64.080ms。

運算速度

測試方法:抽取某幾個時間值,循環(huán) 1M 次運算,計量 1M 次運算總耗時時間。

5bcaf226-b15d-11ec-aa7f-dac502259ad0.png

從抽取的幾個值測試結(jié)果看,第一種算法耗時比較穩(wěn)定,第二種算法對不同值的運算時間差異很大。特別的,3.317s 這個值用第二種算法,1M 次運算總耗時時間可能達到 3000s。

從上一小節(jié)的精度比對可以看出,第二種算法對精度要求太高了。下面降低第二種算法的精度,達到和第一種一樣的精度再重復(fù)一次。修改代碼如下

 1if(dev==0){
 2//end
 3index=i;
 4break;
 5}elseif(dev>dev_min){
 6break;
 7}elseif(dev 8dev_min=dev;
 9index=i;
10}

再次測試結(jié)果:

5bdeafc8-b15d-11ec-aa7f-dac502259ad0.png

我們可以看出來,在相同精度條件下,第二種算法的運算速度比第一種快很多,而且耗時反而變得更集中。

其實,對結(jié)束條件再次修正,將dev == 0的嚴苛誤差條件換成dev <= 1也不會出現(xiàn)上面 3000+s 慢速。

 1if(dev<=?1){
 2//end
 3index=i;
 4break;
 5}elseif(dev>dev_min){
 6break;
 7}elseif(dev 8dev_min=dev;
 9index=i;
10}

超過 4295s 的超長定時

需要修改rt_uint64_t timer_cnt的定義為 64 位無符號整型rt_uint64_t timer_cnt

又因為定時時間很長很長,對誤差要求可以降低一些,對第二種算法做的第二處修改:

1if(dev<=?500){
2//end
3index=i;
4break;
5}elseif(dev6dev_min=dev;
7index=i;
8}

5bee09be-b15d-11ec-aa7f-dac502259ad0.png

超長時間,第二種算法的表現(xiàn)也很優(yōu)秀。第三組數(shù)據(jù)第一種方法竟然出錯了,沒算出結(jié)果。

下面是 10k 次(沒有進行 1W 次是因為有些時間太長了)運算時間統(tǒng)計

5c062dd2-b15d-11ec-aa7f-dac502259ad0.png

返璞歸真

以上是對兩種算法從不同角度進行的比對測驗。看似用 float 可以計算更大的定時數(shù),但是,測試結(jié)果并不那么理想。使用 64位整型數(shù)計算,可能得到比用 float 更精確的結(jié)果。

使用 32 位無符號整型數(shù)運算雖然最大定時時間只有 4294.9s 。但是我們也看到了,第一種方法有可能出現(xiàn)計算誤差的,當誤差超過 1ms 我們用 rt_thread_mdelay 或者 rt-thread 的軟/硬定時器,可能結(jié)果比硬件定時器更精確了,反而失去了精確定時器的意義。在這個前提下,使用 32 位無符號整型數(shù)已經(jīng)足夠了。

算法及測試源碼見:

https://gitee.com/thewon/rt_thread_repo/tree/master/user

審核編輯 :李倩


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

    關(guān)注

    23

    文章

    4623

    瀏覽量

    93103
  • 定時器
    +關(guān)注

    關(guān)注

    23

    文章

    3254

    瀏覽量

    115069
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1300

    瀏覽量

    40264

原文標題:RT-Thread 驅(qū)動篇 之 hwtimer 重載值算法

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    【S32K146 RT-Thread】之 使用SFUD組件驅(qū)動spi flash

    【S32K146 RT-Thread】之 使用SFUD組件驅(qū)動spi flash
    的頭像 發(fā)表于 11-21 01:05 ?357次閱讀
    【S32K146 <b class='flag-5'>RT-Thread</b>】之 使用SFUD組件<b class='flag-5'>驅(qū)動</b>spi flash

    RT-Thread上CAN實踐

    開箱測試RT-Thread官方已完成了對英飛凌XMC7200EVK的移植,通過shell可以看到做好了uart3的console。本文將介紹如何進行RT-ThreadCan移植。接下來我們要完成CAN_FD的驅(qū)動移植,并正常啟動
    的頭像 發(fā)表于 11-13 01:03 ?1294次閱讀
    <b class='flag-5'>RT-Thread</b>上CAN實踐

    【S32K146 RT-thread】之 SPI驅(qū)動適配

    概述RT-Thread對SPI總線的驅(qū)動,抽象出了spibus的設(shè)備驅(qū)動,我們基于S32K146的硬件學(xué)習(xí)spibus設(shè)備驅(qū)動
    的頭像 發(fā)表于 11-01 08:11 ?468次閱讀
    【S32K146 <b class='flag-5'>RT-thread</b>】之 SPI<b class='flag-5'>驅(qū)動</b>適配

    新書發(fā)布——《RT-Thread嵌入式實時操作系統(tǒng)內(nèi)核、驅(qū)動和應(yīng)用開發(fā)技術(shù)》

    我們非常高興地宣布,由鄭苗秀、沈鴻飛和廖建尚編著的《RT-Thread嵌入式實時操作系統(tǒng)內(nèi)核、驅(qū)動和應(yīng)用開發(fā)技術(shù)》一書正式發(fā)布。本書的編寫團隊由多位在嵌入式和實時操作系統(tǒng)領(lǐng)域有著豐富經(jīng)驗的專家組
    的頭像 發(fā)表于 09-03 08:06 ?660次閱讀
    新書發(fā)布——《<b class='flag-5'>RT-Thread</b>嵌入式實時操作系統(tǒng)內(nèi)核、<b class='flag-5'>驅(qū)動</b>和應(yīng)用開發(fā)技術(shù)》

    2024 RT-Thread全球巡回 線下培訓(xùn)火熱來襲!

    親愛的RT-Thread社區(qū)成員們:我們非常高興地宣布,2024年RT-Thread全球開發(fā)者線下培訓(xùn)即將拉開帷幕!24年全球巡回培訓(xùn)將覆蓋超10座城市及國家,為開發(fā)者提供一個深入學(xué)習(xí)RT-Thread嵌入式開發(fā)的絕佳機會。
    的頭像 發(fā)表于 08-07 08:35 ?1380次閱讀
    2024 <b class='flag-5'>RT-Thread</b>全球巡回 線下培訓(xùn)火熱來襲!

    【好書推薦】RT-Thread設(shè)備驅(qū)動開發(fā)指南

    近年來國內(nèi)芯片產(chǎn)業(yè)和物聯(lián)網(wǎng)產(chǎn)業(yè)的快速崛起,行業(yè)發(fā)展迫切需要更多人才,尤其需要掌握嵌入式操作系統(tǒng)等底層技術(shù)的人才。隨著RT-Thread被更廣泛地應(yīng)用于行業(yè)中,開發(fā)者對嵌入式驅(qū)動開發(fā)的需求越來越
    的頭像 發(fā)表于 08-01 08:35 ?676次閱讀
    【好書推薦】<b class='flag-5'>RT-Thread</b>設(shè)備<b class='flag-5'>驅(qū)動</b>開發(fā)指南

    RT-Thread 新里程碑達成——GitHub Star 破萬!

    RT-Thread實時操作系統(tǒng)開源項目在GitHub上的star數(shù)量突破一萬!截止發(fā)文,RT-Thread作為實時操作系統(tǒng)在業(yè)界Star數(shù)量排名第一!倉庫地址:https://github.com
    的頭像 發(fā)表于 07-04 08:35 ?500次閱讀
    <b class='flag-5'>RT-Thread</b> 新里程碑達成——GitHub Star 破萬!

    6月6日杭州站RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    6月6日下午我們將在杭州舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現(xiàn)同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發(fā)表于 05-28 08:35 ?463次閱讀
    6月6日杭州站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    4月25日北京站RT-Thread線下workshop,探索RT-Thread混合部署新模式

    4月25日,下午我們將在北京舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現(xiàn)同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發(fā)表于 04-16 08:35 ?437次閱讀
    4月25日北京站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

    4月10日深圳場RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    4月10日我們將在深圳福田舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現(xiàn)同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深嵌入式軟件工程師農(nóng)曉明老師為您講
    的頭像 發(fā)表于 03-27 11:36 ?853次閱讀
    4月10日深圳場<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    4月10日深圳場RT-Thread線下workshop,探索RT-Thread混合部署新模式!

    4月10日我們將在深圳福田舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現(xiàn)同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發(fā)表于 03-27 08:34 ?546次閱讀
    4月10日深圳場<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    恩智浦半導(dǎo)體正式加入RT-Thread全球合作伙伴計劃!

    前不久,恩智浦半導(dǎo)體正式加入RT-Thread全球合作伙伴計劃,成為RT-Thread高級會員合作伙伴。同時,RT-Thread現(xiàn)已成為恩智浦注冊合作伙伴(RT-Thread| 簡介合
    的頭像 發(fā)表于 03-14 10:40 ?640次閱讀
    恩智浦半導(dǎo)體正式加入<b class='flag-5'>RT-Thread</b>全球合作伙伴計劃!

    RT-Thread驅(qū)動開發(fā)指南進階-動手驅(qū)動先楫未適配的外設(shè)LCD

    經(jīng)過上一的《《RT-Thread設(shè)備驅(qū)動開發(fā)指南》基礎(chǔ)--以先楫bsp的hwtimer設(shè)備為例》闡述,可以大致了解到
    的頭像 發(fā)表于 02-25 11:04 ?2678次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>驅(qū)動</b>開發(fā)指南進階<b class='flag-5'>篇</b>-動手<b class='flag-5'>驅(qū)動</b>先楫未適配的外設(shè)LCD

    RT-Thread設(shè)備驅(qū)動開發(fā)指南》基礎(chǔ)--以先楫bsp的hwtimer設(shè)備為例

    一、概述(一)RT-Thread設(shè)備驅(qū)動RT-Thread設(shè)備驅(qū)動開發(fā)指南》書籍是RT-thread官方出品撰寫,系統(tǒng)講解
    的頭像 發(fā)表于 02-24 08:16 ?1743次閱讀
    《<b class='flag-5'>RT-Thread</b>設(shè)備<b class='flag-5'>驅(qū)動</b>開發(fā)指南》基礎(chǔ)<b class='flag-5'>篇</b>--以先楫bsp的<b class='flag-5'>hwtimer</b>設(shè)備為例

    RT-Thread設(shè)備驅(qū)動開發(fā)指南基礎(chǔ)—以先楫bsp的hwtimer設(shè)備為例

    RT-Thread設(shè)備驅(qū)動開發(fā)指南》書籍是RT-thread官方出品撰寫,系統(tǒng)講解RT-thread IO設(shè)備驅(qū)動開發(fā)方法,從三方面進行講解
    的頭像 發(fā)表于 02-20 16:01 ?1758次閱讀
    <b class='flag-5'>RT-Thread</b>設(shè)備<b class='flag-5'>驅(qū)動</b>開發(fā)指南基礎(chǔ)<b class='flag-5'>篇</b>—以先楫bsp的<b class='flag-5'>hwtimer</b>設(shè)備為例
    主站蜘蛛池模板: 日产乱码免费一卡二卡在线| 日本黄色www| 亚洲精品美女久久久aaa| 欧美成人激情在线| 91大神免费视频| 性感美女逼| 男女一区二区三区免费| 狠狠色噜噜狠狠狠狠2021天天| 最近2018中文字幕免费看在线| 最新天堂| 午夜精品久久久久蜜桃| 色伊伊| 欧美线人一区二区三区| 玖玖色视频| 成 黄 色 激 情视频网站| 亚洲视频国产| 华人被黑人粗大猛然进| 视频 在线| 美女扒开尿口给男人爽免费视频| 最近2018年中文字幕免费图片| 性视频在线| 日本三级视频在线观看| 黄色一及毛片| 亚洲操图| 国产高清免费不卡观看| 亚洲欧美视频在线观看| 亚洲欧美色图| 日本亚洲成人| 丁香六月五月婷婷| 日本黄色免费网站| 2022年国产精品久久久久| 日本在线不卡一区| 婷婷深爱| 国产主播在线一区| 手机看片久久青草福利盒子| 欧美性猛交xxxx| 一级特黄性生活大片免费观看| 拍拍拍美女黄色1000视频| 成人综合网址| 国产牛牛| 欧美一级片手机在线观看|