平头哥玄铁 E902 编译与使用

2023-12-14 09:12

本文主要是介绍平头哥玄铁 E902 编译与使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

玄铁 E902 是平头哥半导体有限公司自主研发的极低功耗、极低成本嵌入式 CPU 核,以 8 位 CPU 的成本获得 32 位嵌入式 CPU 的运行效率与性能。 E902 兼容 RISC-V 指令架构,采用 16/32 位混合编码系统,指令系统与流水线硬件结构精简高效,具备极低成本、极低功耗和高代码密度等优点。 E902 主要针对智能卡、智能电网、低成本微控制器、无线传感网络等嵌入式应用。

E902 核的 RTL 代码是开源的,开源版本仓库:https://github.com/T-head-Semi/opene902。

在这里插入图片描述

1、E902架构概述

E902 处理器体系结构的主要特点如下:

  • 支持 RISC-V RV32E[M]C 指令集;
  • 16 个 32 位通用寄存器;
  • 两级顺序执行流水线;
  • 支持 RISC-V 机器模式和用户模式;
  • 支持 RISCV debug 架构,支持标准五线 jtag 调试接口,支持 cjtag 两线调试接口;
  • 可配置的单周期硬件乘法器,多周期硬件除法器;
  • 兼容 RISC-V CLIC 中断标准,支持中断嵌套,外部中断源数量最高可配置 240 个;
  • 兼容 RISC-V PMP 内存保护标准, 0/4/8/12/16 区域可配置;
  • 支持 AHB-Lite 总线协议,支持指令总线,系统总线;
  • 支持可配置的指令高速缓存,缓存行 16 字节,容量 2KiB/4KiB/8KiB 可配;
  • 支持平头哥扩展编程模型;
  • 支持复位启动地址硬件集成时可配置;
  • 支持软复位操作

在这里插入图片描述

流水线

E902 处理器采用 2 级流水线结构:取指和执行。

  • 指令取指阶段主要负责从内存中获取指令。
  • 指令执行阶段主要负责指令译码、执行和回写。

PMP

可配置的物理内存保护单元(Physical Memory Protection,PMP)负责物理地址的权限检查实现内存的保护功能,权限可划分为:不可读写/只读/可读写,可执行/不可执行。

调试

TDT 调试单元(T-Head Debug Trace)支持各种调试方式,包括软件断点、内存断点、单步和多步的指令跟踪等多种方式,可在线调试 CPU、通用寄存器(GPR)、控制寄存器(CSR)和内存。

紧耦合 IP 架构

为了提高 E902 的系统集成度,方便用户集成与开发,E902 设置内部总线用于集成紧耦合 IP(Tightly Coupled IP,TCIP)。这些紧耦合 IP 包括兼容 RISC-V 标准的 CLINT 和矢量中断控制器 CLIC。

中断控制器

矢量中断控制器的主要特征包括:

  • 支持 1-240 个外部中断源;
  • 支持中断嵌套;
  • 支持电平中断和脉冲中断;
  • 中断优先级 4/8/16/32 任意可配。

总线

E902 的系统总线接口支持 AMBA3.0 AHB-Lite 协议

性能

Dhryston:1.55 DMIPS/MHZ(O2)
CoreMark:2.69 CoreMark/MHZ(O3)

在这里插入图片描述

E902 对标的是 ARM Cortex-M0+。Cortex-M0+ 的 CoreMark 值为 2.46 CoreMark®/MHz,M0 内核的2.33 CoreMark/MHz。

2、通用寄存器

寄存器ABI 名称描述
x0zero零值
x1ra返回地址
x2sp堆栈指针
x3gp全局指针
x4tp线程指针
x5t0临时/备用链接寄存器
x6-7t1-2临时寄存器
x8s0/fp保留寄存器/帧指针
x9s1保留寄存器
x10-11a0-a1函数参数/返回值
x12-15a2-a5函数参数

3、SDK

平头哥提供了 E902 和 E902M 的 SDK,应该分别对应 RV32E 和 RV32EM,下载链接:https://www.xrvm.cn/community/download?id=658699855023046656。

SDK 编译的 elf 可以在平头哥提供的 QEMU 上直接运行。

qemu 在运行中可能会出现依赖未安装的情况,可执行以下命令:

$ sudo apt-get install -y libsnappy-dev libpixman-1-dev libpixman-1-dev libjpeg-dev libdaxctl-dev libvdeplug-dev libpmem-dev libgbm-dev libepoxy-dev libgtk-3-0 libaio1 libslirp-dev 

ubuntu 22.04 下可能还需要安装以下依赖:

$ sudo apt-get install -y libcapstone-dev libspice-server-dev libsdl2-2.0-0 libsdl2-image-2.0-0 libvirglrenderer-dev libcacard-dev libusbredirparser1 libfuse3-3 libiscsi7 librbd1
  1. 编译
$ cd SmartL_E902-R2S2-V1.7.11/projects/examples/hello_world
$ make
  1. 运行
  • E902
$ qemu-system-riscv32 -M smartl -cpu e902 -kernel out/smartl_e902_evb.elf -nographic -m 128M
Hello World!
Hello_World runs successfully!
  • E902M
$ qemu-system-riscv32 -M smartl -cpu e902m -kernel out/smartl_e902_evb.elf -nographic -m 128M

这篇关于平头哥玄铁 E902 编译与使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/491946

相关文章

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud