系统基本架构

概述

玄武OS在设计时就充分考虑了代码的复用性和移植性,代码被架构成多层结构: BSP层、内核层、中间件层和应用层。

img

  • 编译系统;
  • 板级支持层(BSP Layer):
    • 处理器架构/CPU/SOC/外设芯片相关的代码;
    • 电路板相关的源代码以及项目相关的配置。
  • 操作系统层(OS Layer):
    • 内核:
      • C函数库:原子操作库、位操作库、数据结构等;
      • 调度器:单核、多核、线程调度、定时器;
      • 同步:信号量、条件量;
      • 锁:自旋锁、顺序锁、互斥锁;
      • 内存管理:简单内存分配器、内存切片算法、伙伴算法、内存池。
  • 中间件层(Middleware Layer):驱动/中间件/第三方开源组件;
  • 应用层(Application Layer)。

软件架构与配置

描述

玄武OS每一层软件都有独立的配置文件,所有配置文件都集中存放于 xwbd/电路板名称/cfg 文件夹中。

  • 编译系统:
    • 配置文件: cfg/XuanWuOS.h
      • 配置文件是用C头文件来编写的,这是为了和其他配置文件保持一致, 但是其中定义的“宏”会被转换成Makefile的变量来使用。 详细可参考<构建系统.md>。
      • 配置中的架构、CPU、SOC型号、电路板等信息用于确定编译时各层代码的路径。
      • 详细注释可参考配置说明
    • 源码路径: xwbs
      • 编译系统主要是用Makefile的语法进行编写,但也会使用一些其他脚本语言 来实现一些小功能,例如Shell、Emacs-Lisp、Python等。
  • BSP层:
    • 处理器架构描述层(ADL)
      • 配置文件: cfg/arch.h
      • 源码路径: xwcd/soc/架构/子架构/编译器
      • 通常移植同架构的不同单片机只需调整配置,不必修改处理器架构描述层 的源代码。例如,同为ARMv7架构的单片机STM32F1、STM32F4和S32K 就复用了 xwcd/soc/arm/v7m/gcc 中的代码,不同的地方再通过配置进行调整。
      • 处理器架构描述层会提供与编译器相关的修饰限定词。因为这些特性通常与 处理器架构、控制编译/连接方式有关,ANSI-C不能表达这些内容。
      • 处理器架构描述层通常会在汇编层面,使用一些特殊指令提供基本的C函数库, 例如,原子操作库、位操作库、自旋锁,可充分挖掘架构的潜能。
      • 处理器架构描述层也会提供一些共有硬件资源的驱动,例如ARMv7架构的单片机, 无论是哪个芯片厂家的型号,都有ARM公司官方文档中定义的NVIC、Systick等 硬件资源。
    • 处理器集合描述层(CDL)
      • 配置文件: cfg/cpu.h
      • 源码路径: ADL目录下的CPU子集目录
      • 这一层是对处理器架构描述层的进一步细分和补充。通常大的处理器架构下面 又有细分为几个CPU子集,例如ARMv7又有m3、m4和m7的区分。这一层主要是描述 这种细微的差异,代码很少,例如ARMv7的m4和m3的区别仅仅是m4的cpu.mk中 增加了编译选项 -mfloat-abi=hard -mfpu=fpv4-sp-d16 ,表示m4的内核是 有硬件浮点数单元的,编译浮点运算的源代码时会直接生成硬件浮点指令,而 不会使用编译器提供的软件模拟的方式。
    • 片上系统描述层(SDL)
      • 配置文件: cfg/soc.h
      • 源码路径: CDL目录下的SOC子集目录
      • 玄武OS内核所需要的BSP层的适配代码就由这一层来提供,包括中断控制器、 系统滴答时钟、切换上下文的中断等。
      • 也可在这一层提供SOC中各种硬件资源的驱动代码。
    • 板级描述层(BDL)
      • 配置文件: cfg/board.h
      • 源码路径: xwbd/电路板名称/bdl
      • 配置时钟;
      • 初始化内存管理;
      • 提供用户程序的总入口: xwos_main()
    • 板级模块(BM)中的驱动
      • 配置文件: cfg/board.h
      • 源码路径: xwbd/电路板名称/bm
      • 需要使用第三方的驱动库时通常采用<03.构建系统.md>的方式 进行集成,这是因为玄武模块在玄武OS的编译系统中会编译成独立的静态库, 可保持其独立性,降低与整个系统的耦合性,也方便增加一些wrapper代码进行封装。 例如STM32CubeMX生成的驱动代码就是通过板级模块的方式集成的。
    • 外设驱动
      • 配置文件: cfg/perpheral.h
      • 源码路径: xwcd/perpheral
      • 一些常见的外设芯片驱动放在此处,这些外设芯片的驱动也是采用 <03.构建系统.md>的方式进行集成,方便通过配置筛选驱动。
  • 操作系统层
    • 内核
      • 配置文件: cfg/xwos.h
      • 源码路径: xwos
  • 中间件层
    • 玄武OS自身提供的中间件
      • 配置文件: cfg/xwmd.h
      • 源码路径: xwmd
    • 第三方组件
      • 配置文件: cfg/xwem.h
      • 源码路径: xwem
  • 应用层:
    • 应用可放在板级模块(bm)中
      • 配置文件: cfg/board.h
      • 源码路径: xwbd/电路板名称/bm
    • 应用可放在 xwam
      • 配置文件: cfg/xwam.h
      • 源码路径: xwam

