RISCV Vector
注意:
首先硬件可能支持不同版本的向量扩展,这之间不同版本互不兼容。
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 到目标代码映射:
在后 ...
ISA AND RISCV
ISA和RISC-VISAISA是Instruction Set Architecture(指令集体系架构)缩写,指令集是一个计算机系统支持的所有机器指令的集合,常看作软硬件之间的分界面。指令集对上限定了软件的基本功能,对下制定了硬件实现的功能目标。
ISA指令集架构是底层硬件电路层面向上层软件程序提供的一层接口规范。定义了: 基本数据类型、寄存器、指令、寻址模式、异常或者中断的处理方式
ISA的宽度指的是CPU中的通用寄存器的宽度,这决定了寻址范围的大小、以及数据运行运算的能力。ISA的宽度和指令编码长度无关ISA可分为CISC和RISC。CISC是指复杂指令系统计算机,RISC是指精简指令系统计算机。
CISC:通过设置一些功能复杂的指令,把一些原来由软件实现的、常用的功能改用硬件指令实现,以此来提高计算机的执行速度。越来越多的复杂指令被加人指令系统中,逐渐形成了一个庞大且复杂的指令集。目标是强化指令功能,减少程序的指令条数,达到提高性能的目的。X86是现存唯一的CISC指令集。
RISC:尽量简化计算机指令功能,只保留那些功能简单、能在一个节拍内执行完成的指令,而把较复杂的功 ...
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_ ...
git使用回顾
使用ssh建立git仓库连接123ssh-keygen -t rsa -b 4096 -C "github@com"cat ~/.ssh/id_isa.pub#内容拷贝到github的ssh设置里
将本地与远程建立连接123456789101112131415161718192021222324git remote add origin git@github.com:..... .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>##合并分支##获取最新的分支和改变git fetch origingit checko ...
泰山派(瑞芯微SDK编译烧录)
瑞芯微RK3566立创·泰山派开发板主控采用Rockchip(瑞芯微)的中高端AIOT芯片RK3566 ,4核Cortex-A55的64位CPU,主频高达1.8GHz;集成ARM Mali-G52 GPU,支持4K 60fps解码,1080P 60fps编码,支持8MSP和HDR;内置1Tops算力的AI加速器NPU。
编译SDK
下载板子的SDK,并解压SDK的压缩包
123$ tar -xvzf tspi_linux_sdk_repo_20240131.tar.gz#提取代码repo的代码$ .repo/repo/repo sync -l -j88
安装配套工具
安装git
1sudo apt-get install git -y
安装repo
1sudo apt install repo -y
安装python2
1sudo apt-get install python2.7
安装python3
1sudo apt-get install python3
安装buildroot,这两个压缩包放入一个文件夹中。
1tar -xzf buildroot_dl_4c7c9df ...
ROS2
ROS2(Robot Operating System 2)是一个用于机器人和自动化系统开发的开源软件平台。
ROS2的系统架构
OS层
OS层,在ROS2中可以构建在linux上,也可以构建在其它系统上,甚至是没有操作系统的裸机。
中间层
ROS1的通信系统基于TCPROS/UDPROS,而ROS2的通信系统基于DDS。DDS是一种分布式实时系统中数据发布/订阅的标准解决方案。
应用层
ROS1依赖于ROS Master,而在ROS2中,节点之间使用一种称为“Discovery”的发现机制来帮助彼此建立连接。
DDSDDS是“Data Distribution Service”的缩写,是一种面向实时和嵌入式系统的标准化、可互操作的消息传递协议。DDS旨在实现在分布式环境中高效且可扩展地交换数据。它通常用于需要高性能、低延迟和可靠性的系统。它提供了一个中间件层,抽象了分布式通信的复杂性,使开发人员更容易构建可扩展和可靠的系统。
DDS的主要特点包括:
发布-订阅模型:
DDS采用发布-订阅通信模型。数据生产者(发布者)发布信息,数据消费者(订阅者)接收他们感兴趣的 ...
NVIDIA X AVIER编译内核配置开发环境
使用flash刷机使用命令查询自己机器上的版本号,开发相关的root file system、kernel、bootloader需要和机器上烧录的jetpack版本一样。
12head -n 1 /etc/nv_tegra_release# R35(release),REVISION:5.0,GCID:35550180,BOARD:t186ref,EABI:aarch64,DATE:...
前面为大版本 ,后面是小版本号,所以这个版本号是35.5.0
所以我之后的源码包为这个版本的开发,下载地址为https://developer.nvidia.com/embedded/jetson-linux-r3550
先安装实例系统包
Jetson_Linux_R35.5.0_aarch64.tbz2
Tegra_Linux_Sample-Root-Filesystem_R35.5.0_aarch64.tbz2
12345678tar -xf Tegra186_Linux_R32.4.4_aarch64.tbz2cd Linux_for_Tegra/rootfssudo tar -xpf ...
NVIDIA X AVIER
使用的Ubuntu版本为18.04,配置如下:
13G内存
80G存储
安装sdkmanager安装地址在https://developer.nvidia.com/embedded/downloads
之后在Ubuntu上安装
123sudo apt install sdkmanager_1.9.2-10899_amd64.deb#安装过后使用命令打开sdkmanager
之后登录发现出现Authorization flow not allowed - invalid_request的报错,经过查询为sdk的版本过低,使用命令让sdk进行更新
1sdkmanager --checkforupdates
按中间和左侧的按钮两秒进入刷机模式
STEP1 中选择自己的设备XAVIER
STEP2 选择安装的包
STEP3 到安装百分之30多时候,机器连接显示器进行安装系统,之后使用终端命令进行查询IP地址,在下一个部分会用到,
可以选择USB还是网络,USB会有报错,所以使用的网络,这个网络ip地址就是机器连接网络的ip地址(这里要保证ip地址和Ubuntu的地址处在同一 ...
程序上电自启动
设备上电自启动服务和程序使用设备依旧为AG215S
开机自启动方式有init.d和systemctl。
使用命令查询安卓版本号
12adb shell getprop ro.build.version.release202306281416#返回的信息
init.d自启动的方法
方法限制条件
Android设备的init进程支持init.d目录。
设备已经取得root权限(超级用户权限)。
确认init.d目录是否存在:
在Android设备上,init.d目录通常位于 /system/etc/init.d/。您可以通过连接到设备的ADB Shell来检查是否存在:
1adb shell ls /system/etc/init.d/
经过查询,AG215S并不存在。
目录可手动创建
123mkdir etccd etcmkdir init.d
创建自启动脚本
在init.d目录下创建一个Shell脚本文件,例如 start.sh:
123456systemctl start qrtr # 开启qrtr功能qmi_test_service_test ...
v2v的调试
学习内容通过一周学习到了一些新的知识并对嵌入式的应用层开发进行了技术栈的补充,新知识例如自动驾驶的cv2x,以及正在做的V2V部分。主要是编译了固件来支持应用层的开发,学习了使用工具adb来进行调试内核,烧录文件,并且通过设备对于V2V来进行相互通信。
1.固件编译固件编译部分跟之前没有太大的不同,差异点主要在需要在Linux搭载代理服务来进行编译,因为芯片是高通的,可能由于一些带宽和信号延时问题,导致会有编译报错,之后可以在自己电脑虚拟机上进行代理设置玩玩,但是clash现在删库了,可能需要寻找新的方法来代替。
烧录固件使用的软件为QFil,它烧录需要点运气的成分,会出现找不到指定文件的问题还有process fail的问题,解决方法就是下载最新的QPST,并且使用Tools选项来进行烧录固件,可以在烧录固件之前使用QPST Configuration来查询串口的状态是否enable。经过查询发现,这个软件经常使用在给手机进行刷机(刷系统)。
2.硬件验证将固件烧录成功后,使用adb进入调试,并输入命令开启进行验证服务。
adb 是 Android 调试桥(Android Debu ...