玄武C库

位操作

描述

玄武C库中提供了位操作模板库,基本类型定义的 各种类型都可使用位操作。位操作模板的第一个参数都为基本类型。

示例

xwssq_t idx;
/* 从最低位开始查找数据"0"中第一个被置1的位,结果为-1 */
idx = xwbop_ffs(xwu32_t, 0);

/* 从最低位开始查找数据"0xF0"中第一个被置1的位,结果为4 */
idx = xwbop_ffs(xwu32_t, 0xF0);

 /* 将数据0xAA进行镜像翻转,结果为0x55 */
xwu32_t rdata = xwbop_rbit(xwu32_t, 0xAA);

配置

/* <cfg/xwos.h> */

#define XWLIBCFG_XWBOP_FFS8           0 // 是否启用位操作ffs8,取值:1|0
#define XWLIBCFG_XWBOP_FLS8           0 // 是否启用位操作fls8,取值:1|0
#define XWLIBCFG_XWBOP_RBIT8          0 // 是否启用位操作rbit8,取值:1|0
#define XWLIBCFG_XWBOP_FFS16          0 // 是否启用位操作ffs16,取值:1|0
#define XWLIBCFG_XWBOP_FLS16          0 // 是否启用位操作fls16,取值:1|0
#define XWLIBCFG_XWBOP_RBIT16         0 // 是否启用位操作rbit16,取值:1|0
#define XWLIBCFG_XWBOP_RE16           0 // 是否启用位操作re16,取值:1|0
#define XWLIBCFG_XWBOP_RE16S32        0 // 是否启用位操作re16s32,取值:1|0
#define XWLIBCFG_XWBOP_FFS32          0 // 是否启用位操作ffs32,取值:1|0
#define XWLIBCFG_XWBOP_FLS32          0 // 是否启用位操作fls32,取值:1|0
#define XWLIBCFG_XWBOP_RBIT32         0 // 是否启用位操作rbit32,取值:1|0
#define XWLIBCFG_XWBOP_RE32           0 // 是否启用位操作re32,取值:1|0
#define XWLIBCFG_XWBOP_RE32S64        0 // 是否启用位操作re32s64,取值:1|0
#define XWLIBCFG_XWBOP_FFS64          0 // 是否启用位操作ffs64,取值:1|0
#define XWLIBCFG_XWBOP_FLS64          0 // 是否启用位操作fls64,取值:1|0
#define XWLIBCFG_XWBOP_RBIT64         0 // 是否启用位操作rbit64,取值:1|0
#define XWLIBCFG_XWBOP_RE64           0 // 是否启用位操作re64,取值:1|0

API参考

  • 头文件:xwos/lib/xwbop.h
  • 注释:见头文件

位图操作

描述

玄武OS中使用xwbmp_t来表示位图,xwbmp_t是一个32bit的数据类型, 当位图数量多余32bit时,使用xwbmp_t数组来表示位图。

示例

xwssq_t idx;
xwbmpop_declare(mybitmap, 100); /**< 声明一个100位的位图 */

xwbmpop_c0all(mybitmap, 100); /**< 将位图全部清0 */
xwbmpop_x1i(mybitmap, 8); /**< 将位8翻转 */
idx = xwbmp0p_ffs(mybitmap, 100); /**< 从最低位起查找第一个为1的位的序号,结果:8 */

配置

/* (无) */

API参考

  • 头文件:xwos/lib/xwbop.h
  • 注释:见头文件

原子操作

描述

玄武C库中提供了原子操作库,基本类型定义的各种类型都 可使用原子操作。

用法

C11标准中增加了原子操作库,玄武OS的基本类型可以使用标准原子操作库中的函数, 也可以使用玄武OS自己的原子操作库。

玄武OS原子操作库提供了大量函数模板。这些原子操作分为以下几类:

    • xwaop_load()
      • 可以指定C11中6种内存序
    • xwaop_read()
      • 内存序:acquire
    • xwaop_store()
      • 可以指定C11中6种内存序
    • xwaop_write()
      • 内存序:release
  • 读-改-写
    • 基本运算:*xwaop_add()* , xwaop_sub() , xwaop_rsb()
      • 内存序:acq_rel
    • 位运算: xwaop_and() , xwaop_or() , xwaop_xor()
      • 内存序:acq_rel
    • 位操作: xwaop_s1m() , xwaop_c0m() , xwaop_x1m()
      • 内存序:acq_rel
  • 读-测试-改-写
    • 所有匹配正则表达式xwaop_t.+_then_.+()的函数
      • 分为两种情况
        • 测试成功,继续执行“改-写”操作,此时内存序为acq_rel
        • 测试失败,相当于读操作,此时内存序为consume

