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

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

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

Linux驅(qū)動(dòng)開發(fā)高精度定時(shí)器的精度測(cè)量評(píng)測(cè)

Rice嵌入式開發(fā)技術(shù)分享 ? 來(lái)源: Rice嵌入式開發(fā)技術(shù)分享 ? 作者: Rice嵌入式開發(fā)技 ? 2022-08-09 11:17 ? 次閱讀

前言

  • 今天我們來(lái)評(píng)測(cè)linux內(nèi)核的高精度定時(shí)器。順便利用通過(guò)Tektronix示波器 和 DS100 Mini 數(shù)字示波器進(jìn)行交叉測(cè)試。
  • 因項(xiàng)目需要用到精準(zhǔn)的時(shí)間周期,所以要評(píng)估它的可行性,并驗(yàn)證正點(diǎn)原子的示波器能不能支撐嵌入式開發(fā)流程。

Linux高精度定時(shí)器說(shuō)明

  • 其實(shí)傳統(tǒng)的低分辨率定時(shí)器隨著技術(shù)的演進(jìn),已經(jīng)無(wú)法滿足開發(fā)需求。而且硬件的不斷發(fā)展,硬件定時(shí)器的精度也越來(lái)越高,這也給高精度定時(shí)器創(chuàng)建了有利條件。
  • 低分辨率的定時(shí)大部分時(shí)間復(fù)雜度可以實(shí)現(xiàn)O(1),當(dāng)有進(jìn)位發(fā)生時(shí),不可預(yù)測(cè)的O(N)定時(shí)器級(jí)聯(lián)遷移時(shí)間,影響定時(shí)器的精度。
  • 低分率的定時(shí)器可以說(shuō)在超時(shí)應(yīng)用場(chǎng)景上更加合適,以超時(shí)為目的,期望在超時(shí)到來(lái)之前獲得正確的結(jié)果的場(chǎng)景,應(yīng)用低分辨率的定時(shí)器適合不過(guò)。
  • 為了滿足技術(shù)的演進(jìn)及定時(shí)器的精度要求,Linux內(nèi)核為高精度定時(shí)器重新設(shè)計(jì)了一套軟件架構(gòu),它可以為我們提供納秒級(jí)的定時(shí)器精度,以滿足我們開發(fā)需求。精度如何實(shí)測(cè)才知道。。。。

