EKS开源系列之XF_UTILS工具库

news/2024/9/20 4:01:33/ 标签: 开源, 嵌入式, 中间件, c语言, stm32, esp32, 移植

EKS开源系列之XF_UTILS工具库

  • 为啥要写这个中间件
  • 这个中间件的特色
  • xf_utils 有那些功能
  • 文件夹结构
  • xf_utils API 有哪些
    • xf_check
    • xf_lock
    • xf_std
    • xf_utils_log
    • xf_common
      • xf_attribute
      • xf_bit_defs
      • xf_err
      • xf_list
      • xf_predef
      • xf_version
  • 开源链接
  • 移植教程

为啥要写这个中间件

当我们开发软件中间件的时候,由于不想要依赖任何库。那么无论是malloc还是log。我们都希望不依赖任何的sdk。也就是说,这些东西都是可以通过宏进行替换的。在写了很多代码后,大致总结了写中间件的时候常用的功能,构成了这个中间件

这个中间件的特色

这个中间件主要是为了隔离底层的依赖而创立的。所以这个组件里面的东西基本上都能通过宏进行替换。当然如果不去动它,它则会调用标准库的方式实现。当你的sdk对标准库支持不好的时候。比如 stm32 的 printf 就没法直接使用。我们就可以通过配置文件对其底层实现进行替换。

xf_utils 有那些功能

  1. 错误码:很多场景我们需要返回这个操作有没有操作成功,当失败的时候有很多失败的原因。xf_err.h中我们收集了常用的错误,并通过枚举类型变成错误码。而且错误码对应的错误内容,也可以通过xf_err_to_name.c中的函数,实现错误码转换成字符串,以便后续打印。
  2. 位操作:很多场景需要执行一些位操作。无论是使用某个位作为flag,还是说获取某个位进行操作都比较常用。但是一些与或非加上左移右移的操作。不仅一不留神容易搞错优先级的问题,可读性还不高。所以我们在xf_bit_def.h中总结了常用的位操作宏,方便使用。
  3. 链表:在写一些中间件的时候,往往链表功能。xf_list.h参考了linux内核中的list.h。修改了其需要gnu特性的地方,让其在c99的环境下仍然可以使用。
  4. attribute功能:attribute相关的内容虽然不是c99的内容。但是往往我们需要使用。比如,stm32中__weak。我们在xf_attr.h中总结了常用属性
  5. 常用宏:有些常用宏,例如:offestof、container_of、unused等功能,被放到了xf_predef.h中。

以上功能都是在xf_common文件夹中。除此之外还有:

  1. log功能:xf_utils_log 支持不同级别的log,可以通过宏设置屏蔽等级。也支持打印数组功能。底层默认对接printf
  2. lock功能:xf_lcok是防止出现竞争。竞争常常出现在中断和主函数之间公用了全局变量。或者多线程之间函数不可重入。往往这种情况需要lock功能防止出现竞争
  3. std功能:对于一些常用的标准库功能,该头文件提供了一层宏。以便于后续替换。
  4. check功能:函数对传入参数的判断(断言),可以通过宏屏蔽

文件夹结构

.
├── examples                    # xf_utils linux 使用例程
├── port                        # xf_utils linux 移植部分(主要是 lock)
├── src                         # xf_utils 仓库源码部分
│   ├── xf_check                # xf_check 断言检查库
│   │   ├── xf_check_config.h   # xf_check 配置文件,每个配置都有注释和默认配置
│   │   └── xf_check.h          # xf_check 断言检查相关宏
│   ├── xf_common               # xf_common 通用库(比较杂想不到取啥名字好)
│   │   ├── xf_attr.h           # 常用的属性宏
│   │   ├── xf_bit_defs.h       # 位操作相关宏
│   │   ├── xf_common_config.h  # xf_common 配置文件,每个配置都有注释和默认配置
│   │   ├── xf_common.h         # 收集了其它的头文件,包含在 xf_common.h 内
│   │   ├── xf_err.h            # 定义了通用的错误码
│   │   ├── xf_err_to_name.c    # 实现了错误码转换字符串功能(方便打印调试)
│   │   ├── xf_list.h           # 通用双向链表库
│   │   ├── xf_predef.h         # 定义了简单实用的宏
│   │   └── xf_version.h        # 定义了版本,以及数字/字符串版本号宏
│   ├── xf_lock                 # 定义了锁,防止出现竞争
│   ├── xf_std                  # 标准库宏定义,用于随时替换标准库实现
│   ├── xf_utils_log            # log库,对接printf,实现等级打印和串口打印
│   ├── xf_utils.h              # 统一对外调用的头文件
│   ├── xf_utils_internal_config.h # 内部配置头文件
│   └── xf_utils_port.h         # 对接lock的头文件
├── README.md
└── xmake.lua

