# ec_charger **Repository Path**: xu_415/ec_charger ## Basic Information - **Project Name**: ec_charger - **Description**: 这是一个pd充电方案的示例代码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-20 - **Last Updated**: 2026-10-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Huawei LiteOS QEMU RISC-V 示例 一个可以直接编译、运行的华为 LiteOS 最小示例工程: - 内核:Huawei LiteOS 5.1.0(RISC-V 32 位移植) - 目标板:`qemu-system-riscv32 -machine virt`(RV32, M-mode) - 串口:NS16550A UART0,地址 `0x10000000` - 功能:启动后创建 `helloTask`,每 1 秒通过串口打印一行 `hello` ## 快速开始 环境要求: - Linux 或 WSL - `qemu-system-riscv32`(Ubuntu 上由 `qemu-system-misc` 提供) - RISC-V 裸机工具链 `riscv64-unknown-elf-gcc` - GNU make、python3 如果系统里没有 RISC-V 工具链,可以运行下面的脚本。它会把 Ubuntu 软件包 下载并解压到工程内的 `.toolchain/`,不需要 root 权限: ```bash ./scripts/setup-toolchain.sh ``` 编译并运行: ```bash ./build.sh ./run.sh ``` 如果系统已经安装了 make,也可以使用: ```bash make make run ``` 运行后串口输出类似: ```text ********Hello Huawei LiteOS******** LiteOS Kernel Version : 5.1.0 Platform : qemu-virt-riscv32 build date : Oct 20 2026 12:30:00 ********************************** OsAppInit cpu 0 entering scheduler app init! hello hello hello ... ``` `hello` 每秒输出一次。在 `-nographic` 模式下,先按 `Ctrl-A`,再按 `X` 退出 QEMU。 ## 目录结构 ```text . ├── LiteOS/ # 精简后的 LiteOS 源码 │ ├── targets/qemu-virt-riscv32/ # 本示例的 BSP 与应用程序 │ │ ├── main.c # BoardConfig / main │ │ ├── uart.c # NS16550A 轮询串口驱动 │ │ ├── timer.c # CLINT 定时器 │ │ ├── user_task.c # helloTask │ │ ├── liteos.ld # 链接脚本 │ │ └── include/ # 板级头文件 │ └── tools/build/config/qemu-virt-riscv32.config ├── scripts/ │ ├── setup-toolchain.sh # 无 root 安装本地工具链 │ ├── build.sh # 编译 │ └── run-qemu.sh # 运行 QEMU ├── build.sh ├── run.sh ├── Makefile └── README.md ``` ## 实现说明 ### 启动流程 QEMU 使用如下命令启动: ```bash qemu-system-riscv32 -machine virt -bios none -m 128M -nographic \ -kernel LiteOS/out/qemu-virt-riscv32/Huawei_LiteOS.elf ``` `-bios none` 表示不加载 OpenSBI,CPU 直接在 M-mode 从 `0x80000000` 开始执行 ELF 入口。入口是 LiteOS RISC-V 移植自带的 `reset_vector`, 它设置 `mtvec`、`gp`、`sp` 后调用 `BoardConfig()` 和 `main()`。 ### 串口 UART0 是 QEMU virt 上的 NS16550A: | 寄存器 | 偏移 | | --- | --- | | THR / DLL | `0x00` | | IER / DLM | `0x01` | | FCR | `0x02` | | LCR | `0x03` | | LSR | `0x05` | `uart.c` 实现了 LiteOS 的 `UartControllerOps`,以轮询方式发送字符。 内核的 `PRINTK` 调用 `UartPuts()`,最终写入 UART 的 THR 寄存器。 ### 定时器与中断 - CLINT 位于 `0x02000000`,`mtime` 频率为 10 MHz。 - 系统节拍配置为 1000 Hz,因此每个 tick 为 10000 个 CLINT 周期。 - tick 中断处理函数把 `mtimecmp` 增加一个 tick,并调用 `OsTickHandler()`。 - PLIC 位于 `0x0C000000`。与 LiteOS 现有的 RISC-V 移植一致,机器定时器 中断使用 `LOSCFG_PLATFORM_HWI_LIMIT + 1` 作为逻辑中断号。 `helloTask` 使用 `LOS_TaskDelay(1000)` 延时 1000 个 tick,即 1 秒。 ### 内存映射 | 地址 | 设备 | | --- | --- | | `0x80000000` | 128 MiB RAM(ELF 加载地址、内核堆) | | `0x02000000` | CLINT | | `0x0C000000` | PLIC | | `0x10000000` | UART0 | ## LiteOS 来源与修改 LiteOS 源码来自 Gitee 官方仓库: - 仓库: - 提交:`ec2f62b79514c2edce90eb979a624ec815b6a391`(2022-04-08,LiteOS 5.1.0) 为了在 QEMU virt + 现代 GCC 上运行,做了以下修改: 1. 新增目标 `targets/qemu-virt-riscv32/` 和 `targets/Kconfig.qemu` 条目。 2. 新增默认配置 `tools/build/config/qemu-virt-riscv32.config`,并生成 `targets/qemu-virt-riscv32/include/menuconfig.h`。 3. `arch/riscv/cpu.mk`: - 使用 `-march=rv32imc_zicsr_zifencei`;新版 binutils 要求显式声明 `zicsr`/`zifencei`。 - 为目标增加 `-mabi=ilp32 -mcmodel=medlow`。 4. `arch/riscv/rvm32/src/exception.S`:`mbadaddr` 改为 `mtval` (新版汇编器已移除旧 CSR 名)。 5. `drivers/interrupt/riscv_plic.c`:QEMU 的 `mtime` 是自由运行计数器, 定时器中断不再把 `mtime` 清零,而是由 BSP 重新设置 `mtimecmp`。 6. `drivers/interrupt/include/hal_hwi.h`:允许新目标使用 CLINT 逻辑中断号。 7. `build/mk/los_config.mk`: - 关闭 `-Werror`(旧内核在新 GCC 上会产生新告警)。 - RISC-V 直接使用 `ld` 链接时改用 `--gc-sections`,避免向 `ld` 传递 GCC 驱动才支持的 `-nostartfiles`/`-static`。 - `PYTHON` 改为 `python3`。 8. `tools/menuconfig/Makefile.kconfig`:使用 `$(PYTHON)`;并加入 `kconfiglib.py`、`menuconfig.py`,这样 `make clean` 后重新生成配置 不依赖系统 pip 包。 为了减小仓库体积,删除了 `doc/`、`tests/`、`targets/bsp/drivers/` 以及未使用的其他板级目录;Kconfig 与构建系统保持完整。 ## 测试环境 - Ubuntu 26.04(WSL2) - QEMU 10.2.1 - `riscv64-unknown-elf-gcc` 14.2.0(Ubuntu `gcc-riscv64-unknown-elf`) ## 许可 `LiteOS/` 目录下是华为 LiteOS 源码,遵循其 BSD-3-Clause 许可,详见 `LiteOS/LICENSE` 和 `LiteOS/NOTICE`。`tools/menuconfig/kconfiglib.py` 与 `menuconfig.py` 来自 `python3-kconfiglib`(ISC 许可)。