色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

嵌入式軟件工程師在日常開發過程中的關鍵組件

Linux閱碼場 ? 來源:小麥大叔 ? 作者:菜刀和小麥 ? 2021-09-24 10:47 ? 次閱讀

大家好,周末快樂,我是小麥,今天分享一下CBUF。

循環緩沖區是嵌入式軟件工程師在日常開發過程中的關鍵組件。

多年來,互聯網上出現了許多不同的循環緩沖區實現和示例。我非常喜歡這個模塊,可以GitHub上找到這個開源的 CBUF.h 模塊。

地址:https://github.com/barraq/BRBrain/blob/master/firmware/CBUF.h

CBUF.h 模塊使用宏實現循環緩沖區,具體源碼如下所示;

#if !defined( CBUF_H )#define CBUF_H /**《 Include Guard *//* ---- Include Files ---------------------------------------------------- *//* ---- Constants and Types ---------------------------------------------- *//**

* Initializes the circular buffer for use.

*/

#define CBUF_Init( cbuf ) cbuf.m_getIdx = cbuf.m_putIdx = 0/**

* Returns the number of elements which are currently contained in the

* circular buffer.

*/#define CBUF_Len( cbuf ) ((typeof( cbuf.m_putIdx ))(( cbuf.m_putIdx ) - ( cbuf.m_getIdx )))/**

* Appends an element to the end of the circular buffer

*/#define CBUF_Push( cbuf, elem ) (cbuf.m_entry)[ cbuf.m_putIdx++ & (( cbuf##_SIZE ) - 1 )] = (elem)/**

* Retrieves an element from the beginning of the circular buffer

*/#define CBUF_Pop( cbuf ) (cbuf.m_entry)[ cbuf.m_getIdx++ & (( cbuf##_SIZE ) - 1 )]/**

* Retrieves the i‘th element from the beginning of the circular buffer

*/#define CBUF_Get( cbuf, idx ) (cbuf.m_entry)[( cbuf.m_getIdx + idx ) & (( cbuf##_SIZE ) - 1 )]/**

* Retrieves the i’th element from the end of the circular buffer

*/#define CBUF_GetEnd( cbuf, idx ) (cbuf.m_entry)[( cbuf.m_putIdx - idx - 1 ) & (( cbuf##_SIZE ) - 1 )]/**

* Determines if the circular buffer is empty

*/#define CBUF_IsEmpty( cbuf ) ( CBUF_Len( cbuf ) == 0 )/**

* Determines if the circular buffer is full.

*/#define CBUF_IsFull( cbuf ) ( CBUF_Len( cbuf ) == ( cbuf##_SIZE ))/**

* Determines if the circular buffer is currenly overflowed or underflowed.

*/#define CBUF_Error( cbuf ) ( CBUF_Len( cbuf ) 》 cbuf##_SIZE )#if defined( __cplusplus )template 《 class IndexType, unsigned Size, class EntryType 》

class CBUF

{public

CBUF()

{

m_getIdx = m_putIdx = 0;

}

IndexType Len() const { return m_putIdx - m_getIdx; }

bool IsEmpty() const { return Len() == 0; }

bool IsFull() const { return Len() == Size; }

bool Error() const { return Len() 》 Size; }

void Push( EntryType val )

{

m_entry[ m_putIdx++ & ( Size - 1 )] = val;

}

EntryType Pop()

{

return m_entry[ m_getIdx++ & ( Size - 1 )];

}

private:

volatile IndexType m_getIdx;

volatile IndexType m_putIdx;

EntryType m_entry[ Size ];

};

#endif // __cplusplus/* ---- Variable Externs ------------------------------------------------- *//* ---- Function Prototypes ---------------------------------------------- *//** @} */#endif // CBUF_H

現在一般我不喜歡以這種方式使用宏,但實現已被證明是快速、高效且工作相對良好的,這是很難爭論的。

循環緩沖區的設置非常簡單。首先,需要定義循環緩沖區的大小。這是通過定義宏 myQ_SIZE 來完成的,同時記住緩沖區大小需要是 2 的冪。

然后通過創建一個 myQ 類型的變量來聲明循環緩沖區。例如,如果 myQ_SIZE 定義為 64 字節,則可以定義 UART 的發送和接收緩沖區,如下面的圖 1 所示。