示例

xwer_t rc;
__xwcc_atomic xwsq_t refcnt = v;
xwsq_t nv, ov;

/*
 * 测试refcnt是否为0:
 * + ture: refcnt增加1,nv返回refcnt增加以后的新值,ov返回refcnt增加以前的旧值,
 *         内存序:acq_rel,rc为返回值XWOK;
 * + false: nv与ov都返回refcnt的值,内存序:consume,rc为返回值-EACCES;
 */
rc = xwaop_teq_then_add(xwsq_t, &refcnt, 0, 1, &nv, &ov);

配置

/* <cfg/xwos.h> */

#define XWLIBCFG_XWAOP8               1 // 是否启用8bit原子操作库,取值:1|0
#define XWLIBCFG_XWAOP16              1 // 是否启用16bit原子操作库,取值:1|0
#define XWLIBCFG_XWAOP32              1 // 是否启用32bit原子操作库,取值:1|0
#define XWLIBCFG_XWAOP64              1 // 是否启用64bit原子操作库,取值:1|0

API参考

  • 头文件:xwos/lib/xwaop.h
  • 注释:见头文件

位图原子操作

描述

玄武C库中提供了对位图xwbmp_t数组的原子操作库。 位图原子操作分为以下几类:

    • xwbmpaop_t1i()
      • 内存序:consume
    • xwbmpaop_s1all() , xwbmpaop_c0all()
      • 内存序:acq_rel
  • 读-改-写
    • xwbmpaop_s1i() , xwbmpaop_c1i() , xwbmpaop_x1i()
      • 内存序:acq_rel
  • 读-测试-改-写
    • 所有匹配 xwbmpaop_.+_then_.+() 的函数
      • 分为两种情况
        • 测试成功,继续执行“改-写”操作,此时内存序为acq_rel
        • 测试失败,相当于读操作,此时内存序为consume

配置

/* <cfg/xwos.h> */

#define XWLIBCFG_XWBMPAOP             1 // 是否启用位图原子操作库,取值:1|0

API参考

  • 头文件:xwos/lib/xwbmpaop.h
  • 注释:见头文件

CRC32

配置

/* <cfg/xwos.h> */

#define XWLIBCFG_CRC32                1 // 是否启用CRC32,取值:1|0
#define XWLIBCFG_CRC32_0X04C11DB7     1 // 是否启用CRC32的多项式0x04C11DB7,
                                        // 取值:1|0
#define XWLIBCFG_CRC32_0XEDB88320     1 // 是否启用CRC32的多项式0xEDB88320,
                                        // 取值:1|0

API参考

  • 头文件:xwos/lib/crc32.h
  • 注释:见头文件

日志

描述

玄武OS提供了日志框架,用户可以输出带有等级的日志:

  • VERBOSE,等级1,冗长
  • DEBUG,等级2,调试
  • INFO,等级3,信息
  • NOTICE,等级4,提醒
  • WARNING,等级5,警告
  • ERR,等级6,错误
  • CRIT,等级7,危险
  • EMERG,等级8,紧急

用户可以通过配置XWLIBCFG_XWLOG_LEVEL来控制各种等级的日志是否输出:

  • 当等级大于等于XWLIBCFG_XWLOG_LEVEL的日志才会输出,
  • XWLIBCFG_XWLOG_LEVEL配置为0将关闭所有日志。

玄武OS的日志框架需要用户在BSP中提供后端驱动接口,以决定日志最终输出到串口、 SD卡、还是别的设备:

  • 当配置SOCCFG_LOG为1时,BSP中需要提供函数soc_log_write()
  • 当配置BRDCFG_LOG为1时,BSP中需要提供函数board_log_write()
  • 当配置SOCCFG_LOG与配置BRDCFG_LOG同时为1时,SOCCFG_LOG具有更高 优先级;

配置

/* <cfg/xwos.h> */

#define XWLIBCFG_LOG                  0         // 是否启用log,取值:1|0
#define XWLIBCFG_XWLOG_LEVEL          (0U)      // 可打印的log等级
#define XWLIBCFG_XWLOG_BUFSIZE        (128U)    // 用于格式化log的缓冲区大小,
                                                // 此缓冲区在线程栈上创建

API参考

  • 头文件:xwos/lib/xwlog.h
  • 注释:见头文件