一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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í)函數(shù)框架設(shè)計(jì)與實(shí)現(xiàn)

Q4MP_gh_c472c21 ? 來(lái)源:痞子衡嵌入式 ? 作者:痞子衡嵌入式 ? 2022-10-14 12:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

今天給大家分享的是嵌入式里通用微秒(microseconds)計(jì)時(shí)函數(shù)框架設(shè)計(jì)與實(shí)現(xiàn)

嵌入式軟件開(kāi)發(fā)里,計(jì)時(shí)可以說(shuō)是非?;A(chǔ)的功能模塊了,其應(yīng)用也非常廣泛,比如可以輔助計(jì)算信號(hào)脈沖寬度時(shí)間,也可以直接用于常規(guī)延時(shí)等。相信很多人初次領(lǐng)略 MCU 的神奇,都是從計(jì)時(shí)功能相關(guān)小程序開(kāi)始的。

在 MCU 里要想實(shí)現(xiàn)精確計(jì)時(shí),往往都是利用其內(nèi)部硬件定時(shí)器。不同廠商的 MCU,其定時(shí)器設(shè)計(jì)與使用都不太一樣。即使是同一 MCU 內(nèi),通常也會(huì)有好幾種不同類型的定時(shí)器共存。

基于此,今天分享一種非常簡(jiǎn)單實(shí)用的通用計(jì)時(shí)函數(shù)框架。這個(gè)框架的目的是統(tǒng)一計(jì)時(shí)函數(shù)接口,并且在實(shí)現(xiàn)上將通用部分和硬件相關(guān)部分剝離開(kāi)。這樣你的嵌入式項(xiàng)目在使用這個(gè)框架時(shí),可以無(wú)縫快捷地切換底層定時(shí)器。

注:本框架主要適合定時(shí)器時(shí)鐘源不小于 1MHz 的 MCU,因?yàn)楹瘮?shù)接口里延時(shí)最小單元是 1us。對(duì)于一些定時(shí)器時(shí)鐘源低于 1MHz 的 MCU,可將本框架簡(jiǎn)單改成毫秒(milliseconds)計(jì)時(shí)函數(shù)。

一、微秒(microseconds)計(jì)時(shí)函數(shù)庫(kù)設(shè)計(jì)

1、函數(shù)接口定義

首先是設(shè)計(jì)通用計(jì)時(shí)函數(shù)框架頭文件:microseconds.h ,這個(gè)頭文件里直接定義如下 7 個(gè)接口函數(shù)原型。涵蓋必備的初始化流程init()、shutdown(),最核心的計(jì)時(shí)功能get_ticks()、convert_to_microseconds(),常用的延時(shí)功能delay()、set_delay()、is_timeout()。

//!@brief初始化計(jì)時(shí)
voidmicroseconds_init(void);
//!@brief關(guān)閉計(jì)時(shí)
voidmicroseconds_shutdown(void);
//!@brief獲取系統(tǒng)累計(jì)計(jì)數(shù)值
uint64_tmicroseconds_get_ticks(void);
//!@brief將計(jì)數(shù)值轉(zhuǎn)換為時(shí)間值(微秒)
uint32_tmicroseconds_convert_to_microseconds(uint64_tticks);
//!@brief阻塞型延時(shí)(微秒級(jí))
voidmicroseconds_delay(uint32_tus);
//!@brief設(shè)置超時(shí)時(shí)間(用于非阻塞型延時(shí))
voidmicroseconds_set_delay(uint32_tus);
//!@brief判斷是否超時(shí)(用于非阻塞型延時(shí))
boolmicroseconds_is_timeout(void);

2、通用函數(shù)實(shí)現(xiàn)

然后是設(shè)計(jì)通用計(jì)時(shí)函數(shù)框架共用源文件:microseconds_common.c,這個(gè)文件里涉及三個(gè)靜態(tài)全局變量定義,四個(gè)私有函數(shù)聲明,以及除了 get_ticks() 之外的 6 個(gè)接口函數(shù)實(shí)現(xiàn)。

其中 s_tickPerMicrosecond 變量存的是每微秒對(duì)應(yīng)計(jì)數(shù)值,其實(shí)這個(gè)變量不是一定要定義的,可以在函數(shù)需要時(shí)實(shí)時(shí)計(jì)算,但為了小小提升框架性能,就在 init() 里將這個(gè)值先算出來(lái)了,方便其他函數(shù)直接使用。

