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

    文章

    2822

    浏览量

    52794
  • 嵌入式
    +关注

    关注

    5186

    文章

    20144

    浏览量

    328708

原文标题:优雅地用宏实现环形缓冲区

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    为什么嵌入式驱动开发工程师可以拿高薪

    嵌入式驱动开发工程师能拿到高薪,核心在于这个岗位刚好踩中了行业刚需、技术壁垒高、人才缺口大这三个关键节点,而且这种需求还在随着智能硬件的普及持续扩大。首先得明确,
    的头像 发表于 10-30 16:37 448次阅读
    为什么<b class='flag-5'>嵌入式</b>驱动<b class='flag-5'>开发</b><b class='flag-5'>工程师</b>可以拿高薪

    硬件工程师嵌入式软件哪个更有前途?

    不少人琢磨硬件工程师嵌入式软件到底哪个更有前途,其实从实际职场情况和成长路子看,差别还挺清楚的。先说说天花板这事,一般来讲,硬件工程师的职业天花板还真比
    的头像 发表于 09-10 10:43 777次阅读

    电子发烧友工程师看!电子领域评职称,技术之路更扎实

    人才的重要标准。这类职称评审会看重实操能力(如嵌入式系统优化、代码效率提升案例)和技术认证(如 ARM 相关认证)。有位开发者提到,曾因缺少职称,大厂面试败给经验相当的对手;评上
    发表于 08-20 13:53

    嵌入式工程师为什么要学QT?

    Qt对嵌入式工程师来说,真的很重要吗? Qt是一个跨平台的C++应用程序开发框架,非常适合嵌入式系统的开发,Qt
    发表于 08-14 15:15

    嵌入式工程师的进阶之路

    嵌入式工程师的进阶之路 (一)初级工程师(0-3 年)核心技能: 单片机开发:STM32F103系列 GPIO/USART/SPI 外设驱动,能完成 LED 呼吸灯、按键检测、串口通
    发表于 08-13 11:08

    如何成为一名嵌入式软件工程师

    、Java等)和软件开发工具,还需要对硬件的工作原理有深入的理解。 团队嵌入式软件工程师往往扮演着核心角色,他们的工作直接关系到产品的
    发表于 04-15 14:37

    嵌入式系统开发圣经【干货】

    内容包括:嵌入式系统的介绍、嵌入式SoC硬件系统概论、嵌入式系统软件开发。适用于产品主管、系统设计分析人员及欲进入该领域的工程师。本资料详细
    发表于 03-12 13:58

    嵌入式软件工程师就业好不好?

    ,市场需求大,所以其薪资待遇普遍较高。一般来说,北京、上海、深圳等发达地区,嵌入式软件工程师的薪资水平会更高。并且,随着技术水平的提高和经验的积累,薪资待遇还会不断提升。 行业发展潜力巨大 从长远来看
    发表于 02-20 10:19

    如何成为嵌入式开发工程师

    如何成为嵌入式开发工程师? 成为嵌入式开发工程师通常需要掌握一系列技能和知识,并且在实践不断积累经验。以下是一些基本步骤和建议: 1. 基
    发表于 02-19 10:39

    月薪 3 万的嵌入式工程师都在用,串口屏到底神在哪?

    作为一名资深的嵌入式工程师,我深知选择硬件组件时,性能、可靠性、易用性和成本效益都是至关重要的考量因素。月薪3万的嵌入式
    的头像 发表于 02-12 10:33 951次阅读
    月薪 3 万的<b class='flag-5'>嵌入式</b><b class='flag-5'>工程师</b>都在用,串口屏到底神在哪?

    一个优秀的嵌入式软件“架构” — AWFlow

    大型项目的软件开发过程中,模块化开发面临着接口设计不合理、代码冲突以及模块间不兼容等问题,导致团队协作效率低下。为了解决这些问题,嵌入式软件
    的头像 发表于 02-10 16:44 770次阅读
    一个优秀的<b class='flag-5'>嵌入式</b><b class='flag-5'>软件</b>“架构<b class='flag-5'>师</b>” — AWFlow

    如何在日常开发过程中提高代码质量

    。 提高代码质量是一个系统工程,本文主要介绍开发人员如何在日常开发过程中提高代码质量。 01 什么是代码质量? 代码质量一般用于衡量代码的“好”和“烂”:“好”代码表示代码质量高,“烂”代码表示代码质量低。虽然目前
    的头像 发表于 01-23 09:09 1024次阅读
    如何在<b class='flag-5'>日常开发过程中</b>提高代码质量

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

    随着智能硬件、物联网、智能汽车、自动化控制等领域的迅速发展,嵌入式工程师的需求也水涨船高。尤其是全球化和技术加速的时代,嵌入式开发不仅是一个热门行业,还是跨学科技术与创新的交汇点。对
    的头像 发表于 01-16 10:59 2028次阅读
    年薪30万的<b class='flag-5'>嵌入式</b><b class='flag-5'>工程师</b>,究竟需要掌握哪些技能?

    为什么嵌入式驱动开发工程师可以拿高薪?

    。 为什么嵌入式驱动开发工程师可以拿高薪? 嵌入式驱动开发工程师属于技术密集型工作,不仅需要
    发表于 01-07 16:56

    嵌入式工程师常用的开发工具有哪些?

    仿真器可以模拟复杂的微控制器和外设,帮助工程师早期阶段进行软件开发和调试。这大大缩短了开发周期,降低了开发成本。 总之,
    发表于 12-20 15:29