# embedded_fw > 专注于 FPGA 嵌入式软核(RISC-V/Microblaze)的 C 语言底层驱动开发与系统固件优化。 - Author: 张嘉良 - Repository: zhangjialiang-tt/ai-coding-config - Version: 20260123111038 - Stars: 0 - Forks: 0 - Last Updated: 2026-02-06 - Source: https://github.com/zhangjialiang-tt/ai-coding-config - Web: https://mule.run/skillshub/@@zhangjialiang-tt/ai-coding-config~embedded_fw:20260123111038 --- --- name: embedded_fw description: 专注于 FPGA 嵌入式软核(RISC-V/Microblaze)的 C 语言底层驱动开发与系统固件优化。 --- # 💾 Embedded Firmware Professional Norms ## 1. 编码基础与标准 - **语言标准:** 遵循 C99 或 C11 标准。 - **类型安全:** 严禁使用原生 `int`, `short`, `long`。必须强制使用 `` 中的标准宽度类型(如 `uint32_t`, `int16_t`)。 - **头文件保护:** 所有 `.h` 文件必须包含 `#ifndef FILENAME_H` 宏保护。 ## 2. 硬件寄存器交互 (Hardware Abstraction) - **Volatile 关键字:** 访问所有外部硬件寄存器(外设、存储映射 I/O)时,指针必须声明为 `volatile`。 - *推荐格式:* `#define REG_I2C_CTRL (*(volatile uint32_t *)(BASE_ADDR + 0x04))` - **位操作:** 优先使用位掩码(Mask)和位偏移(Shift)进行寄存器配置,禁止直接写入魔法数字。 - **寄存器对齐:** 确保访问地址符合软核的总线对齐要求(通常为 32-bit 对齐)。 ## 3. 内存管理与实时性 - **零动态分配:** 严禁在固件中使用 `malloc()` 或 `free()`。所有内存必须在编译时通过 `static` 或全局数组静态分配,以防止红外系统长时间运行产生的内存碎片。 - **中断服务程序 (ISR):** - ISR 必须保持极其简洁:仅处理状态清除和标志位设置。 - 严禁在 ISR 中调用复杂的算法函数或阻塞式的打印函数(如 `printf`)。 - **临界区保护:** 在操作多核或中断共享的全局变量时,必须使用自旋锁或禁用中断来保护临界区。 ## 4. 固件安全自检清单 (Response Check) 1. **寄存器一致性:** 软件定义的寄存器偏移地址是否与 RTL 设计(或 `rtl_architect` 技能生成的地址映射)完全匹配? 2. **堆栈溢出:** 局部大数组是否已改为静态分配,以防止软核极小的 Stack 空间溢出? 3. **阻塞风险:** 所有的 `while(status_busy)` 循环是否都应加入 Timeout 计数器防止程序死锁? 4. **资源占用:** 代码实现是否考虑了软核有限的指令存储空间(如常用的 8KB/16KB BRAM)? ## 5. 交互示例 - **User:** "帮我写一个配置红外探测器积分时间的 I2C 驱动函数。" - **Action:** 自动激活此 Skill,生成使用 `volatile` 指针的寄存器读写逻辑,并包含超时退出机制和状态校验。