s_highCounter 變量存的是定時(shí)器中斷次數(shù),即高位計(jì)數(shù)器,因?yàn)榭蚣?get_ticks() 接口返回的是 64bit 的計(jì)數(shù)值,對(duì)于有些寬度小于 32bit 的定時(shí)器,我們常常需要開(kāi)啟定時(shí)器中斷,否則無(wú)法保證系統(tǒng)長(zhǎng)時(shí)間運(yùn)行線性計(jì)時(shí)的正確性(比如 100MHz 時(shí)鐘源的 32bit 定時(shí)器,最長(zhǎng)約 43 秒就會(huì)清零翻轉(zhuǎn)一次,需要 s_highCounter 變量記錄翻轉(zhuǎn)次數(shù))。

當(dāng)然,如果 MCU 里能級(jí)連出 64bit 的定時(shí)器,就可以不用開(kāi)啟中斷(清零翻轉(zhuǎn)的時(shí)間特別長(zhǎng),可近似認(rèn)為是永久),s_highCounter 此時(shí)就不需要了。

關(guān)于延時(shí)函數(shù)接口,delay() 用于阻塞型延時(shí),即調(diào)用這個(gè)函數(shù)后一定是死等指定時(shí)間后才退出,系統(tǒng)會(huì)被強(qiáng)制掛起;set_delay()/is_timeout()用于非阻塞型延時(shí),系統(tǒng)可以繼續(xù)干其他任務(wù),在需要的時(shí)侯來(lái)查看一下超時(shí)時(shí)間是否到了即可。兩種延時(shí)各有各的用途。

//!

二、微秒(microseconds)計(jì)時(shí)函數(shù)庫(kù)實(shí)現(xiàn)

1、定時(shí)器相關(guān)實(shí)現(xiàn)(基于Cortex-M內(nèi)核的SysTick)

最后是設(shè)計(jì) MCU 相關(guān)的通用計(jì)時(shí)函數(shù)框架源文件:microseconds_xxTimer.c,這里我們以 Cortex-M 系列 MCU 的內(nèi)核定時(shí)器 SysTick 為例。

SysTick 是 24bit 遞減定時(shí)器,時(shí)鐘源有兩種配置:一是內(nèi)核主頻,二是外部時(shí)鐘(看廠商實(shí)現(xiàn)),最常用的時(shí)鐘源配置就是與內(nèi)核同頻。

之前我們說(shuō)過(guò),用 SysTick 這類寬度小于 32bit 的定時(shí)器,是需要開(kāi)啟定時(shí)器中斷的,所以 s_highCounter 會(huì)生效。get_ticks()是整個(gè)計(jì)時(shí)函數(shù)框架里最基礎(chǔ)也最核心的功能接口,這里面的實(shí)現(xiàn)有一個(gè)需要特別注意的地方,就是取系統(tǒng)當(dāng)前計(jì)數(shù)值可能會(huì)有數(shù)值回退的風(fēng)險(xiǎn),需要使用代碼中 do {} while();方式來(lái)確保正確性。

//!CTRL&=~(SysTick_CTRL_CLKSOURCE_Msk|
SysTick_CTRL_TICKINT_Msk|
SysTick_CTRL_ENABLE_Msk);
SysTick->VAL=0;
}

uint32_tmicroseconds_get_clock(void)
{
returnSystemCoreClock;
}

