那曲檬骨新材料有限公司

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

    文章

    2735

    瀏覽量

    47750
  • 嵌入式
    +關注

    關注

    5092

    文章

    19177

    瀏覽量

    307680

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

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

收藏 人收藏

    評論

    相關推薦

    如何在日常開發過程中提高代碼質量

    。 提高代碼質量是一個系統工程,本文主要介紹開發人員如何在日常開發過程中提高代碼質量。 01 什么是代碼質量? 代碼質量一般用于衡量代碼的“好”和“爛”:“好”代碼表示代碼質量高,“爛”代碼表示代碼質量低。雖然目前
    的頭像 發表于 01-23 09:09 ?89次閱讀
    如何在<b class='flag-5'>日常開發過程中</b>提高代碼質量

    年薪30萬的嵌入式工程師,究竟需要掌握哪些技能?

    隨著智能硬件、物聯網、智能汽車、自動化控制等領域的迅速發展,嵌入式工程師的需求也水漲船高。尤其是全球化和技術加速的時代,嵌入式開發不僅是一個熱門行業,還是跨學科技術與創新的交匯點。對
    的頭像 發表于 01-16 10:59 ?377次閱讀
    年薪30萬的<b class='flag-5'>嵌入式</b><b class='flag-5'>工程師</b>,究竟需要掌握哪些技能?

    為什么嵌入式驅動開發工程師可以拿高薪?

    。 為什么嵌入式驅動開發工程師可以拿高薪? 嵌入式驅動開發工程師屬于技術密集型工作,不僅需要
    發表于 01-07 16:56

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

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

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

    項目的開發過程中,各位工程師小伙伴們可能會遇到各種類型的問題,其中“燒寫問題”就是非常典型的一種。本篇文章,將以飛凌嵌入式OK6254-C開發
    的頭像 發表于 11-08 11:51 ?1164次閱讀
    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

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

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

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

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

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

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

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

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

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

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

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

    的發展方向有很多,門檻高低不一樣。下面給大家列舉一些相應崗位所需具備的技能: 一:嵌入式Linux,C語言開發工程師,Linux軟件開發工程師
    發表于 02-26 10:17
    揭西县| 金宝博滚球| 百家乐高手论坮| 新葡京| 赌片百家乐官网的玩法技巧和规则| 百家乐娱乐城提款| 玩百家乐官网高手支招篇| 网络棋牌室| 尊龙百家乐娱乐网| 中骏百家乐官网的玩法技巧和规则 | 百家乐赌场现金网平台排名| 黄山市| 顶级赌场 官方直营网络赌场| 百家乐高科技出千工具| 网络百家乐官网开户网 | 大发888官方hgx2dafa888gwd | 网上玩百家乐官网游戏有人挣到钱了吗| 象棋赌博网| 大发888娱乐场下载yguard| 百家乐l路单| 玄空飞星 24山 何??| 广东百家乐官网桌布| 百家乐官网下注的规律| 帝豪娱乐城| 大发888 方管下载| 哪家百家乐从哪而来| 百家乐详情| 百家乐中庄闲比例| 24山向吉凶详解| 洪江市| 网上百家乐官网网址| 博九网| 八大胜博彩| 盛世国际娱乐城| 最新娱乐城送彩金| 大发888最新信息| 澳门百家乐游戏官网| 飞天百家乐的玩法技巧和规则| 百家乐怎么看大小| 百家乐哪里可以玩| 百家乐道具扫描|