项目背景
OpenHW Group 是一个以协作方式开发开源硬件和相关软件的非营利组织,致力于开发、验证和提供开源处理器内核。OpenHW Group的开源项目致力于开发和验证基于免费和开放的RISC-V指令集架构 (ISA) 系列内核,称为 CORE-V系列。CV32E40P 开源处理器 IP 内核,这是 OpenHW CORE-V 系列中第一个经过全面验证的内核。本文的对象就是基于CV32E40P实现的开源CORE-V-MCU移植RT-Thread。
CORE-V-MCU目前是以软核的形式在FPGA上进行了实现,中科院 PLCT 实验室针对CV32E40P内核的CORE-V-MCU适配了QEMU,本文最终的验证在QEMU上进行。
相关链接
点击阅读原文获取
https://club.rt-thread.org/ask/article/24d7317f5125b054.html
前期准备
开发环境:ubuntu18.04
验证示例工程
本次实验验证的平台是PLCT提供的QEMU,在Linux下的QEMU可以使用上述的笔者编译好的,也可以使用自己尝试编译PLCT提供的源码。
OPENHW提供了基于FreeRTOS的示例工程,由于使用的是PLCT提供的QEMU,所以IDE中自带的工程并不能直接使用,为了避免不必要的麻烦,本文采用PLCT提供的示例工程。
下载好示例工程,进入到app目录,执行以下命令配置编译工程:
source ../env/core-v-mcu.sh
make RISCV=xxx //xxx为工具链的路径
编译完成后将生成的cli_test可执行文件拷到qemu的安装目录,运行下述命令验证工程;
./qemu-system-riscv32 -M core_v_mcu -bios none -kernel cli_test -nographic -monitor none -serial stdio
运行结果:

出现上述结果,则表示示例工程运行正常,这样我们就有一个可移植的模板工程,后续移植基于该工程开展。
移植RT-Thread
CV32E40P内核是一个RISC-V架构的内核,移植RTOS不可避免的会涉及到汇编部分的修改,所以在移植前期学习一下RISC-V架构与汇编会产生事半功倍的效果,同样在一之前需要熟悉CV32E40P的内核资源。
(https://docs.openhwgroup.org/projects/core-v-mcu/doc-src/overview.html)
cv32e40p继承自pulp开源的RI5CY内核,而RI5CY内核的对接代码在RT-Thread的仓库libcpu/riscv/rv32m1已经实现,所以以RI5CY中的代码为基础,移植cv32e40p的对接代码。
成功移植RT-Thread有如下几个关键的阶段:
节拍定时器正常工作
线程可以正常创建,调度(这步最难,需要前面好多工作来保证)
shell可以正常使用(从这开始就顺利多了)
RTOS的最小时间单位是系统节拍,系统正常工作需要节拍定时器的支持,因而以节拍定时器的移植为切入点展开移植。
core-v-mcu.c中放置的是系统初始化,中断处理相关代码。其中system_init函数完成了时钟初始化,串口,I2C等外设的初始化,以及中断函数的绑定。在文件的开头可以找到如下一个指针数组:
1void (*isr_table[32])(uint32_t);
该数组用于绑定中断入口函数。
1for (int i = 0 ; i < 32 ; i ++){
2 isr_table[i] = undefined_handler;
3 handler_count[i] = 0;
4}
5 isr_table[0x7] = timer_irq_handler;
6 isr_table[0xb] = (void(*)(uint32_t))fc_soc_event_handlzer1;
在system_init函数中我们可以找到上述代码,浏览该文件我们可以知道,timer_irq_handler即系统定时器的中断入口函数,
在原有FreeRTOS工程中该函数内容如下:
1void timer_irq_handler(uint32_t mcause)
2{
3#warning requires critical section if interrupt nesting is used.
4 if (xTaskIncrementTick() != 0) {
5 vTaskSwitchContext();
6 }
7}
该函数实现系统节拍的产生,所以将这里的内容修改为RT-Thread的节拍产生的方式,修改如下:
1void timer_irq_handler(uint32_t mcause)
2{
3#warning requires critical section if interrupt nesting is used.
4 rt_interrupt_enter();
5 rt_tick_increase();
6 rt_interrupt_leaves();
7}
涉及到中断,我们就得考虑系统的中断的实现方式,中断一般会分为向量中断与非向量中断。RISC-V常在启动后文件中进行中断模式的配置。从crt0.S文件可以找到如下代码:
1/* set vector table address */
2 la a0, __vector_star
RISC-V CORE-V-MCU移植RT-Thread实战指南

本文详细介绍了如何将RT-Thread实时操作系统移植到OpenHW Group的开源CORE-V-MCU,该MCU基于CV32E40P RISC-V内核。通过QEMU进行验证,涵盖了移植的关键步骤,包括系统初始化、中断处理、动态内存管理和shell功能。移植过程中涉及中断向量表、节拍定时器和上下文切换的修改,最终实现多任务调度和RT-Thread功能。
最低0.47元/天 解锁文章
2120

被折叠的 条评论
为什么被折叠?