xf_utils API 有哪些

xf_check

xf_lock

xf_std

xf_utils_log

xf_common

xf_attribute

xf_bit_defs

xf_err

xf_list

xf_predef

xf_version

开源链接

github: https://github.com/x-eks-fusion/xf_utils
gitee: https://gitee.com/x-eks-fusion/xf_utils

移植教程

xf_utils介绍视频

xf_utils stm32移植

xf_utils esp32移植


http://www.ppmy.cn/news/1514650.html

相关文章

Windows Microsoft Edge 浏览器 配置【密码】

在浏览 Web 时,Microsoft Edge 可以轻松保存密码。 在桌面或移动设备上的 Edge 浏览器中输入新密码时,Microsoft Edge 会询问你是否要记住用户名和密码。 下次访问该网站时,浏览器将完成帐户信息的填写。 如果使用 Microsoft 帐户登录到 Edg…

嵌入式八股-C++面试35题(20240820)

1. C基础与语言特性 1.1 构造函数是否能声明为虚函数?为什么?什么情况下为错误? 回答: 构造函数不能声明为虚函数。构造函数用于初始化对象,而虚函数机制依赖于对象的虚函数表(vtable)。在构造…

Linux实现SSH免密登录

环境准备: 192.168.58.148 客户端192.168.58.150 服务端 功能实现: 第一步在150机器上生成公钥:(默认就好) [rootnginx1 ~]# ssh-keygen -t rsa -b 4096 Generating public/private rsa key pair. Enter file in w…

找在两个汉字中间的句号,如何写正则表达式?

要在两个汉字之间找到句号&#xff0c;可以使用以下正则表达式&#xff1a; (?<[\u4e00-\u9fff])。(?[\u4e00-\u9fff])解释&#xff1a; (?<[\u4e00-\u9fff]) 表示前面的字符是汉字。。 表示句号。(?[\u4e00-\u9fff]) 表示后面的字符是汉字。 这个正则表达式将匹配…

正则表达式和通配符

1、前言 最近因经常需对基因组注释文件gff3的基因id替换或更改&#xff0c;需要用到正则表达式。资料里面都提到&#xff1a;*匹配前面的子表达式0次或任意多次。我当时就纳闷&#xff0c;*到底是表示的是匹配的次数还是可以匹配任意字符呀&#xff1f;因为印象中&#xff0c;*…

【学习笔记】8、脉冲波形的变换与产生

本章简略记录。 8.1 单稳态触发器&#xff08;脉冲触发&#xff09; 单稳态触发器 应用于 &#xff1a;&#xff08;1&#xff09;脉冲整型&#xff08;2&#xff09;脉冲延时 &#xff08;3&#xff09;定时 单稳态触发器的工作特性&#xff1a; 没有触发脉冲作用时&#xf…

【数学建模备赛】Ep06:多元线性回归分析

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、多元线性回归分析&#xff1a;☀️☀️☀️1. 回归分析的介绍和分类1.1相关性1.2 相关性≠因果性1.3 因变量Y1.4 自变量X 2. 回归分析的三条使命3. 数据的分类以及数据的来源3.1 三种数据类型3.2 三种数据类型的建…

Arduino开源四足蜘蛛机器人制作教程

视频教程&#xff1a;手把手叫你做四足蜘蛛机器人——1零件介绍_哔哩哔哩_bilibili 一、项目介绍 1.1 项目介绍 Arduino主控&#xff0c;图形化编程&#xff0c;趣味学习 Arduino nano开发板舵机扩展底板 4.8V可充电电池&#xff0c;支持Arduino C语言编程和米思齐图形化编程…