994a0046-11e5-11ec-8fb8-12bb97331649.png

圖 1 – 定義循環緩沖區

在此示例中,myQ 被定義為靜態以限制緩沖區的范圍并聲明為易失性,因為它們在中斷內被修改。定義循環緩沖區只是第一步。為了分配緩沖區,必須將這些變量傳遞給 CBUF_INIT 宏,如下圖 2 所示。

99790ca6-11e5-11ec-8fb8-12bb97331649.png圖 2 – 緩沖區初始化

除了這個初始設置之外,緩沖區相當簡單且易于使用。例如,可以使用 CBUF_PUSH 將通過串行接口接收 UART接收的字符推送到循環緩沖區,如圖 3 所示。

99a3eb4c-11e5-11ec-8fb8-12bb97331649.png

圖 3 – 推入緩沖區

開發人員不僅希望將數據推送到循環緩沖區上,還希望從緩沖區彈出或獲取數據。看到這一點的一個簡單示例是需要獲取字符并通過 UART 傳輸的串行發送器。圖 4 中可以看到一個示例傳輸函數。

99bd6ee6-11e5-11ec-8fb8-12bb97331649.png

圖 4 – 從緩沖區彈出數據

在健壯的應用程序中,還應檢查循環緩沖區長度和溢出狀態。CBUF 模塊確實提供了能夠檢查這些重要指標的宏。

要記住的一個重要問題是,如果需要對 CBUF 本身進行任何調試,這是不可能的。無法為宏設置斷點,因此如果出現問題,則需要對模塊進行功能化以逐步執行和調試。

多年來使用這個模塊雖然我沒有發現任何問題。循環緩沖區是在嵌入式系統中與串行設備通信的一個重要方面。

循環緩沖區也很好理解,應該創建它們以便它們可以模塊化并從一個應用程序到下一個應用程序重復使用。

到目前為止,CBUF 模塊已被證明是這樣一個模塊,所以在這里,我強烈推薦一下這個模塊。好了,今天的文章就到這里,我們下期再見。

責任編輯:haq

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

    關注

    7

    文章

    2716

    瀏覽量

    47543
  • 嵌入式
    +關注

    關注

    5086

    文章

    19140

    瀏覽量

    305879

原文標題:優雅地用宏實現環形緩沖區

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