配置说明

玄武OS在设计之初曾考虑过使用现成的配置生成工具,例如Linux内核的Kconfig工具。 但为了降低跨平台开发的工作量和难度,作者最终选择使用C语言的头文件来描述所有配置, 即便这些配置中很一部分是给编译系统使用的(例如路径的配置)。

cfg/XuanWuOS.h

#ifndef __cfg_XuanWuOS_h__
#define __cfg_XuanWuOS_h__

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********  ARCH & compiler  ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_ARCH       arm // 架构:在xwcd/soc中选择架构文件夹
#define XuanWuOS_CFG_SUBARCH    v7m // 子架构:在架构文件夹中选择子架构文件夹
#define XuanWuOS_CFG_COMPILER   gcc // 编译器:在子架构文件夹中选择编译器文件夹
#define XuanWuOS_CFG_LDSCRIPT   cfg/XuanWuOS.lds // 脚本的的相对路径,
                                                 // 相对于电路板目录:
                                                 // xwbd/电路板名称
#define XuanWuOS_CFG_MK_RULE    arm-cortex-m.gcc.rule // 选择xwbs文件夹中的
                                                      // makefile规则
#define XuanWuOS_CFG_ELF_MK     arm-cortex-m.gcc.mk // 选择xwbs文件夹中编译ELF
                                                    // 的makefile
#define XuanWuOS_CFG_XWMO_MK    arm-cortex-m.gcc.xwmo.mk // 选择xwbs文件夹中编译
                                                         // 玄武模块的makefile

#include <cfg/arch.h> // 包含架构的配置,此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********        CPU        ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_CPU        m4 // CPU集合:在编译器文件夹中选择CPU集合文件夹
#include <cfg/cpu.h> // 包含CPU集合的配置,此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********        SOC        ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_SOC        stm32f4x // 芯片:在CPU集合文件夹中选择芯片文件夹
#include <cfg/soc.h> // 包含SOC芯片的配置,此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********     perpheral     ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_PERPHERAL  1 // 是否需要引用外设库,取值:1|0
#include <cfg/perpheral.h> // 包含外设库的配置,此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********       board       ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_BOARD      fk429m // 电路板或项目的名字,
                                       // 选在位于xwbd文件夹下的电路板目录
#include <cfg/board.h> // 包含电路板的配置,此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********    XWOS kernel    ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_CORE       smp // 内核的类型,取值:smp|up
                                    // + smp: 对称多核
                                    // + up: 单核
#include <cfg/xwos.h> // 包含内核的配置,此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********  XWOS middleware  ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_XWMD       1 // 是否需要引用中间件库,取值:1|0
#include <cfg/xwmd.h> // 包含中间件的配置,此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********  external module  ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_XWEM       1 // 是否需要引用第三方组件库,取值:1|0
#include <cfg/xwem.h> // 包含第三方组件库的配置,此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********     APP module    ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_XWAM       1 // 是否需要引用应用组件库,取值:1|0
#include <cfg/xwam.h> // 包含应用组件库的配置,此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********     OEM module    ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_OEMPATH    ../oem // OEM模块的搜索路径
                                       // + 如果为相对路径,则
                                       //   相对于玄武OS的根目录
                                       // + 可以为绝对路径
#include <cfg/oem.h> // 包含OEM模块的配置,此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ********        auto-generated header        ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#include <wkspc/autogen.h> // 此头文件中部分配置的定义不符合C的语法,不可在
                           // 其他C代码中引用,因此配置生成工具会生成一份
                           // 新的头文件,此头文件路径相对于电路板目录,
                           // 包括部分配置可在其他C代码中引用的宏定义。

#endif /* cfg/XuanWuOS.h */