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" \ -DCMAKE_ ...
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(size_t n, co ...
RVV Intrinsic
RVV向量扩展向量扩展
使用 Intrinsics 的 C 语言 RISC-V 向量编程
RVV 的灵活性体现在以下几个方面:
向量长度的可变性:RVV 提供了灵活的向量长度(VL)设置,使得同一指令可以处理不同数量的数据元素。例如,你可以在同一程序中为不同的操作指定不同的向量长度,以适应硬件的能力或特定的计算任务。一个寄存器可以包含多个数据元素(例如 32 位整数、64 位浮点数等),并根据当前的 vl 设置来决定每个寄存器要处理多少数据元素。因此,向量寄存器组有时可以半满或不满——取决于 vl 设置以及每个操作处理的数据量。
向量寄存器组的大小:RISC-V 向量寄存器组通常由多个寄存器组成,每个寄存器的大小是固定的。寄存器的大小和数据类型(如整数或浮点数)是固定的,但由于 vl 是动态可调整的,寄存器的填充率可能会小于其最大容量。例如,假设一个寄存器是 128 位宽,如果你只需要处理 64 位的数据元素,寄存器的 “半满” 情况就可能发生。
指令和掩码的作用:在 RVV 中,某些指令可以允许掩码操作(例如,vfmv_v_f_f64m1),这意味着某些元素可能会被忽略或处理为零, ...
Riscv汇编入门
RISC-V汇编语言入门一个完整的RISC-V汇编程序是多条语句组成。
一条典型的RISC-V汇编语句由三部分组成:[label:] [operation] [comment]
12_start:#可以将_start这个label理解为地址 li x6 ,5
汇编指令编码格式
指令长度:ILEN1 = 32bits(RV32I)
指令对齐:IALIGN=32bits(RV32I)
指令在内存中按照小端序排列
机器源码和汇编指令的对应关系
比如机器源码0110011,每个机器源码是7位,最后2位都是11,[6:5]的是纵坐标,[4:2]的是横坐标,所以对应关系是OP指令

补码/反码、零扩展和符号位扩展(Zero extension and Sign extension)-CSDN博客
符号扩展(Sign Extension)
符号扩展用于扩展有符号数(例如,有符号的整数)。在扩展时会保持原数值的符号位。
方法:在扩展位上填充原数值 ...
RVOS系统
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(记录数据类型 ...
buildroot上用npm安装包
Buildroot通过npm安装nodejs应用包的方式首先buildroot安装nodejs,以及附带npm是可以的但是npm但是的位置不是target的系统目录中,是安装到host主机目录下面。
设置环境变量
12345678910111213141516171819export TARGET_STAGING=/home/zext/RV1126B/buildroot/output/rockchip_rv1126b/host/usr# Node-gyp native 编译工具链export CC=/home/zext/RV1126B/buildroot/output/rockchip_rv1126b/host/bin/aarch64-buildroot-linux-gnu-gccexport CXX=/home/zext/RV1126B/buildroot/output/rockchip_rv1126b/host/bin/aarch64-buildroot-linux-gnu-g++export AR=/home/zext/RV1126B/buildroot/output/rockc ...
ROS2内容
ROS2 DDS作用域ros2的环境变量ROS_DOMAIN_ID,继承DDS体系,域是链接共享相同与ID的所有应用程序的全局数据空间,域彼此独立,DDS应用程序在一个域内发送和接收数据。一个网络可以有多个不同的域,一个域可以跨不同的网络。同域可以自由发现并相互发送消息,不同域则不能。默认以0作为域ID。避免同一网络上运行ROS2不同计算机组之间的干扰,可以为不同组发送不同域ID。
12export ROS_DOMAIN_ID 21ros2 node list -a
通过程序rclcpp或者rclpy可以设置ID,以下为rclcpp设置域ID
123456789101112#include <memory>#include "rclcpp/rclcpp.hpp"#include "ch2_node_cpp/node2go.hpp"int main(int argc, char** argv){ rclcpp::InitOptions init_option; init_option.set_domain_id( ...
瑞芯微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:系统虚拟化和容器虚拟化将不存在的事务或者现象虚拟成为存在的事务或者现象方法。
指令集虚拟化
纯软件实现
模拟器
可以实现模拟环境中的程序
资源虚拟化
内存
网络资源
程序库级虚拟化
在应用程序和运行库间引入仿真的系统API
隐藏与操作系统相关的程序库细节
包括仿真、模拟、解释技术等
编程语言虚拟化
提供一套自定义的、处理器无关的编程语言指令集
屏蔽了硬件的异构性
解决了可执行程序在不同体系结构计算机间迁移的问题
系统虚拟化
针对计算机和操作系统
提供一个不存在的硬件如内存、磁盘等
旨在计算机系统上模拟运行多个操作系统平台。
无题
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>##合并分支 ...

