|
1 | | -# 暂时使用AI生成,仅供参考 |
2 | | - |
3 | | - |
4 | | - |
5 | | - |
6 | | - |
7 | | - |
8 | | -# fc_embed |
9 | | - |
10 | | -> 个人嵌入式开发库 - 提供轻量级、高性能的嵌入式系统基础组件 |
11 | | -
|
12 | | - |
13 | | - |
14 | | - |
15 | | - |
16 | | -## 📖 简介 |
17 | | - |
18 | | -`fc_embed` 是一个面向 ARM Cortex-M 系列微控制器的嵌入式基础库,提供了一系列高性能、可配置的核心组件,帮助开发者快速构建嵌入式应用。 |
19 | | - |
20 | | -### 核心特性 |
21 | | - |
22 | | -- 🚀 **高性能**:关键组件如 FIFO 采用无锁设计,内存池提供 O(1) 分配 |
23 | | -- 🔧 **模块化**:组件独立可选,按需集成 |
24 | | -- 💾 **内存高效**:精细的内存管理,适合资源受限的嵌入式环境 |
25 | | -- 🎯 **易于移植**:支持 Keil、IAR、GCC 等主流编译器 |
26 | | -- 📦 **CMSIS-Pack 支持**:支持通过 Keil 包管理器安装 |
27 | | - |
28 | | -## 🧩 组件架构 |
29 | | - |
30 | | -``` |
31 | | -fc_embed 核心组件 |
32 | | -├── Common 编译器抽象、辅助宏、配置管理 |
33 | | -├── Auto_Init 可选的自动初始化框架(4级优先级) |
34 | | -├── FIFO 无锁环形缓冲区(单生产者/单消费者) |
35 | | -├── Memory_Pool O(1)固定大小内存池管理器 |
36 | | -├── Port 多缓冲区 I/O 抽象层(类 SEGGER RTT) |
37 | | -├── Transport 多路复用传输层(ANSI 转义序列) |
38 | | -├── StdIO 简化的标准 I/O(printf 家族) |
39 | | -└── Logger 多级日志系统(带颜色、RTT 支持) |
40 | | -``` |
41 | | - |
42 | | -### 依赖关系 |
43 | | - |
44 | | -``` |
45 | | -Common (基础) |
46 | | - ├─> FIFO (头文件) |
47 | | - ├─> Memory_Pool |
48 | | - └─> StdIO |
49 | | -
|
50 | | -FIFO → Port (多缓冲区 I/O) |
51 | | -
|
52 | | -Port + FIFO → Transport (多路复用) |
53 | | -
|
54 | | -Memory_Pool + StdIO → Logger (日志系统) |
55 | | -
|
56 | | -Auto_Init (可选,提供自动初始化) |
57 | | -``` |
58 | | - |
59 | | -## 📦 安装方式 |
60 | | - |
61 | | -### 方式 1: CMSIS-Pack(推荐) |
62 | | - |
63 | | -1. 从 [Releases](https://github.com/fool-cat/fc_embed/releases) 下载最新的 `.pack` 文件 |
64 | | -2. 在 Keil MDK 中导入:`Pack Installer` → `Import` → 选择 `.pack` 文件 |
65 | | -3. 在项目中选择需要的组件:`Manage Run-Time Environment` → `fc_embed` |
66 | | - |
67 | | -### 方式 2: 源码集成 |
68 | | - |
69 | | -```bash |
70 | | -git clone https://github.com/fool-cat/fc_embed.git |
71 | | -cd fc_embed |
72 | | -git checkout develop # 或 CMSIS-Pack 分支 |
73 | | -``` |
74 | | - |
75 | | -将 `core/` 目录下的文件添加到你的项目中。 |
76 | | - |
77 | | -## 🔧 快速开始 |
78 | | - |
79 | | -### 1. 基础配置 |
80 | | - |
81 | | -复制配置模板并根据需求修改: |
82 | | - |
83 | | -```c |
84 | | -// 基于 core/fc_config_template.h 创建 fc_config.h |
85 | | -#define FC_LOG_ENABLE 1 |
86 | | -#define FC_LOG_LEVEL FC_LOG_ALL |
87 | | -#define USE_FC_AUTO_INIT 1 // 启用自动初始化 |
88 | | -``` |
89 | | - |
90 | | -### 2. FIFO 环形缓冲区 |
91 | | - |
92 | | -```c |
93 | | -#include "fc_fifo.h" |
94 | | - |
95 | | -// 定义 FIFO |
96 | | -fc_fifo_t fifo; |
97 | | -uint8_t buffer[256]; |
98 | | - |
99 | | -// 初始化 |
100 | | -fc_fifo_init(&fifo, buffer, sizeof(buffer)); |
101 | | - |
102 | | -// 写入数据 |
103 | | -uint8_t data[] = "Hello"; |
104 | | -fc_fifo_write(&fifo, data, sizeof(data)); |
105 | | - |
106 | | -// 读取数据 |
107 | | -uint8_t recv[10]; |
108 | | -size_t len = fc_fifo_read(&fifo, recv, sizeof(recv)); |
109 | | -``` |
110 | | -
|
111 | | -**特性:** |
112 | | -- 无锁设计(单生产者/单消费者) |
113 | | -- 基于 Linux kfifo 实现 |
114 | | -- 支持批量读写、零拷贝操作 |
115 | | -
|
116 | | -### 3. 内存池管理 |
117 | | -
|
118 | | -```c |
119 | | -#include "fc_pool.h" |
120 | | -
|
121 | | -// 定义内存池 |
122 | | -fc_pool_t pool; |
123 | | -uint8_t pool_mem[1024]; |
124 | | -
|
125 | | -// 初始化(每块 64 字节) |
126 | | -fc_pool_init(&pool, pool_mem, sizeof(pool_mem), 64); |
127 | | -
|
128 | | -// 分配内存 |
129 | | -void *ptr = fc_pool_alloc(&pool); |
130 | | -
|
131 | | -// 释放内存 |
132 | | -fc_pool_free(&pool, ptr); |
133 | | -``` |
134 | | - |
135 | | -**特性:** |
136 | | -- O(1) 时间复杂度 |
137 | | -- 固定大小块分配 |
138 | | -- 支持内存链式扩展 |
139 | | - |
140 | | -### 4. 日志系统 |
141 | | - |
142 | | -```c |
143 | | -#include "fc_log.h" |
144 | | - |
145 | | -// 初始化日志(使用自动初始化时无需手动调用) |
146 | | -fc_log_init(); |
147 | | - |
148 | | -// 使用日志 |
149 | | -FC_LOG_I("系统启动"); |
150 | | -FC_LOG_W("警告:温度过高 %d°C", temp); |
151 | | -FC_LOG_E("错误:传感器无响应"); |
152 | | -``` |
153 | | -
|
154 | | -**特性:** |
155 | | -- 多级日志(ERROR/WARN/INFO/DEBUG/VERBOSE) |
156 | | -- 支持颜色输出 |
157 | | -- 集成 SEGGER RTT 支持 |
158 | | -
|
159 | | -### 5. Port I/O 抽象 |
160 | | -
|
161 | | -```c |
162 | | -#include "fc_port.h" |
163 | | -
|
164 | | -// 默认端口已自动初始化(使用自动初始化时) |
165 | | -// 或手动初始化 |
166 | | -fc_default_port_init(); |
167 | | -
|
168 | | -// 重定向 printf 到端口 |
169 | | -printf("输出到调试端口\n"); |
170 | | -
|
171 | | -// 或直接使用端口 API |
172 | | -fc_port_printf(&fc_stdout, "格式化输出: %d\n", value); |
173 | | -``` |
174 | | - |
175 | | -### 6. 自动初始化框架 |
176 | | - |
177 | | -```c |
178 | | -#include "fc_auto_init.h" |
179 | | - |
180 | | -// 定义初始化函数 |
181 | | -void my_device_init(void) { |
182 | | - // 设备初始化代码 |
183 | | -} |
184 | | - |
185 | | -// 注册到自动初始化(DEVICE 阶段,优先级 100) |
186 | | -INIT_EXPORT_DEVICE(my_device_init, 100); |
187 | | - |
188 | | -// 在 main 中调用初始化 |
189 | | -int main(void) { |
190 | | - fc_section_init_env(); // 环境初始化(main 之前) |
191 | | - fc_section_init_clock(); // 时钟初始化 |
192 | | - fc_section_init_device(); // 设备初始化 |
193 | | - fc_section_init_app(); // 应用初始化 |
194 | | - |
195 | | - while(1) { |
196 | | - // 主循环 |
197 | | - } |
198 | | -} |
199 | | -``` |
200 | | -
|
201 | | -## 📚 组件详解 |
202 | | -
|
203 | | -### FIFO 环形缓冲区 |
204 | | -
|
205 | | -基于 Linux kfifo 的无锁环形队列实现,适用于单生产者/单消费者场景。 |
206 | | -
|
207 | | -**主要 API:** |
208 | | -- `fc_fifo_init()` - 初始化 |
209 | | -- `fc_fifo_write()` / `fc_fifo_read()` - 批量读写 |
210 | | -- `fc_fifo_write_byte()` / `fc_fifo_read_byte()` - 单字节读写 |
211 | | -- `fc_fifo_peek()` - 查看但不取出 |
212 | | -- `fc_fifo_get_write_region()` - 零拷贝写入 |
213 | | -
|
214 | | -### Memory Pool 内存池 |
215 | | -
|
216 | | -O(1) 复杂度的固定大小内存池,支持链式内存块扩展。 |
217 | | -
|
218 | | -**主要 API:** |
219 | | -- `fc_pool_init()` - 初始化 |
220 | | -- `fc_pool_alloc()` - 分配内存块 |
221 | | -- `fc_pool_free()` - 释放内存块 |
222 | | -- `fc_pool_chain()` - 链接多个内存池 |
223 | | -
|
224 | | -### Port I/O 层 |
225 | | -
|
226 | | -类似 SEGGER RTT 的多缓冲区 I/O 抽象,支持标准 I/O 重定向。 |
227 | | -
|
228 | | -**主要 API:** |
229 | | -- `fc_port_printf()` - 格式化输出 |
230 | | -- `fc_port_write()` / `fc_port_read()` - 原始读写 |
231 | | -- 标准 I/O 重定向支持(printf/scanf) |
232 | | -
|
233 | | -### Logger 日志系统 |
234 | | -
|
235 | | -基于内存池的轻量级日志系统,支持多级过滤和颜色输出。 |
236 | | -
|
237 | | -**日志级别:** |
238 | | -```c |
239 | | -FC_LOG_E() // ERROR - 错误 |
240 | | -FC_LOG_W() // WARN - 警告 |
241 | | -FC_LOG_I() // INFO - 信息 |
242 | | -FC_LOG_D() // DEBUG - 调试 |
243 | | -FC_LOG_V() // VERBOSE - 详细 |
244 | | -``` |
245 | | - |
246 | | -### Transport 传输层 |
247 | | - |
248 | | -使用 ANSI 转义序列实现的多路复用传输层,可在单个物理通道上传输多个逻辑通道。 |
249 | | - |
250 | | -### Auto Init 自动初始化 |
251 | | - |
252 | | -4 级优先级的自动初始化框架: |
253 | | -- **ENV** - 环境层(main 之前/构造函数) |
254 | | -- **CLOCK** - 时钟配置 |
255 | | -- **DEVICE** - 设备初始化 |
256 | | -- **APP** - 应用初始化 |
257 | | - |
258 | | -## 🛠️ 编译器支持 |
259 | | - |
260 | | -- ✅ ARM Compiler 5/6 (Keil MDK) |
261 | | -- ✅ IAR EWARM |
262 | | -- ✅ GCC (ARM Embedded) |
263 | | -- ✅ MSVC (Windows 测试) |
264 | | - |
265 | | -## 📝 配置说明 |
266 | | - |
267 | | -所有配置项在 `fc_config.h` 中定义(基于 `fc_config_template.h` 创建),主要配置包括: |
268 | | - |
269 | | -```c |
270 | | -// 自动初始化 |
271 | | -#define USE_FC_AUTO_INIT 1 |
272 | | - |
273 | | -// 日志配置 |
274 | | -#define FC_LOG_ENABLE 1 |
275 | | -#define FC_LOG_LEVEL FC_LOG_ALL |
276 | | -#define FC_LOG_COLOR_ENABLE 1 |
277 | | - |
278 | | -// 内存池配置 |
279 | | -#define FC_LOG_POOL_TOTAL_SIZE (4 * 1024) |
280 | | -#define FC_LOG_ALLOC_BLOCK_SIZE 128 |
281 | | - |
282 | | -// Port 配置 |
283 | | -#define FC_PORT_NUM 8 |
284 | | -#define FC_PORT0_SIZE 1024 |
285 | | -``` |
286 | | - |
287 | | -## 🧪 测试示例 |
288 | | - |
289 | | -项目提供了多个测试示例,位于 `test/` 目录: |
290 | | - |
291 | | -- `test_ring_fifo.cpp` - FIFO 环形队列测试 |
292 | | -- `test_stdio.cpp` - StdIO 测试 |
293 | | -- `test_transport.cpp` - Transport 传输层测试 |
294 | | -- `test_auto_init.cpp` - 自动初始化测试 |
295 | | -- `STM32F407VET_keil/` - STM32 完整工程示例 |
296 | | -- `VS2022/` - Windows 平台测试工程 |
297 | | - |
298 | | -## 🤝 贡献指南 |
299 | | - |
300 | | -欢迎提交 Issue 和 Pull Request! |
301 | | - |
302 | | -1. Fork 本仓库 |
303 | | -2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) |
304 | | -3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) |
305 | | -4. 推送到分支 (`git push origin feature/AmazingFeature`) |
306 | | -5. 提交 Pull Request |
307 | | - |
308 | | -## 📄 许可证 |
309 | | - |
310 | | -本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件 |
311 | | - |
312 | | -## ⚠️ 注意事项 |
313 | | - |
314 | | -1. **线程安全**:大部分组件不提供内置锁机制,需由使用者保证线程安全 |
315 | | -2. **FIFO 限制**:仅支持单生产者/单消费者场景 |
316 | | -3. **配置优先**:使用前需根据实际需求创建 `fc_config.h`(基于 `fc_config_template.h`) |
317 | | -4. **内存对齐**:内存池要求内存按 `sizeof(size_t)` 对齐 |
318 | | - |
319 | | -## 🗺️ 路线图 |
320 | | - |
321 | | -- [x] 核心组件实现 |
322 | | -- [x] CMSIS-Pack 支持 |
323 | | -- [x] GitHub Actions CI/CD |
324 | | -- [ ] 更多平台移植示例 |
325 | | -- [ ] 上位机工具(Transport 解析) |
326 | | -- [ ] 完整的 API 文档 |
327 | | -- [ ] 性能基准测试 |
328 | | - |
329 | | ---- |
330 | | - |
331 | | -⭐ 如果这个项目对你有帮助,请给个 Star 支持一下! |
| 1 | +# 文档建设中... |
0 commit comments