基本约定

基本类型

  • xwu8_t 8位无符号整数
  • xws8_t 8位有符号整数
  • xwu16_t 16位无符号整数
  • xws16_t 16位有符号整数
  • xwu32_t 32位无符号整数
  • xws32_t 32位有符号整数
  • xwu64_t 64位无符号整数
  • xws64_t 64位有符号整数
  • xwsz_t 大小值(无符号)
  • xwssz_t 大小值(有符号)
  • xwstk_t 栈帧(无符号),必须与指针位宽一致
  • xwptr_t 指针的整数值(无符号),必须与指针位宽一致
  • xwreg_t 寄存器(无符号),必须与指针位宽一致
  • xwsreg_t 寄存器(有符号),必须与指针位宽一致
  • xwer_t 错误码(有符号),通常为负数
  • xwsq_t 序列值/位置/偏移(无符号),必须与指针位宽一致
  • xwssq_t 序列值/位置/偏移(有符号),必须与指针位宽一致
  • xwsid_t ID(有符号),必须与指针位宽一致
  • xwid_t ID(无符号),必须与指针位宽一致
  • xwisr_t 中断向量(函数指针)
  • xwirq_t 中断号(有符号),负的中断号表示系统异常,正的中断号表示外部中断
  • xwpr_t 优先级(有符号)
  • xwbmp_t 位图(无符号)
  • xwtm_t 时间(64位有符号整数,单位:纳秒)
  • xwlfq_t 无锁队列

  • ctor_f 构造函数

typedef void (* ctor_f)(void * /*obj*/);
  • dtor_f 析构函数
typedef void (* dtor_f)(void * /*obj*/);
  • xwsc_f 系统调用
typedef xws64_t (* xwsc_f)(void * /*arg*/, ...);

标识符(ID)

玄武OS使用标识符(ID)来表示一个内核对象,很多API都需要ID作为参数。

  • 在多核的OS应用中,会同时出现CPU-A正在删除对象,CPU-B正在访问对象的情况。 此种情况有可能造成CPU-B访问野指针。解决的方法是内核为对象建立一个唯一的“ID”, 访问对象时先通过ID查找对象,如果查找的结果为非空,内核会通过增加引用计数的 方式来保护对象在访问期间不被CPU-A删除;
  • 在玄武OS中,统一为对象抽象了这种“ID”,用数据类型 xwid_t 表示;
  • 在玄武OS中,为每一个玄武OS内核对象建立了"ID —— 指针"关联表( TODO );
  • 在精简的单核RTOS应用中,直接使用指针的数值作为“ID”,避免查找的过程。

题外话 引用计数是基于原子操作实现的,优点是用法简单, 缺点是频繁的原子操作会导致CPU性能下降。

标准头文件

标准头文件中包含了玄武OS的基本C/C++语言环境,包括:

  • 配置
  • 编译器的宏
  • 类型
  • 错误码
  • 基本信息
#include <xwos/standard.h>
#include <xwos/standard.hxx>

操作系统抽象层

玄武OS拥有一套操作系统抽象层(XWOSAL)接口,XWOSAL可以把不同操作系统的API 抽象成统一的接口,可方便应用程序的移植。目前,OSAL已支持以下系统:

操作系统抽象层的接口以"xwosal_"作为前缀,头文件位于xwos/osal中。

单核与多核

玄武OS对多核系统的支持情况:

  • 单核(UP):支持
  • 对称多核(SMP):支持
  • 边界多核(BMP):有限支持,用户可在SMP系统的基础上,把线程绑定在特定的CPU中运行。
  • 不对称多核(AMP):不支持,一般AMP系统需要把每个核视为UP单独处理。 甚至可在不同的核上运行不同的操作系统。AMP系统通常需要高度定制。
  • 可以在配置文件cfg/XuanWuOS.h中修改单核或多核的配置:
    • XuanWuOS_CFG_CORE 配置为 smp ,cfg/xwos.h中起作用的是以 XWSMPCFG_ 作为前缀的配置, XWUPCFG_ 作为前缀的配置无作用;
    • XuanWuOS_CFG_CORE 配置为 up ,cfg/xwos.h中起作用的是以 XWUPCFG_ 作为前缀的配置, XWSMPCFG_ 作为前缀的配置无作用;
    • cfg/xwos.h中其他前缀的配置为SMP和UP共同拥有的配置。
  • 代码中一些与单核多核相关的命名规则解释:
    • 函数中的 _lc 后缀:只在”本地“CPU执行的函数,在单核系统中”本地“CPU指的是 系统中存在的唯一的一个CPU;而在多核系统中指的是正在执行当前函数的CPU;
    • 函数中的 _lic 后缀:只在”本地“CPU的中断中执行的函数。