前言

最近换工作,新公司中目前嵌入式方向的需求还未定型,目前来说就是任何嵌入式方向都会有需求。以前工作用的一些轮子不太适合当下的环境,所以这段时间重新造了一些轮子。

目前来说我对于轮子的需求主要有下面几点:

  • 可以在主流的各类处理器平台上使用;
  • 不管是裸机、RTOS、还是Windows、Linux等平台上都可以使用;
  • 没有任何外部依赖;
  • 对于简单的组件,可以单独拿出来独立使用;
  • 基于这些组件开发的项目耦合度也尽量小;

基于上面的一些需求,设计了纯C开发的工具库 nx-c-util ,适用于裸机及操作系统环境,无任何依赖。

项目地址:https://github.com/NaisuXu/nx-c-util

目前设计上最核心设计点如下:

  • 分级静态内存池(提供无碎片的alloc/free功能);
  • 适用于任何数据类型的队列;
  • 一个基于引用计数的消息组件;
    • 这个是基于上面两个的,是这个库的核心组件;
    • 目前实际项目中各个业务间通讯主要就是基于这个组件的,靠消息来驱动业务,而不是通过函数调用;

目前整个库还在不停迭代中,不过核心的组件应该不会特别大的改动了,更多的是扩展各种独立功能件、中间件、设备驱动等。目前已经在多个项目中使用,开发效率整体还是非常不错的。

更多内容可以直接看项目,或者参考下面介绍。

nx-c-util

简介

一个用纯 C 实现的工具库,为嵌入式开发提供简单、便捷的基础构件。

每个组件都遵循同样的设计理念:

  • 纯静态 —— 所有存储都由调用者提供;库不使用任何动态内存,也不依赖
    malloc/free,适用于无堆的目标平台。
  • 确定性 —— 操作可预测、恒定耗时、无隐藏开销,非常适合实时系统。
  • 可移植 —— 标准 C11,无平台相关依赖;在 Windows、Linux、macOS 上都能构建
    和运行。

目录结构

nx-c-util/
├── src/
│   ├── core/         # 核心构件(list, queue, ringbuf, timer, coro, ref_msg, mem_pool, lock)
│   ├── middleware/   # 协议解析器和协议栈(modbus_rtu, modbus_rtu_slave, can_bus,未来:can_isotp)
│   ├── algo/         # 算法(crc, sha256)
│   └── device/       # 平台无关的设备驱动(ws2812)
└── examples/
    ├── core/         # 核心模块使用示例
    ├── middleware/   # 中间件模块使用示例
    ├── algo/         # 算法模块使用示例
    └── device/       # 设备驱动使用示例

每个模块都设计为可独立使用。在你的项目中集成时,只需拷贝所需的 .c.h
文件即可。头文件使用单层 include(如 #include "nx_list.h")无子目录前缀,
因此把拷贝文件所在的目录加入你的 include 路径即可。

模块

核心模块

  • nx_list — 侵入式双向循环链表
  • nx_queue — 通用环形缓冲(FIFO)队列
  • nx_ringbuf — 面向字节的环形缓冲
  • nx_tiered_mem_pool — 分级静态内存池
  • nx_ref_msg — 引用计数的零拷贝消息
  • nx_timer — 软件定时器管理器
  • nx_coro — 无栈协程
  • nx_lock — 可插拔的临界区抽象

中间件模块

  • nx_can_bus — CAN / CAN FD 帧结构与辅助函数
  • nx_modbus_rtu — Modbus RTU 帧结构与 CRC
  • nx_modbus_rtu_slave — 事件驱动的 RTU 从站:帧 → 订阅分发

算法模块

  • nx_crc — CRC-8 / CRC-16 / CRC-32 校验
  • nx_sha256 — SHA-256 密码学哈希

设备模块

  • nx_ws2812 — WS2812/WS2812B RGB LED 灯带驱动

使用

库的源码在 src/ 下按类别组织(src/core/src/middleware/src/algo/
src/device/),可以直接拖进你的项目 —— 大多数模块除了标准 C 外没有依赖,可以独立
使用。头文件使用单层 include(如 #include "nx_list.h"),因此把拷贝文件所在的
目录加入你的 include 路径即可。

examples/core/examples/middleware/examples/algo/examples/device/ 目录
包含每个模块可运行的用法示例,通过 CMake 驱动,因此在任何平台上都以相同方式构建。

构建并运行示例

在仓库根目录下:

cmake -S . -B build
cmake --build build

然后运行生成的可执行文件:

  • Linux / macOS

    ./build/nx_core_examples        # 核心模块(list, queue, ringbuf, mem_pool, ref_msg, timer, coro)
    ./build/nx_middleware_examples  # 中间件模块(modbus_rtu_slave)
    ./build/nx_algo_examples        # 算法模块(crc, sha256)
    ./build/nx_device_examples      # 设备驱动(ws2812)
    
  • Windows (MinGW / MSYS)

    ./build/nx_core_examples.exe
    ./build/nx_middleware_examples.exe
    ./build/nx_algo_examples.exe
    ./build/nx_device_examples.exe
    
  • Windows (Visual Studio / MSVC) —— 多配置生成器会把二进制放在按配置划分的子目录中:

    ./build/Debug/nx_core_examples.exe
    ./build/Debug/nx_middleware_examples.exe
    ./build/Debug/nx_algo_examples.exe
    ./build/Debug/nx_device_examples.exe
    

选择生成器

cmake -S . -B build 使用你平台的默认生成器,多数情况下已经够用。要显式指定一个,
传入 -G

# Windows, MinGW toolchain
cmake -S . -B build -G "MinGW Makefiles"

# Windows, Visual Studio 2022
cmake -S . -B build -G "Visual Studio 17 2022"

# Linux / macOS, Unix Makefiles
cmake -S . -B build -G "Unix Makefiles"

# Any platform with Ninja installed
cmake -S . -B build -G "Ninja"

需要 CMake 3.10 或更新版本,以及一个支持 C11 的编译器(GCC、Clang 或 MSVC)。

许可证

本项目采用 MIT 许可证,详见 LICENSE 文件。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