ワンクリックで
c-coding-standards
XWOS C 代码风格指南。用于在 XWOS(玄武操作系统)代码库中编写或审查 C 代码时遵循项目约定的编码规范。包括文件组织、命名约定、类型系统、代码格式化、错误处理、注释规范等。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
XWOS C 代码风格指南。用于在 XWOS(玄武操作系统)代码库中编写或审查 C 代码时遵循项目约定的编码规范。包括文件组织、命名约定、类型系统、代码格式化、错误处理、注释规范等。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
从 OpenSpec 变更中实现任务。当用户想开始实现、继续实现或处理任务时使用。
在实验性工作流中归档已完成的变更。当用户想在实现完成后定稿并归档变更时使用。
进入探索模式 - 一个用于探索想法、调查问题、澄清需求的思考伙伴。当用户想在变更之前或期间先思考一番时使用。
一步生成所有产出物来提议新变更。当用户想快速描述要构建的内容并获得包含设计、规范和任务的完整提案时使用。
将变更中的增量规范同步到主规范。当用户希望将增量规范的变更更新到主规范中(而不归档变更)时使用。
当在当前会话中执行包含独立任务的实现计划时使用
| name | c-coding-standards |
| description | XWOS C 代码风格指南。用于在 XWOS(玄武操作系统)代码库中编写或审查 C 代码时遵循项目约定的编码规范。包括文件组织、命名约定、类型系统、代码格式化、错误处理、注释规范等。 |
本文档为在 XWOS(玄武操作系统)代码库中编写 C 代码提供指导。所有 C 代码必须遵循此编码标准以确保一致性、可读性和可维护性。
XWOS 的 C 编码标准基于 MISRA-C:2012 标准,针对嵌入式实时操作系统环境进行了调整。主要特点包括:
.h 扩展名.c 扩展名.hxx 扩展名.cxx 扩展名头文件保护宏格式为 __文件路径_文件名_h__,用下划线分隔:
#ifndef __xwos_mp_init_h__
#define __xwos_mp_init_h__
// ... 文件内容 ...
#endif /* xwos/mp/init.h */
每个文件必须以 Doxygen 风格的注释开头,包含文件描述、作者和版权信息,例如:
/**
* @file
* @brief XWOS MP内核:初始化
* @author
* + 隐星曜 (Roy Sun) <xwos@xwos.tech>
* @copyright
* + Copyright © 2015 xwos.tech, All Rights Reserved.
* > This Source Code Form is subject to the terms of the Mozilla Public
* > License, v. 2.0. If a copy of the MPL was not distributed with this
* > file, You can obtain one at <http://mozilla.org/MPL/2.0/>.
*/
头文件包含顺序应遵循以下规则:
xwos/standard.h)stdarg.h)示例:
#include <xwos/standard.h>
#include <xwos/lib/xwlog.h>
#include <xwos/lib/object.h>
#include <xwos/mm/common.h>
#include <xwos/mp/thd.h>
xw 前缀,如 xwu32_t、xwer_tstruct xwmp_thd 形式enum xwmp_sem_type_em 形式xwlib_crc32tbl_0x04c11db7static 关键字data_size、temp_bufferXWOS_PTRSIZEXWMP_SEM_TYPE_RTxwlib_crc32_calc()__xwcc_inline 标记函数声明应使用 Doxygen 格式注释:
/**
* @brief 计算 CRC32 值
* @param[in] data: 数据指针
* @param[in] size: 数据大小
* @param[in] crc: 初始 CRC 值
* @return CRC32 结果
*/
xwu32_t xwlib_crc32_calc(const xwu8_t * data, xwsz_t size, xwu32_t crc);
__xwos_模块名_文件名_h____xwos_mp_sync_sem_h__XWMP_SEM_NEGTIVECFG 结尾,如 XWLIBCFG_CRC32_0X04C11DB7do { ... } while (0) 包裹#define XWOS_VALIDATE(exp, errstr, ...) \
if ((!(exp))) { \
return __VA_ARGS__; \
}
使用自定义类型定义确保可移植性:
| 类型 | 描述 |
|---|---|
xws8_t, xwu8_t | 8 位有/无符号整数 |
xws16_t, xwu16_t | 16 位有/无符号整数 |
xws32_t, xwu32_t | 32 位有/无符号整数 |
xws64_t, xwu64_t | 64 位有/无符号整数 |
xwptr_t | 指针类型 |
xwer_t | 错误码类型 |
xwsz_t | 大小类型 |
xwsq_t | 顺序类型 |
xwtm_t | 时间类型 |
xwid_t | ID 类型 |
结构体定义应包含详细注释:
/**
* @brief XWOS MP线程属性
*/
struct xwmp_thd_attr {
const char * name; /**< 线程的名字 */
xwstk_t * stack; /**< 栈内存的基地址 */
xwsz_t stack_size; /**< 线程栈的大小 */
xwsz_t stack_guard_size; /**< 栈内存警戒线 */
xwpr_t priority; /**< 优先级 */
bool detached; /**< 是否为分离态 */
bool privileged; /**< 是否为特权线程 */
};
枚举定义应明确指定类型:
/**
* @brief 信号量类型枚举
*/
enum xwmp_sem_type_em {
XWMP_SEM_TYPE_UNKNOWN = 0U,
#if defined(XWOSCFG_SYNC_PLSEM) && (1 == XWOSCFG_SYNC_PLSEM)
XWMP_SEM_TYPE_PIPELINE = 1U, /**< 管道信号量:先进先出 */
#endif
#if defined(XWOSCFG_SYNC_RTSEM) && (1 == XWOSCFG_SYNC_RTSEM)
XWMP_SEM_TYPE_RT = 2U, /**< 实时信号量:高优先级先出 */
#endif
};
xwer_t 类型表示错误码0,错误返回负值或特定错误码IS_ERR_VALUE()、err_ptr()、ptr_err() 等宏处理错误指针使用 XWOS_VALIDATE 宏验证参数:
xwer_t function_example(const xwu8_t * data, xwsz_t size)
{
xwer_t rc;
XWOS_VALIDATE((nullptr != data), -EFAULT, "data is NULL");
XWOS_VALIDATE((size > 0), -EINVAL, "size must be positive");
// 处理逻辑
rc = process_data(data, size);
if (rc < 0) {
goto err_process;
}
return XWOK;
err_process:
// 错误处理
return rc;
}
goto 语句进行错误处理err_ 为前缀使用段属性指定数据存放位置:
| 属性 | 描述 |
|---|---|
__xwmp_code | MP内核代码段 |
__xwmp_rodata | MP内核只读数据段 |
__xwmp_data | MP内核数据段 |
__xwmp_bss | MP内核BSS段 |
示例:
static __xwmp_data struct xwmm_mempool_objcache xwmp_thd_cache;
const __xwmp_rodata char xwmp_thd_cache_name[] = "xwmp.thd.cache";
Doxygen 格式,包含 @file、@brief、@author、@copyright
Doxygen 格式,描述功能、参数、返回值:
/**
* @brief 初始化自旋锁
* @param[in] spl: 自旋锁对象的指针
* @note
* - 此函数不会关闭CPU中断
* - 此函数不会关闭抢占
*/
void xwmp_splk_init(struct xwmp_splk * spl);
每个成员都应添加注释:
/**
* @brief 信号量对象
*/
struct xwmp_sem {
struct xwmp_synobj synobj; /**< C语言面向对象:继承 `struct xwmp_synobj` */
xwsq_t type; /**< 类型 */
xwssq_t count; /**< 信号量计数器:<0,信号量处于负状态 */
xwssq_t max; /**< 信号量计数器的最大值 */
// ...
};
使用标准标记:
// TODO: 未完成的工作
// FIXME: 需要优化算法
项目使用 .clang-format 文件定义代码格式,基于 Google 风格但有以下关键调整:
UseTab: Never)PointerAlignment: Middle)结构体和枚举的大括号不换行:
struct xwmp_thd_attr {
const char * name;
xwstk_t * stack;
xwsz_t stack_size;
// ...
};
enum xwmp_sem_type_em {
XWMP_SEM_TYPE_UNKNOWN = 0U,
XWMP_SEM_TYPE_PIPELINE = 1U,
XWMP_SEM_TYPE_RT = 2U,
};
函数的大括号换行:
xwer_t xwmp_thd_init(struct xwmp_thd * thd,
const struct xwmp_thd_attr * inattr,
xwmp_thd_f thdfunc, void * arg)
{
xwer_t rc;
// 函数体
return rc;
}
clang-format -i <文件>
#if defined(MACRO) && (1 == MACRO) 格式#if defined(XWOSCFG_SYNC_RTSEM) && (1 == XWOSCFG_SYNC_RTSEM)
# define XWMP_SEM_API(api, ...) xwmp_rtsem_##api(__VA_ARGS__)
#elif defined(XWOSCFG_SYNC_PLSEM) && (1 == XWOSCFG_SYNC_PLSEM)
# define XWMP_SEM_API(api, ...) xwmp_plsem_##api(__VA_ARGS__)
#endif
#ifndef、#define、#endif 标准格式/**
* @file
* @brief XWOS MP内核:自旋锁
* @author
* + 隐星曜 (Roy Sun) <xwos@xwos.tech>
* @copyright
* + Copyright © 2015 xwos.tech, All Rights Reserved.
* > This Source Code Form is subject to the terms of the Mozilla Public
* > License, v. 2.0. If a copy of the MPL was not distributed with this
* > file, You can obtain one at <http://mozilla.org/MPL/2.0/>.
*/
#ifndef __xwos_mp_lock_spinlock_h__
#define __xwos_mp_lock_spinlock_h__
#include <xwos/standard.h>
#include <xwos/ospl/soc/spinlock.h>
/**
* @brief 自旋锁
*/
struct xwmp_splk {
struct soc_splk socsplk; /**< 架构描述层中的自旋锁结构体 */
};
/**
* @brief 自旋锁的初始值
*/
#define XWMP_SPLK_INITIALIZER { .socsplk = SOC_SPLK_INITIALIZER, }
void xwmp_rawly_lock(struct xwmp_splk * spl);
xwer_t xwmp_rawly_trylock(struct xwmp_splk * spl);
void xwmp_rawly_unlock(struct xwmp_splk * spl);
#endif /* xwos/mp/lock/spinlock.h */
/**
* @file
* @brief XWOS MP内核:线程
* @author
* + 隐星曜 (Roy Sun) <xwos@xwos.tech>
* @copyright
* + Copyright © 2015 xwos.tech, All Rights Reserved.
* > This Source Code Form is subject to the terms of the Mozilla Public
* > License, v. 2.0. If a copy of the MPL was not distributed with this
* > file, You can obtain one at <http://mozilla.org/MPL/2.0/>.
*/
#include <xwos/standard.h>
#include <xwos/lib/xwlog.h>
#include <xwos/lib/object.h>
#include <xwos/mp/thd.h>
/* #define XWOS_THDLOGF */ /**< 调试日志开关 */
#ifdef XWOS_THDLOGF
# define xwos_thdlogf(lv, thd, fmt, ...) \
xwlogf(lv, "Thd:%s", fmt, thd->stack.name, ##__VA_ARGS__)
#else
# define xwos_thdlogf(lv, thd, fmt, ...)
#endif
#if defined(XWOSCFG_SKD_THD_MEMPOOL) && (1 == XWOSCFG_SKD_THD_MEMPOOL)
/**
* @brief 结构体 `xwmp_thd` 的对象缓存
*/
static __xwmp_data struct xwmm_mempool_objcache xwmp_thd_cache;
/**
* @brief 结构体 `xwmp_thd` 的对象缓存的名字
*/
const __xwmp_rodata char xwmp_thd_cache_name[] = "xwmp.thd.cache";
#endif
/**
* @brief 初始化线程缓存
*/
#if defined(XWOSCFG_SKD_THD_MEMPOOL) && (1 == XWOSCFG_SKD_THD_MEMPOOL)
xwer_t xwmp_thd_cache_init(struct xwmm_mempool * mp, xwsq_t page_order)
{
xwer_t rc;
XWOS_VALIDATE((nullptr != mp), -EFAULT, "mp is NULL");
rc = xwmm_mempool_objcache_init(&xwmp_thd_cache, mp,
sizeof(struct xwmp_thd),
page_order,
xwmp_thd_cache_name);
if (rc < 0) {
goto err_mempool_objcache_init;
}
return XWOK;
err_mempool_objcache_init:
return rc;
}
#endif
.clang-format:代码格式化配置AGENTS.md:完整开发指南xwos/lib/type.h:类型定义xwos/lib/error.h:错误处理xwbs/misra-c2012-suppressions.txt:MISRA-C 抑制规则xwos/mp/:MP内核代码示例最后更新:2026-04-11