个人嵌入式开发库 - 提供轻量级、高性能的嵌入式系统基础组件
fc_embed 是一个面向 ARM Cortex-M 系列微控制器的嵌入式基础库,提供了一系列高性能、可配置的核心组件,帮助开发者快速构建嵌入式应用。
- 🚀 高性能:关键组件如 FIFO 采用无锁设计,内存池提供 O(1) 分配
- 🔧 模块化:组件独立可选,按需集成
- 💾 内存高效:精细的内存管理,适合资源受限的嵌入式环境
- 🎯 易于移植:支持 Keil、IAR、GCC 等主流编译器
- 📦 CMSIS-Pack 支持:支持通过 Keil 包管理器安装
fc_embed 核心组件
├── Common 编译器抽象、辅助宏、配置管理
├── Auto_Init 可选的自动初始化框架(4级优先级)
├── FIFO 无锁环形缓冲区(单生产者/单消费者)
├── Memory_Pool O(1)固定大小内存池管理器
├── Port 多缓冲区 I/O 抽象层(类 SEGGER RTT)
├── Transport 多路复用传输层(ANSI 转义序列)
├── StdIO 简化的标准 I/O(printf 家族)
└── Logger 多级日志系统(带颜色、RTT 支持)
Common (基础)
├─> FIFO (头文件)
├─> Memory_Pool
└─> StdIO
FIFO → Port (多缓冲区 I/O)
Port + FIFO → Transport (多路复用)
Memory_Pool + StdIO → Logger (日志系统)
Auto_Init (可选,提供自动初始化)
- 从 Releases 下载最新的
.pack文件 - 在 Keil MDK 中导入:
Pack Installer→Import→ 选择.pack文件 - 在项目中选择需要的组件:
Manage Run-Time Environment→fc_embed
git clone https://github.com/fool-cat/fc_embed.git
cd fc_embed
git checkout develop # 或 CMSIS-Pack 分支将 core/ 目录下的文件添加到你的项目中。
复制配置模板并根据需求修改:
// 基于 core/fc_config_template.h 创建 fc_config.h
#define FC_LOG_ENABLE 1
#define FC_LOG_LEVEL FC_LOG_ALL
#define USE_FC_AUTO_INIT 1 // 启用自动初始化#include "fc_fifo.h"
// 定义 FIFO
fc_fifo_t fifo;
uint8_t buffer[256];
// 初始化
fc_fifo_init(&fifo, buffer, sizeof(buffer));
// 写入数据
uint8_t data[] = "Hello";
fc_fifo_write(&fifo, data, sizeof(data));
// 读取数据
uint8_t recv[10];
size_t len = fc_fifo_read(&fifo, recv, sizeof(recv));特性:
- 无锁设计(单生产者/单消费者)
- 基于 Linux kfifo 实现
- 支持批量读写、零拷贝操作
#include "fc_pool.h"
// 定义内存池
fc_pool_t pool;
uint8_t pool_mem[1024];
// 初始化(每块 64 字节)
fc_pool_init(&pool, pool_mem, sizeof(pool_mem), 64);
// 分配内存
void *ptr = fc_pool_alloc(&pool);
// 释放内存
fc_pool_free(&pool, ptr);特性:
- O(1) 时间复杂度
- 固定大小块分配
- 支持内存链式扩展
#include "fc_log.h"
// 初始化日志(使用自动初始化时无需手动调用)
fc_log_pool_init();
// 使用日志
FC_LOG_I("系统启动");
FC_LOG_W("警告:温度过高 %d°C", temp);
FC_LOG_E("错误:传感器无响应");特性:
- 多级日志(ERROR/WARN/INFO/DEBUG/VERBOSE)
- 支持颜色输出
- 集成 SEGGER RTT 支持
#include "fc_port.h"
// 默认端口已自动初始化(使用自动初始化时)
// 或手动初始化
fc_default_port_init();
// 重定向 printf 到端口
printf("输出到调试端口\n");
// 或直接使用端口 API
fc_port_printf(&fc_stdout, "格式化输出: %d\n", value);#include "fc_auto_init.h"
// 定义初始化函数
void my_device_init(void) {
// 设备初始化代码
}
// 注册到自动初始化(DEVICE 阶段,优先级 100)
INIT_EXPORT_DEVICE(my_device_init, 100);
// 在 main 中调用初始化
int main(void) {
fc_section_init_env(); // 环境初始化(main 之前)
fc_section_init_clock(); // 时钟初始化
fc_section_init_device(); // 设备初始化
fc_section_init_app(); // 应用初始化
while(1) {
// 主循环
}
}基于 Linux kfifo 的无锁环形队列实现,适用于单生产者/单消费者场景。
主要 API:
fc_fifo_init()- 初始化fc_fifo_write()/fc_fifo_read()- 批量读写fc_fifo_write_byte()/fc_fifo_read_byte()- 单字节读写fc_fifo_peek()- 查看但不取出fc_fifo_get_write_region()- 零拷贝写入
O(1) 复杂度的固定大小内存池,支持链式内存块扩展。
主要 API:
fc_pool_init()- 初始化fc_pool_alloc()- 分配内存块fc_pool_free()- 释放内存块fc_pool_chain()- 链接多个内存池
类似 SEGGER RTT 的多缓冲区 I/O 抽象,支持标准 I/O 重定向。
主要 API:
fc_port_printf()- 格式化输出fc_port_write()/fc_port_read()- 原始读写- 标准 I/O 重定向支持(printf/scanf)
基于内存池的轻量级日志系统,支持多级过滤和颜色输出。
日志级别:
FC_LOG_E() // ERROR - 错误
FC_LOG_W() // WARN - 警告
FC_LOG_I() // INFO - 信息
FC_LOG_D() // DEBUG - 调试
FC_LOG_V() // VERBOSE - 详细使用 ANSI 转义序列实现的多路复用传输层,可在单个物理通道上传输多个逻辑通道。
4 级优先级的自动初始化框架:
- ENV - 环境层(main 之前/构造函数)
- CLOCK - 时钟配置
- DEVICE - 设备初始化
- APP - 应用初始化
- ✅ ARM Compiler 5/6 (Keil MDK)
- ✅ IAR EWARM
- ✅ GCC (ARM Embedded)
- ✅ MSVC (Windows 测试)
所有配置项在 fc_config.h 中定义(基于 fc_config_template.h 创建),主要配置包括:
// 自动初始化
#define USE_FC_AUTO_INIT 1
// 日志配置
#define FC_LOG_ENABLE 1
#define FC_LOG_LEVEL FC_LOG_ALL
#define FC_LOG_COLOR_ENABLE 1
// 内存池配置
#define FC_LOG_POOL_TOTAL_SIZE (4 * 1024)
#define FC_LOG_ALLOC_BLOCK_SIZE 128
// Port 配置
#define FC_PORT_NUM 8
#define FC_PORT0_SIZE 1024项目提供了多个测试示例,位于 test/ 目录:
test_ring_fifo.cpp- FIFO 环形队列测试test_stdio.cpp- StdIO 测试test_transport.cpp- Transport 传输层测试test_auto_init.cpp- 自动初始化测试STM32F407VET_keil/- STM32 完整工程示例VS2022/- Windows 平台测试工程
欢迎提交 Issue 和 Pull Request!
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 提交 Pull Request
本项目采用 MIT 许可证 - 详见 LICENSE 文件
- 线程安全:大部分组件不提供内置锁机制,需由使用者保证线程安全
- FIFO 限制:仅支持单生产者/单消费者场景
- 配置优先:使用前需根据实际需求创建
fc_config.h(基于fc_config_template.h) - 内存对齐:内存池要求内存按
sizeof(size_t)对齐
- 核心组件实现
- CMSIS-Pack 支持
- GitHub Actions CI/CD
- 更多平台移植示例
- 上位机工具(Transport 解析)
- 完整的 API 文档
- 性能基准测试
⭐ 如果这个项目对你有帮助,请给个 Star 支持一下!