瑞芯微ROS
Buildroot配合ROS目标平台:rk3566
首先下载SDK包
123456789##搭建基础环境sudo apt-get install git ssh make gcc libssl-dev liblz4-tool expect \g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support \qemu-user-static live-build bison flex fakeroot cmake gcc-multilib \g++-multilib unzip device-tree-compiler ncurses-dev##解压tar -zxvf tspi_linux_sdk_20230916.tar.gzcd buildrootmake menuconfig
在menuconfig里使用/搜索格式查找ros软件包的位置以及依赖项。
1234Location: ...
无题
title:RVV IntrinsicRVV向量扩展向量扩展
使用 Intrinsics 的 C 语言 RISC-V 向量编程
RVV 的灵活性体现在以下几个方面:
向量长度的可变性:RVV 提供了灵活的向量长度(VL)设置,使得同一指令可以处理不同数量的数据元素。例如,你可以在同一程序中为不同的操作指定不同的向量长度,以适应硬件的能力或特定的计算任务。一个寄存器可以包含多个数据元素(例如 32 位整数、64 位浮点数等),并根据当前的 vl 设置来决定每个寄存器要处理多少数据元素。因此,向量寄存器组有时可以半满或不满——取决于 vl 设置以及每个操作处理的数据量。
向量寄存器组的大小:RISC-V 向量寄存器组通常由多个寄存器组成,每个寄存器的大小是固定的。寄存器的大小和数据类型(如整数或浮点数)是固定的,但由于 vl 是动态可调整的,寄存器的填充率可能会小于其最大容量。例如,假设一个寄存器是 128 位宽,如果你只需要处理 64 位的数据元素,寄存器的 “半满” 情况就可能发生。
指令和掩码的作用:在 RVV 中,某些指令可以允许掩码操作(例如,vfmv_v_f_f64m1), ...
无题
title:系统虚拟化和容器虚拟化将不存在的事务或者现象虚拟成为存在的事务或者现象方法。
指令集虚拟化
纯软件实现
模拟器
可以实现模拟环境中的程序
资源虚拟化
内存
网络资源
程序库级虚拟化
在应用程序和运行库间引入仿真的系统API
隐藏与操作系统相关的程序库细节
包括仿真、模拟、解释技术等
编程语言虚拟化
提供一套自定义的、处理器无关的编程语言指令集
屏蔽了硬件的异构性
解决了可执行程序在不同体系结构计算机间迁移的问题
系统虚拟化
针对计算机和操作系统
提供一个不存在的硬件如内存、磁盘等
旨在计算机系统上模拟运行多个操作系统平台。
无题
RVV的性能测试
进行数组上的数据相加合并12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182#include <stdio.h>#include <stdlib.h>#include <riscv_vector.h>#include <time.h>// 正常的数组相加函数void array_add_normal(size_t n, const float *a, const float *b, float *c) { for (size_t i = 0; i < n; i++) { c[i] = a[i] + b[i]; }}// 使用 RVV 向量化的数组相加函数void array_add_rvv(si ...
无题
RVOS系统start.s文件(.s文件是汇编语言源代码文件的扩展,包含了汇编语言代码,直接对应目标处理器的ISA)
一个典型的.s文件文件包含了以下几个部分:
数据段:存储程序使用的常量、字符串、数组等数据。
代码段:存储实际程序指令。
全局符号和标签:定义程序中的使用的标识符和函数名,供汇编器和链接器使用
编写一个简单RISC-V的系统
需要以下几个文件部分:
platform.h(硬件信息)
start.s(
初始化堆栈:为每个 hart 分配堆栈空间,并初始化栈指针 sp。
挂起非 hart 0 的核心:通过 wfi 指令将非 hart 0 的核心挂起,直到 hart 0 启动内核。
设置堆栈对齐:确保堆栈空间的对齐,以便符合 RISC-V 的 16 字节对齐规则。
多核心初始化:通过 hart id 为每个核心分配独立的堆栈空间。)
uart.c(交互显示)
宏定义uart所需要的寄存器。
uart初始化(打开或者关闭中断,设置串口的数据位、停止位、校验位、禁止波特锁存器)
定义uart输出函数输入函数
Makefile(编译的构建规则)
types.h(记录数据类型 ...
无题
title:llvm入门LLVM概念LLVM编译器是基于模块化、可扩展化的设计,将编译器过程分为多个阶段,而gcc编译器则是集成了多个前端和后端的传统编译器,设计更紧密一体化。
LLVM编译器因具有高度模块化的中间表示IR为基础,具有能实现更细粒度的优化。
LLVM结构
前端解析源代码,检查错误,并构建特定语言的抽象语法树(AST)来表示输入代码。AST额可以选择转换为新的表示形式来进行优化。
优化器负责进行各种转换以尝试提高代码的运行时间,例如消除冗余计算
后端将代码映射到目标指令集。除了编写正确代码之外,它还负责生成利用受支持架构的不寻常的功能的良好代码。后端常见部分包括指令选择、寄存器分配和指令调度。
编译构建LLVM123456789101112131415161718##git克隆LLVM-projectgit clone --depth 10 https://github.com/llvm/llvm-project.git git chectout 19.1.3mkdir buildcd buildcmake -G "Unix Makefiles" ...
无题
title:RVV向量化注意:
首先硬件可能支持不同版本的向量扩展,这之间不同版本互不兼容。
qemu上虽然可以跑RVV程序,但是开销比标量运算还大,所以只能做程序验证,实际运行效率要上实际的riscvgv的机器上才行。
ubuntu22.04尽管使用qemu但是也不支持rvv,因为kernel内核中的mstatus寄存器(机器模式下的状态寄存器)未初始化,当mstatus.vs域值被写0时候,试图执行向量指令或访问向量寄存器均会引发非法指令异常。
自动向量化和手动向量化
关于向量化:
对GCC或者LLVM进行开发(自动向量化)
**前端编译扩展 Target Transform Info (TTI)**:
定义目标架构的向量化能力(RVV 支持可扩展向量)。
例如为 RISC-V 增强 getRegisterBitWidth 和 getTypeLegalizationCost 方法。
修改 Loop 和 SLP Vectorizer:
添加对 RVV 动态向量寄存器的支持。
修改默认的向量化策略以生成动态向量类型。
支持 RVV 的 IR ...
无题
title:git使用回顾
使用ssh建立git仓库连接123ssh-keygen -t rsa -b 4096 -C "github@com"cat ~/.ssh/id_isa.pub#内容拷贝到github的ssh设置里
将本地与远程建立连接12345678910111213141516171819202122232425262728293031git remote add origin git@github.com:hanfengdyh/code.git##初始化git init##获取远程的分支git fetch origin##切换分支git checkout <branch-name>##添加内容git add filegit commit -m "information"git push orgin <branch-name>##创立分支git checkout -b <branch-name>##上传分支git push -u origin <branch-name>##合并分支 ...
RISCV内存管理单元
MMU(内存管理单元)虚拟内存在用户的视角里,每个进程都有自己独立的地址空间,A进程的4GB和B进程4GB是完全独立不相关的,他们看到的都是操作系统虚拟出来的地址空间。但是呢,虚拟地址最终还是要落在实际内存的物理地址上进行操作的。操作系统就会通过页表的机制来实现进程的虚拟地址到物理地址的翻译工作。其中每一页的大小都是固定的。页表管理有两个关键点,分别是页面大小和页表级数。
页表级数页表级数越少,虚拟地址到物理地址的映射就会越快,但是需要管理的页表项会越多,能支持的地址空间也有限,相反页表的级数越多,需要的存储的页表数据就会越少,而且能支持到比较大的地址空间,但是虚拟地址到物理地址的映射就会越慢。
PGD:Page Global Directory,页全局目录,它是多级页表的顶层,包含指向下一级页表的基地址。
PUD:Page Upper Directory, 页上级目录,位于PGD之下,包含了指向PMD的基地址。
PMD:Page Middle Directory,页中级目录,位于PUD之下,包含了指向PTE的及地址。
PTE:Page Table Entry,页表项,位于PM ...
无题
ISA和RISC-VISAISA是Instruction Set Architecture(指令集体系架构)缩写,指令集是一个计算机系统支持的所有机器指令的集合,常看作软硬件之间的分界面。指令集对上限定了软件的基本功能,对下制定了硬件实现的功能目标。
ISA指令集架构是底层硬件电路层面向上层软件程序提供的一层接口规范。定义了: 基本数据类型、寄存器、指令、寻址模式、异常或者中断的处理方式
ISA的宽度指的是CPU中的通用寄存器的宽度,这决定了寻址范围的大小、以及数据运行运算的能力。ISA的宽度和指令编码长度无关ISA可分为CISC和RISC。CISC是指复杂指令系统计算机,RISC是指精简指令系统计算机。
CISC:通过设置一些功能复杂的指令,把一些原来由软件实现的、常用的功能改用硬件指令实现,以此来提高计算机的执行速度。越来越多的复杂指令被加人指令系统中,逐渐形成了一个庞大且复杂的指令集。目标是强化指令功能,减少程序的指令条数,达到提高性能的目的。X86是现存唯一的CISC指令集。
RISC:尽量简化计算机指令功能,只保留那些功能简单、能在一个节拍内执行完成的指令,而把较复杂的功 ...