如何发布自己的NPM包详细步骤

前言 在前端开发中&#xff0c;将自己编写的 Vue 组件或插件打包并发布到 NPM 上&#xff0c;不仅可以方便自己在其他项目中复用&#xff0c;还能分享给更多的开发者使用。本文将从 NPM 注册、登录与发布流程&#xff0c;及如何通过 Vue CLI 打包插件的角度详细介绍如何发布 V…

【编程之路:在 Bug 的迷宫中寻找出口】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Vue的生命周期了解

目录 1.何为Vue的生命周期 2.Vue2生命周期阶段 &#xff08;1&#xff09;beforeCreate(创建前) &#xff08;2&#xff09;created(创建后) &#xff08;3&#xff09;beforeMount(挂载前) &#xff08;4&#xff09;mounted(挂载后) &#xff08;5&#xff09;beforeU…

【git】 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED “WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!”&#xff0c;这表明你尝试连接的服务器的 SSH 主机密钥已经发生了变化。这通常发生在服务器重新安装、SSH 服务更换密钥或者服务器 IP 地址被重新分配给另一台服务器的…

safari扩展程序开发

文章目录 safari_web_extensions开发扩展扩展有3个主要部分&#xff1a;使用 WebExtension APIruntime local debugSafari中允许运行 未签名的扩展install extensionupdate extension publish safari的extension文档不是很好&#xff0c;建议参考mozilla文档 https://developer…

mysql 四 索引总结(重点)

索引概述 索引是提高查询数据的数据结构 2、索引的结构&#xff1a; Btree Hash 3、索引分类 主索引&#xff0c;唯一索引&#xff0c;常规索引&#xff0c;全文索引&#xff0c;空间索引。 聚集索引&#xff0c;二级索引/辅助索引 4、sql性能分析 --查看操作频率 show …

【网络编程】第十章 网络层-IP(分片组装+网段+路由+NAT)

文章目录 重点概念IP协议4位首部长度8位生存时间&#xff08;TTL&#xff09;分片MTU-最大传输单元分片过程 组装 网段网段划分子网掩码 特殊IPloopback 环回解决IP地址不足问题 私有 IP访问广域网和返回的步骤NATNAPT-网络地址端口转换表NAT技术的缺陷NAT和代理服务器正向代理…

ElementPlus下拉框输入框对齐问题

1.问题 2.解决方法 2.1label-width 说明&#xff1a;el-form中label-width设置为auto 2.2 label-wdith固定值 说明&#xff1a;如果在el-form-item里面设置了label-width"100px"&#xff1b;采用宫格布局。 .demo-one{display: grid;grid-template-columns: repe…

基于FPGA的ASIC prototype验证

在当今快速发展的电子设计自动化&#xff08;EDA&#xff09;领域&#xff0c;专用集成电路&#xff08;ASIC&#xff09;的开发因其高性能、低功耗和定制化的特点而备受青睐。然而&#xff0c;ASIC的设计和制造过程不仅成本高昂&#xff0c;而且周期漫长&#xff0c;一旦进入生…

嵌入式和单片机有什么区别?

目录 &#xff08;1&#xff09;什么是嵌入式&#xff1f; &#xff08;2&#xff09;什么是单片机&#xff1f; &#xff08;3&#xff09;嵌入式和单片机的共同点 &#xff08;4&#xff09;嵌入式和单片机的区别 &#xff08;1&#xff09;什么是嵌入式&#xff1f; 关…

k8s学习(三十八) 使用OpenTelemetry+jaeger实现链路追踪

文章目录 前言一、安装jaeger二、安装cert-manager三、安装OpenTelemetry Operator四、配置 OpenTelemetry Collector五、配置 Instrumentation六、编写java示例程序并测试调用链跟踪 前言 OpenTelemetry 可以用于从应用程序收集数据。它是一组工具、API 和 SDK 集合&#xff…

ARM——驱动——inmod加载内核模块

在上一篇文章的代码上添加出错处理 #include <linux/init.h> // 包含初始化宏和函数 #include <linux/kernel.h> // 包含内核函数和变量 #include <linux/fs.h> // 包含文件操作的结构和函数 #include <linux/kdev_t.h> /…