uint64_tmicroseconds_get_ticks(void)
{
uint32_thigh;
uint32_tlow;
//這里的實(shí)現(xiàn)要注意確保中斷發(fā)生時(shí)獲取系統(tǒng)累計(jì)計(jì)數(shù)值的正確性
do
{
//先緩存高位計(jì)數(shù)器
high=s_highCounter;
//再讀定時(shí)器實(shí)際計(jì)數(shù)值
low=~SysTick->VAL&SysTick_LOAD_RELOAD_Msk;
}while(high!=s_highCounter);//保證緩存高位值與讀實(shí)際低位值間隙中沒(méi)有發(fā)生中斷

return((uint64_t)high<

當(dāng)然還有很多具體 MCU 平臺(tái)的各種定時(shí)器實(shí)現(xiàn),因此這個(gè)項(xiàng)目會(huì)不斷更新,也歡迎大家來(lái)參與貢獻(xiàn)。

至此,嵌入式里通用微秒(microseconds)計(jì)時(shí)函數(shù)框架設(shè)計(jì)與實(shí)現(xiàn)便介紹完畢了。

審核編輯:湯梓紅
聲明:本文內(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)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17984

    瀏覽量

    367232
  • 嵌入式
    +關(guān)注

    關(guān)注

    5152

    文章

    19676

    瀏覽量

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

    關(guān)注

    23

    文章

    3298

    瀏覽量

    119019
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64927

原文標(biāo)題:MCU通用微秒計(jì)時(shí)函數(shù)框架設(shè)計(jì)

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    嵌入式計(jì)時(shí)器以及simulink設(shè)計(jì)實(shí)現(xiàn)

    嵌入式計(jì)時(shí)器是一種在嵌入式系統(tǒng)中用于計(jì)時(shí)、計(jì)數(shù)和測(cè)量時(shí)間間隔的設(shè)備。
    發(fā)表于 07-21 17:20 ?6052次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>計(jì)時(shí)</b>器以及simulink設(shè)計(jì)<b class='flag-5'>實(shí)現(xiàn)</b>

    什么叫嵌入式 嵌入式應(yīng)用

    防、智能農(nóng)業(yè)工控類:機(jī)械手臂、醫(yī)療用具3、嵌入式開(kāi)發(fā)框架:Linux開(kāi)發(fā):c語(yǔ)言——>編譯文件(二進(jìn)制)——>下載到操作系統(tǒng)——>運(yùn)行4、c語(yǔ)言框架頭文件——聲明接口函數(shù)
    發(fā)表于 08-12 07:51

    嵌入式框架

    1.overview 圖1-1 嵌入式框架嵌入式系統(tǒng)分為硬件以及軟件兩大部分,大多數(shù)人參與的是嵌入式軟件設(shè)計(jì),更多的是接觸的是上層軟件系統(tǒng)部分,可以分為兩大類型
    發(fā)表于 10-27 08:26

    如何去設(shè)計(jì)一個(gè)linux嵌入式UI框架

    看了“自己動(dòng)手設(shè)計(jì)并實(shí)現(xiàn)一個(gè)linux嵌入式UI框架”顯然沒(méi)有盡興,因?yàn)檫€沒(méi)有看到廬山真面目,那我今天繼續(xù),先來(lái)說(shuō)說(shuō),我用到了哪些知識(shí)背景。如:C語(yǔ)言基礎(chǔ)知識(shí),尤其是指針、函數(shù)指針、內(nèi)
    發(fā)表于 11-08 07:22

    嵌入式通用微秒計(jì)時(shí)函數(shù)框架的設(shè)計(jì)資料分享

      大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是嵌入式通用微秒(microseconds)計(jì)時(shí)
    發(fā)表于 12-08 07:35

    嵌入式低功耗電源管理框架的設(shè)計(jì)資料分享

    概述目標(biāo)本篇的目標(biāo)是介紹低功耗電源管理框架設(shè)計(jì)的概念理解低功耗管理的重要性理解如何開(kāi)發(fā)適合的低功耗管理框架理解如何去管理產(chǎn)品的功耗形勢(shì)大多數(shù)的嵌入式產(chǎn)品非常注重低功耗設(shè)計(jì),尤其近年來(lái),硬件不斷
    發(fā)表于 12-21 07:39

    基于Chirp函數(shù)的Nios Ⅱ嵌入式實(shí)現(xiàn)

    分析Chirp函數(shù)在頻域上的一般特性,提出利用FPGA的嵌入式軟核NiosⅡ處理器在嵌入式操作系統(tǒng)μC/OS-Ⅱ上實(shí)現(xiàn)Chirp的方法
    發(fā)表于 06-15 11:02 ?1346次閱讀
    基于Chirp<b class='flag-5'>函數(shù)</b>的Nios Ⅱ<b class='flag-5'>嵌入式</b><b class='flag-5'>實(shí)現(xiàn)</b>

    嵌入式應(yīng)用框架EAF詳解

    EAF是Embedded Application Framework 的縮寫,即嵌入式應(yīng)用框架。嵌入式應(yīng)用框架是 Application framework的一種, 是在
    發(fā)表于 12-02 11:30 ?3190次閱讀

    關(guān)于嵌入式應(yīng)用框架(EAF)的探索

    EAF是Embedded Application Framework 的縮寫,即嵌入式應(yīng)用框架。
    發(fā)表于 12-10 14:28 ?1050次閱讀

    關(guān)于嵌入式應(yīng)用框架(EAF)的分析

    EAF是Embedded Application Framework 的縮寫,即嵌入式應(yīng)用框架。嵌入式應(yīng)用框架是 Application framework的一種, 是在
    發(fā)表于 01-01 09:50 ?1788次閱讀

    嵌入式堆棧的原理介紹和如何實(shí)現(xiàn)純C實(shí)現(xiàn)

    棧這種結(jié)構(gòu)在嵌入式其實(shí)是非常常用的,比如函數(shù)調(diào)用與返回就是典型的棧應(yīng)用,雖然很多時(shí)候棧都是CPU系統(tǒng)在自動(dòng)管理,我們只需要在鏈接文件分配棧大小以及棧存放位置,但稍微了解一下棧的原理
    的頭像 發(fā)表于 04-06 10:10 ?5009次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>里</b>堆棧的原理介紹和如何<b class='flag-5'>實(shí)現(xiàn)</b>純C<b class='flag-5'>實(shí)現(xiàn)</b>

    嵌入式系統(tǒng)框架----硬件篇

    1.系統(tǒng)框架圖對(duì)于一個(gè)嵌入式系統(tǒng),最重要的當(dāng)然是運(yùn)算以及存儲(chǔ)單元,基本的嵌入式系統(tǒng)可以簡(jiǎn)化成如下系統(tǒng)框架圖:
    發(fā)表于 10-20 11:51 ?3次下載
    <b class='flag-5'>嵌入式</b>系統(tǒng)<b class='flag-5'>框架</b>----硬件篇

    自己動(dòng)手設(shè)計(jì)并實(shí)現(xiàn)一個(gè)linux嵌入式UI框架(設(shè)計(jì))

    看了“自己動(dòng)手設(shè)計(jì)并實(shí)現(xiàn)一個(gè)linux嵌入式UI框架”顯然沒(méi)有盡興,因?yàn)檫€沒(méi)有看到廬山真面目,那我今天繼續(xù),先來(lái)說(shuō)說(shuō),我用到了哪些知識(shí)背景。如:C語(yǔ)言基礎(chǔ)知識(shí),尤其是指針、函數(shù)指針、內(nèi)
    發(fā)表于 11-03 16:51 ?12次下載
    自己動(dòng)手設(shè)計(jì)并<b class='flag-5'>實(shí)現(xiàn)</b>一個(gè)linux<b class='flag-5'>嵌入式</b>UI<b class='flag-5'>框架</b>(設(shè)計(jì))

    痞子衡嵌入式嵌入式通用微秒(microseconds)計(jì)時(shí)函數(shù)框架設(shè)計(jì)與實(shí)現(xiàn)

      大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是嵌入式通用微秒(microseconds)計(jì)時(shí)
    發(fā)表于 11-25 09:21 ?16次下載
    痞子衡<b class='flag-5'>嵌入式</b>:<b class='flag-5'>嵌入式</b><b class='flag-5'>里</b><b class='flag-5'>通用</b><b class='flag-5'>微秒</b>(microseconds)<b class='flag-5'>計(jì)時(shí)</b><b class='flag-5'>函數(shù)</b><b class='flag-5'>框架設(shè)</b>計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>

    深度詳解嵌入式系統(tǒng)專用輕量級(jí)框架設(shè)計(jì)

    MR 框架是專為嵌入式系統(tǒng)設(shè)計(jì)的輕量級(jí)框架。充分考慮了嵌入式系統(tǒng)在資源和性能方面的需求。通過(guò)提供標(biāo)準(zhǔn)化的設(shè)備管理接口,極大簡(jiǎn)化了嵌入式應(yīng)用開(kāi)
    發(fā)表于 04-27 02:32 ?1429次閱讀
    深度詳解<b class='flag-5'>嵌入式</b>系統(tǒng)專用輕量級(jí)<b class='flag-5'>框架設(shè)</b>計(jì)