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

    文章

    2849

    浏览量

    53436
  • 嵌入式
    +关注

    关注

    5209

    文章

    20656

    浏览量

    337024

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何成为一名高薪嵌入式工程师

    嵌入式,也可以轻松入门。 如果你已经明确好,想要从事嵌入式开发,想要成为一名高薪的嵌入式工程师,那下面这几点建议请好好看看: 一、夯实技术基础 ✅编程语言 C语言:
    发表于 04-09 09:03

    什么是BSP工程师

    上述前两个阶段属于BSP开发的内容,第三个阶段属于嵌入式应用软件开发过程。综上所述,BSP工程师主要应该具备的**要有: 掌握计算机原
    发表于 01-13 06:54

    什么是嵌入式应用开发

    。 · ‌医疗设备‌:如心电图仪、血压计等。 开发工具和技术 嵌入式开发过程中常用的工具包括: · ‌集成开发环境(IDE)‌:用于编写、编译和调试代码。 · ‌编译器‌:将高级语言代码转换为机器语言
    发表于 01-12 16:13

    系统嵌入式的学习路线

    ,供各位嵌入式初学者参考,希望对大家有所帮助。嵌入式工程师需要掌握的内容非常广泛,主要包括嵌入式软件
    发表于 12-16 07:49

    嵌入软件单元测试的全面研究与实践

    作为软件开发过程中最早进行的测试活动,能够有效隔离代码片段,验证其功能是否符合设计预期,从而在早期阶段发现潜在缺陷,提升代码质量。本文将系统探讨嵌入软件单元测试的标准流程、方法论、工具选择、
    的头像 发表于 12-01 14:31 856次阅读

    嵌入式就业形势好不好?

    职业生涯时,应优先考虑这些高端应用领域,以实现个人价值的最大化。 六、产品思维:嵌入式工程师的竞争优势 嵌入式工程师的最大优势在于其既懂硬件又懂
    发表于 11-10 11:48

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

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

    嵌入式软件测试与专业测试工具的必要性深度解析

    嵌入式系统作为控制、监视或辅助装置运行的专用计算机系统,其软件测试面临着独特的挑战和严格的要求。专业测试工具嵌入式软件开发过程中发挥着不可
    发表于 09-28 17:42

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

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

    招镶入工程师1个,硬件工程师一个,

    东莞市研生科技有限公司是一家蓝牙方案公司,主营蓝牙方案的设计开发,产品包括蓝牙BLE/4G透传/AI智能体方案开发,因公司发展需要需对外招聘嵌入式软件开发
    发表于 08-29 02:14

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

    人才的重要标准。这类职称评审会看重实操能力(如嵌入式系统优化、代码效率提升案例)和技术认证(如 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

    嵌入式软件开发常用的软件有哪些?

    的分布版本控制系统,可以有效,高速地处理很小到非常大的项目版本管理。主要解决多人合作开发过程中因频繁的版本迭代和代码修改导致的管理混乱问题。它允许开发者轻松地追踪和管理代码的变化,
    发表于 07-03 17:06

    嵌入式开发入门指南:从零开始学习嵌入式

    板、树莓派 5. 就业前景与发展方向嵌入式工程师通信、汽车电子、航空航天等领域需求旺盛,具备良好发展前景。
    发表于 05-15 09:29