91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

RT-Thread驅(qū)動(dòng)篇: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 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

硬件定時(shí)器

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

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

在定時(shí)器時(shí)鐘一定的前提下,重載值就決定了定時(shí)器定時(shí)時(shí)間的準(zhǔn)確性。

兩種計(jì)算重載值算法

hwtimer.c 文件timeout_calc函數(shù)實(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;

第二種實(shí)現(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;

測(cè)試環(huán)境

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

系統(tǒng):win10

IDE:Qt Creator

最大定時(shí)范圍

兩種算法,最主要的差別在于前一種用 float 運(yùn)算,因?yàn)?float 可以表達(dá)的值范圍更大,定時(shí)時(shí)間可以更長(zhǎng)。

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

精度 PK

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

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

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

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

運(yùn)算速度

測(cè)試方法:抽取某幾個(gè)時(shí)間值,循環(huán) 1M 次運(yùn)算,計(jì)量 1M 次運(yùn)算總耗時(shí)時(shí)間。

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

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

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

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

再次測(cè)試結(jié)果:

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

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

其實(shí),對(duì)結(jié)束條件再次修正,將dev == 0的嚴(yán)苛誤差條件換成dev <= 1也不會(huì)出現(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 的超長(zhǎng)定時(shí)

需要修改rt_uint64_t timer_cnt的定義為 64 位無符號(hào)整型rt_uint64_t timer_cnt。

又因?yàn)槎〞r(shí)時(shí)間很長(zhǎng)很長(zhǎng),對(duì)誤差要求可以降低一些,對(duì)第二種算法做的第二處修改:

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

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

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

下面是 10k 次(沒有進(jìn)行 1W 次是因?yàn)橛行r(shí)間太長(zhǎng)了)運(yùn)算時(shí)間統(tǒng)計(jì)

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

返璞歸真

以上是對(duì)兩種算法從不同角度進(jìn)行的比對(duì)測(cè)驗(yàn)??此朴?float 可以計(jì)算更大的定時(shí)數(shù),但是,測(cè)試結(jié)果并不那么理想。使用 64位整型數(shù)計(jì)算,可能得到比用 float 更精確的結(jié)果。

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

算法及測(cè)試源碼見:

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

審核編輯 :李倩


聲明:本文內(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)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4784

    瀏覽量

    98027
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3368

    瀏覽量

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

    關(guān)注

    32

    文章

    1611

    瀏覽量

    44811

