启动流程

XWOS的启动流程

XWOS的启动流程

flowchart LR
    预初始化阶段 --> 初始化阶段 --> 后初始化阶段 --> 主函数阶段

    subgraph 预初始化阶段
        direction TB
        exc["异常初始化"]
        exc["浮点单元初始化"]
        exc["内存初始化"]
    end

    subgraph 初始化阶段
        xwos_init["xwos_init()"]
    end

    subgraph 后初始化阶段
        direction LR
        device["设备驱动初始化"]
        mm["动态内存分配器的初始化"]
    end

    subgraph 主函数阶段
        direction LR
        skd_init["初始化调度器: xwos_skd_init_lc()"]
        thd["建立线程"]
        skd_start["启动调度器: xwos_skd_start_lc()"]
    end

XWOS将初始化流程分为四个阶段:

  • 预初始化阶段(用户定义):xwos_preinit()
  • 初始化阶段(XWOS定义):xwos_init()
  • 后初始化阶段(用户定义):xwos_postinit()
  • 主函数阶段(用户定义):xwos_main()

预初始化阶段

预初始化阶段,用户需要提供函数的定义: void xwos_preinit(void)

  • 需要完成CPU架构低级初始化,例如:中断的初始化,浮点运算单元的初始化等;
  • 需要完成对内存的初始化,以及数据区的重定向工作。

初始化阶段

初始化阶段的函数 void xwos_init(void) 由XWOS定义,对XWOS内核进行初始化。用户不可重新定义此函数。 xwos_init() 会访问全局变量,因此必须保证在 预初始化阶段 完成对内存的初始化以及数据区的重定向工作。 在多核系统中, xwos_init() 在每个CPU的初始化流程中都会被调用一次。

后初始化阶段

后初始化阶段,用户需要提供函数的定义: void xwos_postinit(void)

  • 用户可选择在此阶段完成驱动的初始化;
  • 用户可选择在此阶段完成动态内存分配器的初始化;

主函数阶段

  • 用户可选择在此阶段完成驱动的初始化;
  • 用户可选择在此阶段完成动态内存分配器的初始化;
  • 用户需要在此阶段建立线程;
  • 用户需要在此阶段调用 xwos_skd_start_lc() 启动调度器。

用户自定义的启动流程

如果用户使用自定义的启动流程,需要在调用XWOS任何API之前调用 xwos_init() 。 此函数会访问全局变量,需要在数据区重定向工作完成之后才可被调用。

在多核系统中, xwos_init() 需要在每个CPU的初始化流程中被调用一次。

自定义的启动流程举例

TODO