收藏 人收藏

    評論

    相關推薦

    嵌入式工程師常用的開發工具有哪些?

    仿真器可以模擬復雜的微控制器和外設,幫助工程師早期階段進行軟件開發和調試。這大大縮短了開發周期,降低了開發成本。 總之,
    發表于 12-20 15:29

    AM6254開發常見問題之「燒寫問題排查」——飛凌嵌入式

    項目的開發過程中,各位工程師小伙伴們可能會遇到各種類型的問題,其中“燒寫問題”就是非常典型的一種。本篇文章,將以飛凌嵌入式OK6254-C開發
    的頭像 發表于 11-08 11:51 ?1125次閱讀
    AM6254<b class='flag-5'>開發</b>常見問題之「燒寫問題排查」——飛凌<b class='flag-5'>嵌入式</b>

    名單公布!【書籍評測活動NO.42】 嵌入式Hypervisor:架構、原理與應用

    ,以及PRTOS社區的愿景等內容。 作者簡介 孫陳偉 某大廠資深編譯器團隊編譯器開發工程師,曾任華為技術軟件公司高級軟件工程師,梅特勒-托利多儀器儀表(中國)有限公司
    發表于 08-23 15:17

    嵌入式QT常見開發方式有哪些?

    Unit): 對于資源極其有限的微控制器應用場景,Qt提供了專門針對MCU的解決方案,允許低功耗、小內存的嵌入式系統上開發圖形化界面。 總之,嵌入式
    發表于 08-12 10:05

    嵌入式軟件開發招聘

    本帖最后由 jf_19082533 于 2024-7-26 13:56 編輯 尋求:嵌入式軟件工程師 要求:3年以上開發經驗,音視頻領域應用層開發 地址:北京市昌平區 郵箱:10
    發表于 07-26 13:44

    找STM32硬件開發兼職工程師

    上海做傳感器的公司,找STM32硬件開發兼職工程師,會硬件開發,嵌入式軟件開發,可項目外包。有意聯系:15900460170
    發表于 06-22 19:12

    嵌入式硬件VS軟件,到底哪個更難?

    :挑戰與精密嵌入式硬件開發涉及到電路設計、電子元器件選型、PCB設計等諸多方面。在這個過程中,工程師需要具備扎實的電子知識和豐富的實踐經驗。硬件開發
    的頭像 發表于 06-13 08:10 ?1242次閱讀
    <b class='flag-5'>嵌入式</b>硬件VS<b class='flag-5'>軟件</b>,到底哪個更難?

    嵌入式軟件工程師如何提升自己?

    的發展打下堅實的基礎。 2.掌握專業技能 除了基礎知識外,嵌入式軟件工程師還需要掌握專業的技能。這包括熟練掌握嵌入式系統的開發工具、硬件平臺和軟件開
    發表于 06-12 11:20

    從事嵌入式方向,一定要軟硬件通吃?

    嵌入式系統開發領域,軟件和硬件的界限常常模糊不清。一個常見的問題是,嵌入式軟件工程師是否需要了
    的頭像 發表于 06-05 08:10 ?1215次閱讀
    從事<b class='flag-5'>嵌入式</b>方向,一定要軟硬件通吃?

    嵌入式軟件工程師和硬件工程師的區別?

    ,并且了解嵌入式系統的工作原理。此外,他們還需要具備良好的邏輯思維能力,能夠快速解決復雜的軟件問題。嵌入式軟件工程師
    發表于 05-16 11:00

    嵌入式工程師需要掌握哪些技術?

    嵌入式工程師需要掌握哪些技術? 嵌入式系統是當今科技領域中的重要組成部分,它們存在于我們生活的方方面面,從智能手機到汽車控制系統,從家電到醫療設備。因此,對于那些想要進入嵌入式行業的
    發表于 03-04 16:38

    嵌入式人工智能的就業方向有哪些?

    的發展方向有很多,門檻高低不一樣。下面給大家列舉一些相應崗位所需具備的技能: 一:嵌入式Linux,C語言開發工程師,Linux軟件開發工程師
    發表于 02-26 10:17

    優秀電源工程師需要哪些必備技能?

    /Verilog。嵌入式功能涵蓋了電壓電流采樣、通訊、濾波處理、PWM信號控制、閉環控制算法、軟件保護等多個方面。實際嵌入式程序開發過程中
    發表于 01-29 11:29

    嵌入式軟件開發軟件開發的區別

    嵌入式軟件開發軟件開發是兩個不同的概念,它們一些關鍵方面有著明顯的區別。嵌入式
    的頭像 發表于 01-22 15:27 ?2334次閱讀
    主站蜘蛛池模板: 古代荡女丫鬟高H辣文纯肉| 国产精品第一综合首页| 尹人综合网| 在线色av| 在线中文字幕亚洲日韩| 中国老妇xxxhd| 97人人添人人澡人人澡人人澡| 97在线视频免费观看97| 白丝女仆被强扒内裤| 国产精品99久久久久久AV色戒| 国产亚洲日韩另类在线播放| 精品免费视在线视频观看| 久久亚洲伊人| 欧美另类极品videosbest| 色婷婷综合激情中文在线| 亚洲国产成人精品无码区5566| 在线免费看a| yellow在线中文| 国产精品日韩欧美一区二区三区| 狠狠撸亚洲视频| 免费在线观看的毛片| 如懿传免费观看在线全集| 亚洲国产精品一区二区第一页| 1a级毛片免费观看| 大伊人青草狠狠久久| 回复术士人生重启在线观看| 麻豆国产原创中文AV网站| 三男强一女90分钟在线观看| 亚洲欧美日韩精品自拍| 99久久久A片无码国产精| 国产哺乳期奶水avav| 久久精品日本免费线| 情欲.美女高潮| 亚洲国产高清在线观看视频| 9277在线观看资源| 国产精品99久久久久久AV下载 | 日本电影小姐| 亚洲精品蜜夜内射| 99热这里只有精品88| 国产亚洲精品精品国产亚洲综合| 免费视频xxx|