原文標(biāo)題:RT-Thread 驅(qū)動(dòng)篇 之 hwtimer 重載值算法

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    恩智浦亮相RT-Thread 20周年開發(fā)者大會(huì)

    日前,“開源向?qū)崱どa(chǎn)力進(jìn)化啟示錄”全球峰會(huì)暨RT-Thread 20周年開發(fā)者大會(huì)在上海成功舉辦,恩智浦作為RT-Thread的緊密合作伙伴,在活動(dòng)中重磅亮相,展示雙方在共建RT-Thread OS開發(fā)生態(tài)方面的新成果、新方案
    的頭像 發(fā)表于 01-26 09:07 ?540次閱讀

    基于RT-Thread和兆易創(chuàng)新GD32F527系列MCU的健康監(jiān)測(cè)站 | 技術(shù)集結(jié)

    本項(xiàng)目為RT-Thread嵌入式大賽獲獎(jiǎng)作品,基于RT-Thread和兆易創(chuàng)新GD32F527I-EVAL的健康監(jiān)測(cè)站。目錄項(xiàng)目概述系統(tǒng)硬件框架結(jié)構(gòu)基礎(chǔ)驅(qū)動(dòng)程序?qū)崿F(xiàn)整體驅(qū)動(dòng)實(shí)現(xiàn)工程效果
    的頭像 發(fā)表于 01-20 17:37 ?3803次閱讀
    基于<b class='flag-5'>RT-Thread</b>和兆易創(chuàng)新GD32F527系列MCU的健康監(jiān)測(cè)站 | 技術(shù)集結(jié)

    首搭RT-Thread程翧車控平臺(tái)| RT-Thread程翧 S32K344 快速原型開發(fā)平臺(tái)正式上市!| 產(chǎn)品動(dòng)態(tài)

    在智能汽車邁向高集成與高安全的時(shí)代,VCU/ECU開發(fā)正面臨效率與可靠性的雙重考驗(yàn)。依賴單一硬件或拼湊軟件方案的傳統(tǒng)模式,已成為制約創(chuàng)新的瓶頸。為此,RT-Thread帶來里程碑式的解決方案
    的頭像 發(fā)表于 10-31 11:53 ?985次閱讀
    首搭<b class='flag-5'>RT-Thread</b>程翧車控平臺(tái)| <b class='flag-5'>RT-Thread</b>程翧 S32K344 快速原型開發(fā)平臺(tái)正式上市!| 產(chǎn)品動(dòng)態(tài)

    基于RT-Thread的EK-RA2E2 設(shè)備驅(qū)動(dòng)移植與應(yīng)用 | 技術(shù)集結(jié)

    目錄前言環(huán)境配置HelloRT-ThreadGPIO輸入與中斷I2C主機(jī)驅(qū)動(dòng)SPI主機(jī)驅(qū)動(dòng)ADC設(shè)備驅(qū)動(dòng)PWM設(shè)備驅(qū)動(dòng)Flash設(shè)備驅(qū)動(dòng)WD
    的頭像 發(fā)表于 10-05 10:06 ?6160次閱讀
    基于<b class='flag-5'>RT-Thread</b>的EK-RA2E2 設(shè)備<b class='flag-5'>驅(qū)動(dòng)</b>移植與應(yīng)用 | 技術(shù)集結(jié)

    2025年RT-Thread開發(fā)者巡回培訓(xùn)報(bào)名正式啟動(dòng)!

    親愛的RT-Thread社區(qū)成員們:新程再啟,共赴熱愛!2025年RT-Thread開發(fā)者巡回培訓(xùn)正式啟動(dòng)報(bào)名!今年,我們選擇了西安、武漢、北京、杭州、深圳、上海、成都這7座城市,為大家?guī)?/div>
    的頭像 發(fā)表于 09-27 10:39 ?1959次閱讀
    2025年<b class='flag-5'>RT-Thread</b>開發(fā)者巡回培訓(xùn)報(bào)名正式啟動(dòng)!

    使用RT-Thread studio 開發(fā)RT-Thread Nano項(xiàng)目的時(shí)候 串口的驅(qū)動(dòng)是要自己寫嗎?

    剛?cè)肟?。使?b class='flag-5'>RT-Thread studio 開發(fā)RT-Thread 標(biāo)準(zhǔn)板項(xiàng)目的時(shí)候直接使用里邊的串口uart_dev=rt_device_find(“uart5”);然后操作設(shè)備,在開發(fā)R
    發(fā)表于 09-26 08:14

    rt-thread studio 2.2.9如何使用最新的RT-Thread v5.2.0 released?

    rt-thread studio2.2.9如何使用最新的RT-Thread v5.2.0 released? 原先以為修改index_all.json,發(fā)現(xiàn)聯(lián)網(wǎng)的時(shí)候,會(huì)自動(dòng)覆蓋 另lastet版本
    發(fā)表于 09-16 06:06

    明晚!基于RT-Thread 的 PID 控制實(shí)踐,從驅(qū)動(dòng)算法到監(jiān)控,一次學(xué)會(huì)!| 問學(xué)直播

    RT-Thread簡(jiǎn)單PID控制實(shí)踐》精彩直播!本次直播將基于RT-Thread實(shí)時(shí)操作系統(tǒng)與NXPFRDM-MCXA156開發(fā)板,圍繞驅(qū)動(dòng)配置、控制算法實(shí)現(xiàn)、遠(yuǎn)
    的頭像 發(fā)表于 09-01 17:04 ?1316次閱讀
    明晚!基于<b class='flag-5'>RT-Thread</b> 的 PID 控制實(shí)踐,從<b class='flag-5'>驅(qū)動(dòng)</b>到<b class='flag-5'>算法</b>到監(jiān)控,一次學(xué)會(huì)!| 問學(xué)直播

    【好書推薦】RT-Thread第20本相關(guān)書籍!《嵌入式實(shí)時(shí)操作系統(tǒng)RT-Thread原理與應(yīng)用》| 技術(shù)集結(jié)

    01內(nèi)容簡(jiǎn)介ContentSummary本書為讀者提供了一個(gè)全面、系統(tǒng)的RT-Thread學(xué)習(xí)指南,旨在幫助初學(xué)者及有經(jīng)驗(yàn)的開發(fā)者掌握RT-Thread實(shí)時(shí)操作系統(tǒng)和STM32嵌入式微控制器的核心
    的頭像 發(fā)表于 08-24 10:05 ?1005次閱讀
    【好書推薦】<b class='flag-5'>RT-Thread</b>第20本相關(guān)書籍!《嵌入式實(shí)時(shí)操作系統(tǒng)<b class='flag-5'>RT-Thread</b>原理與應(yīng)用》| 技術(shù)集結(jié)

    RT-Thread Nano硬核移植指南:手把手實(shí)現(xiàn)VGLite圖形驅(qū)動(dòng)適配 | 技術(shù)集結(jié)

    VGLite是NXP提供的輕量級(jí)2D圖形API,本文將手把手帶你實(shí)現(xiàn)VGLite圖形驅(qū)動(dòng)適配RT-Thread。文章分為上、下兩,將手把手教您移植。上篇對(duì)RT-ThreadNano內(nèi)
    的頭像 發(fā)表于 07-17 14:40 ?3381次閱讀
    <b class='flag-5'>RT-Thread</b> Nano硬核移植指南:手把手實(shí)現(xiàn)VGLite圖形<b class='flag-5'>驅(qū)動(dòng)</b>適配 | 技術(shù)集結(jié)

    用SPI玩轉(zhuǎn)WiFi,RT-Thread ESP-Hosted驅(qū)動(dòng)深度適配指南 | 技術(shù)集結(jié)

    還在為MCU的WiFi連接方案發(fā)愁?RT-Thread社區(qū)開源ESP-Hosted驅(qū)動(dòng),通過標(biāo)準(zhǔn)SPI接口即可實(shí)現(xiàn),并且該倉(cāng)庫(kù)已整理成RT-Thread軟件包。RT
    的頭像 發(fā)表于 07-09 19:03 ?1642次閱讀
    用SPI玩轉(zhuǎn)WiFi,<b class='flag-5'>RT-Thread</b> ESP-Hosted<b class='flag-5'>驅(qū)動(dòng)</b>深度適配指南 | 技術(shù)集結(jié)

    RT-Thread榮獲2025優(yōu)秀開源項(xiàng)目 | 新聞速遞

    貢獻(xiàn),榮獲年度“優(yōu)秀開源項(xiàng)目獎(jiǎng)”。RT-Thread睿賽德榮獲2025優(yōu)秀開源項(xiàng)目獎(jiǎng)目前,開源已從軟件領(lǐng)域延展至硬件、數(shù)據(jù)、算法、標(biāo)準(zhǔn)、內(nèi)容等多領(lǐng)域。作為國(guó)內(nèi)開源
    的頭像 發(fā)表于 07-04 09:04 ?2636次閱讀
    <b class='flag-5'>RT-Thread</b>榮獲2025優(yōu)秀開源項(xiàng)目 | 新聞速遞

    深度剖析 RT-Thread 線程調(diào)度流程

    RT-Thread調(diào)度第一個(gè)線程的主要流程分如下:rtthread_startup:RTT的啟動(dòng)函數(shù),主要負(fù)責(zé)板級(jí)驅(qū)動(dòng),調(diào)度器,系統(tǒng)線程初始化,啟動(dòng)調(diào)度的工作
    的頭像 發(fā)表于 06-25 18:24 ?1763次閱讀
    深度剖析 <b class='flag-5'>RT-Thread</b> 線程調(diào)度流程

    揭秘RT-Thread上的AUTOSAR CP系統(tǒng)

    本文探討了RT-Thread與AUTOSARCP的融合,解決車載ECU開發(fā)中實(shí)時(shí)性、安全性與靈活性的平衡問題。通過分層安全內(nèi)核(rt-safetyos/autoos)和工具鏈整合,兼容AUTOSAR
    的頭像 發(fā)表于 06-23 20:22 ?3215次閱讀
    揭秘<b class='flag-5'>RT-Thread</b>上的AUTOSAR CP系統(tǒng)

    RT-Thread審核團(tuán)招募: 深度參與開源RTOS社區(qū)治理與演進(jìn)

    全球開發(fā)者招募:RT-Thread審核團(tuán)(ReviewTeam)正式開放申請(qǐng)!在開源的世界里,代碼審查(CodeReview)是保證軟件質(zhì)量、促進(jìn)技術(shù)交流的關(guān)鍵環(huán)節(jié)。RT-Thread作為全球領(lǐng)先
    的頭像 發(fā)表于 05-21 18:02 ?1251次閱讀
    <b class='flag-5'>RT-Thread</b>審核團(tuán)招募: 深度參與開源RTOS社區(qū)治理與演進(jìn)