开发 QuickVisor BSP 工程
BSP 工程简介
板级支持包工程(Board Support Package)通常简称为 BSP 工程,主要包含跟板卡密切相关的启动代码和设备驱动代码,负责处理器的启动引导、时钟树的初始化、物理内存和地址空间的管理、中断的配置和处理,向内核提供标准的硬件访问接口和设备对象。
创建 BSP 工程
BSP 工程的创建流程
首先,选择 File > New > QuickVisor BSP 菜单,开始创建 BSP 工程,为新建的 BSP 工程输入名称,单击 Next 按钮进入编译配置界面。
然后,右键工程 Propeities -> QuickVisor Setting -> BSP Setting 进入 BSP Setting 配置页面。
接着,选中目标工程单击右键选择 Build Project 或者单击工具栏的一键编译按钮,进行工程编译。
BSP 工程的目录结构
BSP 工程模板的目录结构如下:
项目 | 说明 |
---|---|
/src/docs/* | 板级支持包相关的芯片手册和调试手册。 |
/src/drvs/* | 板级支持包包含的设备驱动源码文件。 |
/src/test/* | 板级支持包的测试程序或测试报告。 |
/src/startup.S | 板级支持包的汇编引导程序,启动执行的第一行代码。 |
/src/bsp_init.c | 板级支持包的 C 语言初始化程序,调用内核初始化接口并注册相关设备驱动对象。 |
/src/bsp_libs.c | 板级支持包需要提供给内核使用的标准接口和相关回调函数。 |
/config.h | 板级支持包相关的内存和设备地址空间,以及设备中断号等配置信息。 |
/readme.txt | 板级支持包相关的使用文档,以及硬件平台的基本信息和参考资料链接。 |
实现 BSP 工程
BSP 工程初始化流程
注意:系统初始化的完整逻辑可以在 BSP 模板工程中的 startup.S 和 bsp_init.c 文件中找到。
QuickVisor BSP 系统初始化主逻辑如下:
- CPU 复位,跳转到汇编入口。
- CPU 运行模式初始化、初始化启动栈、异常向量表初始化、.data 和 .bss 段初始化、跳转到 C 函数入口。
- 初始化调试打印端口、初始化系统核心、创建 boot_thread 用于执行第二阶段的系统初始化、启动多任务系统。
- 执行 boot_thread:注册驱动程序、注册设备实例、创建控制台线程、解析并创建虚拟机实例、多核唤醒。
- CPU Core 运行,开始执行系统任务。
BSP 需要实现的接口
注意:BSP 接口的详细定义可以在 quickvisor/libquickvisor/src/include/bsp/qv_bsp.h 头文件中找到。
QuickVisor BSP 需要实现的接口如下:
函数名称 | 功能描述 |
---|---|
qv_bsp_hyp_params | 内核初始化物理内存、地址空间 和 ROMFS 后,将调用该函数获取内核配置。 |
qv_bsp_idle_hook | 当 CPU 空闲时将执行 idle 线程,idle 线程将调用该函数。 |
qv_bsp_delay_loop | 该函数实现指定时长的循环计数。 |
qv_bsp_logic_cpuid | 该函数用于获取当前 CPU 的逻辑 ID 号。 |
qv_bsp_printk | 该函数用于打印调试信息。 |
qv_bsp_boot_addr | 该函数用于获取指定 CPU 启动后执行代码的起始物理地址。 |
qv_bsp_boot_stack | 该函数用于获取指定 CPU 启动时使用的临时栈的地址和大小。 |
qv_bsp_sys_reboot | 该函数用于重启整个系统。 |
qv_bsp_sys_shutdown | 该函数用于关闭整个系统。 |
qv_bsp_irq_chip_init | 该函数用于初始化 interrupt 控制器。 |
qv_bsp_cpu_timer_init | 该函数用于初始化 percpu 定时器。 |
qv_bsp_smp_chip_init | 该函数用于初始化 smp 管理单元。 |