OPENHW开源CORE-V-MCU移植RT-Thread

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

项目背景

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

运行结果:

e223622599fc9cc178db5c06637231a5.png

出现上述结果,则表示示例工程运行正常,这样我们就有一个可移植的模板工程,后续移植基于该工程开展。

移植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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值