Linux高精度定時(shí)器驅(qū)動(dòng)編寫

  • 為了驗(yàn)證高精度定時(shí)器的分辨率,我們寫一個(gè)簡(jiǎn)單的內(nèi)核驅(qū)動(dòng)(功能:在設(shè)定的周期內(nèi)反轉(zhuǎn)IO,然后通過(guò)示波器測(cè)量精度)。

  • 高精度定時(shí)器使用步驟:

  1. 初始化定時(shí)器工作模式:hrtimer_init(&kthread_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
  2. 設(shè)置定時(shí)器的回調(diào)函數(shù):kthread_timer.function = hrtimer_cb_func;
  3. 啟動(dòng)定時(shí)器:hrtimer_start(&kthread_timer, ktime_set(HRTIMER_TEST_CYCLE), HRTIMER_MODE_REL);
  4. 在定時(shí)器回調(diào)函數(shù)中,增加定時(shí)到期時(shí)間:hrtimer_forward(timer, timer->base->get_time(), ktime_set(HRTIMER_TEST_CYCLE));
  • 內(nèi)核驅(qū)動(dòng)模塊代碼模塊實(shí)現(xiàn):
#include"hrtimer_test.h"

#defineHRTIMER_TEST_PIN7

#defineHRTIMER_TEST_CYCLE0,(100000/2)

#defineDEVICE_NAME"HRTIMER_TEST"
#defineCLASS_NAME"HRTIMER_TEST"

intmajor_number;
structdevice*device;
structclass*class;
staticstructhrtimerkthread_timer;
intvalue=0;

enumhrtimer_restarthrtimer_cb_func(structhrtimer*timer){
ChipBspGpio_ExportSet(ULTRASONIC_TEST_PIN,value);
value=!value;

hrtimer_forward(timer,timer->base->get_time(),ktime_set(HRTIMER_TEST_CYCLE));
returnHRTIMER_RESTART;
}

voidkthread_hrtimer_init(void){
hrtimer_init(&kthread_timer,CLOCK_MONOTONIC,HRTIMER_MODE_REL);
kthread_timer.function=hrtimer_cb_func;
hrtimer_start(&kthread_timer,ktime_set(HRTIMER_TEST_CYCLE),HRTIMER_MODE_REL);
}

staticint__inithrtimer_test_init(void){
printk(KERN_ALERT"hrtimer_test:Init!!\n");

major_number=register_chrdev(0,DEVICE_NAME,NULL);

if(major_number0){
printk(KERN_ALERT"hrtimer_test:Registerfail!\n");
returnmajor_number;
}

printk(KERN_ALERT"Registesuccess,majornumberis%d\n",major_number);

class=class_create(THIS_MODULE,CLASS_NAME);

if(IS_ERR(class)){
unregister_chrdev(major_number,DEVICE_NAME);
returnPTR_ERR(class);
}

device=device_create(class,NULL,MKDEV(major_number,0),NULL,DEVICE_NAME);

if(IS_ERR(device)){
class_destroy(class);
unregister_chrdev(major_number,DEVICE_NAME);
returnPTR_ERR(device);
}

printk(KERN_ALERT"hrtimer_test:initsuccess!!\n");

kthread_hrtimer_init();

return0;
}

staticvoid__exithrtimer_test_exit(void){

hrtimer_cancel(&kthread_timer);

device_destroy(class,MKDEV(major_number,0));
class_unregister(class);
class_destroy(class);
unregister_chrdev(major_number,DEVICE_NAME);

printk(KERN_ALERT"hrtimer_test:exitsuccess!!\n");
}

module_init(hrtimer_test_init);
module_exit(hrtimer_test_exit);

MODULE_AUTHOR("RieChen");
MODULE_LICENSE("GPL");

  • 該驅(qū)動(dòng)模塊主要功能:在定時(shí)器回調(diào)函數(shù)中,周期性反轉(zhuǎn)GPIO,然后查看其定時(shí)器精度。其中宏定義(HRTIMER_TEST_CYCLE)為定時(shí)的周期。

Linux高精度定時(shí)器的評(píng)測(cè)

  1. 周期1ms評(píng)測(cè):
  • 修改宏定義:HRTIMER_TEST_CYCL設(shè)置周期為1ms. 修改如下
#defineHRTIMER_TEST_CYCLE0,(1000000/2)
  • 通過(guò)Tektronix示波器測(cè)量:
d860d842-1791-11ed-bbb4-dac502259ad0.jpg
  • 通過(guò)DS100 Mini 數(shù)字示波器測(cè)量:
d883954e-1791-11ed-bbb4-dac502259ad0.jpg
  • 結(jié)論:Tektronix示波器和DS100 Mini 數(shù)字示波器數(shù)據(jù)相符,波形穩(wěn)定。統(tǒng)計(jì)出的頻率與周期跟軟件設(shè)置一致
  1. 周期100us評(píng)測(cè):
  • 修改宏定義:HRTIMER_TEST_CYCL設(shè)置周期為100us. 修改如下
#defineHRTIMER_TEST_CYCLE0,(100000/2)
  • 通過(guò)Tektronix示波器測(cè)量:
d8a543ec-1791-11ed-bbb4-dac502259ad0.jpg
  • 通過(guò)DS100 Mini 數(shù)字示波器測(cè)量:
d8c62260-1791-11ed-bbb4-dac502259ad0.jpg
  • 結(jié)論:Tektronix示波器和DS100 Mini 數(shù)字示波器數(shù)據(jù)相符,波形穩(wěn)定。統(tǒng)計(jì)出的頻率與周期跟軟件設(shè)置一致
  1. 周期10us評(píng)測(cè):
  • 修改宏定義:HRTIMER_TEST_CYCL設(shè)置周期為10us. 修改如下
#defineHRTIMER_TEST_CYCLE0,(10000/2)
  • 通過(guò)Tektronix示波器測(cè)量:
d8eb30e6-1791-11ed-bbb4-dac502259ad0.jpg
  • 通過(guò)DS100 Mini 數(shù)字示波器測(cè)量:
d90e11d8-1791-11ed-bbb4-dac502259ad0.jpg
  • 結(jié)論:Tektronix示波器和DS100 Mini 數(shù)字示波器數(shù)據(jù)都無(wú)法精確測(cè)量,波形不清晰。
  1. 周期1us評(píng)測(cè):
  • 修改宏定義:HRTIMER_TEST_CYCL設(shè)置周期為1us. 修改如下:
#defineHRTIMER_TEST_CYCLE0,(1000/2)
  • 通過(guò)Tektronix示波器測(cè)量:
d92f79ea-1791-11ed-bbb4-dac502259ad0.jpg
  • 通過(guò)DS100 Mini 數(shù)字示波器測(cè)量:
d96d6962-1791-11ed-bbb4-dac502259ad0.jpg
  • 結(jié)論:Tektronix示波器和DS100 Mini 數(shù)字示波器數(shù)據(jù)都無(wú)法精確測(cè)量,波形不清晰。

總結(jié)

  • 高精度定時(shí)器總結(jié)
  1. Linux提供的高精度定時(shí)器可以滿足我們大部分需求的,要注意的的,定時(shí)器回調(diào)函數(shù)不能做太多任務(wù),并需要快速執(zhí)行,否則無(wú)法保證其周期性。(作者認(rèn)為高精度定時(shí)器可以看作一個(gè)外部中斷的思想進(jìn)行處理)
  2. 通過(guò)此次評(píng)估,Linux提供的高精度定時(shí)器可以滿足我的項(xiàng)目需求,而且建議幾十納秒級(jí)的需求使用比較合適,如果幾納秒的需求不適合。
  • 示波器總結(jié)
  1. 通過(guò)評(píng)估數(shù)據(jù)上看,DS100 Mini 數(shù)字示波器可以替代一般的臺(tái)式示波器。
  2. DS100 Mini 數(shù)字示波器可以在大部分場(chǎng)景上使用,可以滿足項(xiàng)目需求

審核編輯 黃昊宇


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • 驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    12

    文章

    1814

    瀏覽量

    85064
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11182

    瀏覽量

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

    關(guān)注

    23

    文章

    3228

    瀏覽量

    114198
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    GPT高精度延時(shí)定時(shí)器簡(jiǎn)介

    Linux NXP (I.MX6ULL) GPT高精度延時(shí)定時(shí)器0、GPT 定時(shí)器簡(jiǎn)介1、GPT 定時(shí)器特性如下:2、GPT
    發(fā)表于 01-12 06:46

    高精度定時(shí)器電路及制作

    高精度定時(shí)器電路及制作
    發(fā)表于 04-14 11:39 ?14次下載
    <b class='flag-5'>高精度</b><b class='flag-5'>定時(shí)器</b>電路及制作

    高精度定時(shí)器電路圖

    高精度定時(shí)器電路圖
    發(fā)表于 05-18 11:40 ?287次下載
    <b class='flag-5'>高精度</b><b class='flag-5'>定時(shí)器</b>電路圖

    長(zhǎng)時(shí)間高精度定時(shí)器

    長(zhǎng)時(shí)間高精度定時(shí)器:某些場(chǎng)合需要長(zhǎng)時(shí)間高精度定時(shí)器,此圖定時(shí)電路定時(shí)時(shí)間較長(zhǎng),
    發(fā)表于 12-14 08:05 ?1064次閱讀
    長(zhǎng)時(shí)間<b class='flag-5'>高精度</b><b class='flag-5'>定時(shí)器</b>

    用電子表作高精度定時(shí)器電路圖

    用電子表作高精度定時(shí)器電路圖
    發(fā)表于 07-29 08:34 ?1561次閱讀
    用電子表作<b class='flag-5'>高精度</b><b class='flag-5'>定時(shí)器</b>電路圖

    LINUX內(nèi)核定時(shí)器高精度&低精度

    linux從內(nèi)核2.6.16開始引入了高精度定時(shí)器,達(dá)到ns級(jí)別。自此,內(nèi)核擁有兩套并行計(jì)時(shí),低精度
    發(fā)表于 05-13 09:41 ?4092次閱讀

    詳解高精度定時(shí)器與高級(jí)控制定時(shí)器

    高精度定時(shí)器中,可以使用外部事件來(lái)對(duì) PWM 輸出進(jìn)行封鎖,并可自動(dòng)恢復(fù);在高級(jí)控制定時(shí)器中,可以使用 Break 或是 Clr_input 來(lái)對(duì) PWM 輸出進(jìn)行封鎖, 然后也可以自動(dòng)恢復(fù),其中 Break 必須結(jié)合 AOE
    的頭像 發(fā)表于 06-16 16:52 ?2667次閱讀

    工程師筆記|高精度定時(shí)器的同步功能

    關(guān)鍵詞:高精度定時(shí)器, 同步 目錄預(yù)覽 1.引言 2.定時(shí)器同步結(jié)構(gòu) 3.高精度定時(shí)器內(nèi)部同步 4.高精
    的頭像 發(fā)表于 11-22 18:15 ?1452次閱讀

    高精度定時(shí)器中single-shot計(jì)數(shù)模式不工作

    高精度定時(shí)器中single-shot計(jì)數(shù)模式不工作
    的頭像 發(fā)表于 10-25 18:08 ?473次閱讀
    <b class='flag-5'>高精度</b><b class='flag-5'>定時(shí)器</b>中single-shot計(jì)數(shù)模式不工作

    高精度定時(shí)器與高級(jí)控制定時(shí)器 PWM 封波后再恢復(fù)的區(qū)別

    高精度定時(shí)器與高級(jí)控制定時(shí)器 PWM 封波后再恢復(fù)的區(qū)別
    的頭像 發(fā)表于 10-17 16:52 ?672次閱讀
    <b class='flag-5'>高精度</b><b class='flag-5'>定時(shí)器</b>與高級(jí)控制<b class='flag-5'>定時(shí)器</b> PWM 封波后再恢復(fù)的區(qū)別

    高精度定時(shí)器的同步功能

    電子發(fā)燒友網(wǎng)站提供《高精度定時(shí)器的同步功能.pdf》資料免費(fèi)下載
    發(fā)表于 09-19 14:17 ?0次下載
    <b class='flag-5'>高精度</b><b class='flag-5'>定時(shí)器</b>的同步功能

    Linux高精度定時(shí)器hrtimer使用示例

    要使用高精度定時(shí)器hrtimer。 使用示例 單次定時(shí) 加載驅(qū)動(dòng)一秒后輸出“ hrtimer handler ”: # include # include # include # in
    的頭像 發(fā)表于 10-04 15:38 ?1366次閱讀