FastDDS
DDSDDS采用的通信模型是多对多单向数据交换,其中应用 生成数据,发布到属于应用的订阅者本地缓存中,这些应用正在消耗数据。 信息流由各实体之间建立的服务质量(QoS)政策监管 负责数据交换。DDS域内信息流动的概念图。 只有属于同一域的实体才能发现每个 其他则通过匹配主题。
DDS Domain
DDS安装12345678910111213141516171819202122232425mkdir ~/Fast-DDScd ~/Fast-DDSgit clone https://github.com/eProsima/foonathan_memory_vendor.gitmkdir foonathan_memory_vendor/buildcd foonathan_memory_vendor/buildcmake .. -DCMAKE_INSTALL_PREFIX=~/Fast-DDS/install -DBUILD_SHARED_LIBS=ONcmake --build . --target installcd ~/Fast-DDSgit clone https://github. ...
I/O多路复用
I/O多路复用I/O 多路复用 = 一个线程 / 进程,同时监听多个 I/O 对象的状态变化
通过一个系统调用,让内核同时监视多个文件描述符(fd),当其中任意一个 fd 满足条件(可读 / 可写 / 异常)时,返回通知用户态
为什么需要 I/O 多路复用?Linux 中的 I/O 特性
read / write 默认是阻塞的
socket / pipe / eventfd / timerfd 本质上都是 fd
常见错误模型
模型
问题
一个 fd 一个线程
线程爆炸、上下文切换高
while + 非阻塞轮询
CPU 空转
阻塞 read 顺序读
谁慢卡死谁
I/O 多路复用解决了什么?I/O 多路复用做了三件事:
把“等待”交给内核
让进程只在“有事发生”时被唤醒
一次返回“已经就绪的 fd 集合”
抽象模型12345678910111213141516┌──────────┐│ 用户线程 │└────┬───── ...
IMU传感器
1
IMUBMI160 是一款由 Bosch Sensortec 生产的 6轴惯性测量单元(IMU)。它集成了 三轴加速度计 和 三轴陀螺仪,主要用于精确的姿态、运动检测、导航和传感器融合任务。
三轴加速度计:
负责测量设备在三个正交轴(X、Y、Z)上的加速度。加速度计的常见用途包括检测设备的运动、震动和倾斜。
加速度范围通常有多个可选:±2g, ±4g, ±8g 和 ±16g(g = 重力加速度)。
三轴陀螺仪:
负责测量设备绕三个轴(X、Y、Z)的角速度。陀螺仪的常见用途是检测设备的旋转、角度变化和姿态调整。
陀螺仪的量程通常有多个选项:±125°/s, ±250°/s, ±500°/s 和 ±1000°/s。
获取IMU数据通过sys虚拟文件系统读取设备获取加速度计的分辨率 (in_accel_scale) 和陀螺仪的分辨率 (in_anglvel_scale),使用 writeSysfs() 函数向设备节点写入配置参数,如启用某些通道、设置触发器等。 readSysfsDouble() 函数用于从 sysfs 中读取浮 ...
共享内存
共享内存共享内存
共享内存是 Linux / Unix 系统提供的一种 进程间通信(IPC, Inter-Process Communication)机制:
允许 两个或多个进程访问同一块物理内存。
数据可以直接从内存中读写,无需复制,所以速度极快。
必须自己管理同步,否则会出现数据冲突或破坏。
Producer / Consumer 模式
Producer: 负责生产数据(Camera / RGA 输出)
Consumer: 负责消费数据(AI / 推理 / 模型)
核心原则:
Producer 不阻塞
Consumer 可以慢
buffer 生命周期清晰
特性
说明
零拷贝
Producer 写入内存,Consumer 直接读取,不经过 socket / 文件拷贝
低延迟
CPU 不用做序列化 / 反序列化操作
跨进程
只要进程映射了同一块共享内存,任何进程都能访问
必须同步
没有内置锁,需要 mutex / semaphore / condition ...
WS2812S总线灯
WS2812S总线灯 WS2812B 可编程 RGB LED 灯带 作为设备状态指示灯,通过 字符设备节点(如 /dev/ws2812b)进行控制。
型号:WS2812B
控制方式:单线串行
颜色通道:GRB(注意不是 RGB)
每颗灯占用:3 字节
熄灭灯2颗
1printf "\x00\x00\x00\x00\x00\x00" > /dev/ws2812b
点亮红色灯2颗
1printf "\x00\xFF\x00\x00\xFF\x00" > /dev/ws2812b
点亮绿灯2颗
1printf "\xFF\x00\x00\xFF\x00\x00" > /dev/ws2812b
点亮蓝色灯2颗
1printf "\x00\x00\xFF\x00\x00\xFF" > /dev/ws2812b
系统上下电启动
Buildroot系统(基于 BusyBox init + /etc/init.d)
系统启动 / 关机框架总览Buildroot 默认使用:
BusyBox init
启动脚本目录:/etc/init.d/
核心配置:/etc/inittab
上下电命令:
上电:内核 → init → rcS → S* 脚本
下电:poweroff → init → rcK / K* 脚本
启动顺序123456789101112U-Boot ↓Linux kernel ↓/sbin/init (BusyBox) ↓/etc/inittab ↓/etc/init.d/rcS ↓执行 /etc/init.d/S??*
所有 S??xxx 脚本都会按数字顺序执行 start
关机阶段123456789101112poweroff ↓BusyBox init ↓切换 runlevel 0 ↓执行 rcK ↓执行 /etc/init.d/K??* ↓卸载文件系统 / 断电
强调说明:下电时候的程序,无法执行带有动态库的二进制程序。
...
ISA和RISC-V
ISAISA是Instruction Set Architecture(指令集体系架构)缩写,指令集是一个计算机系统支持的所有机器指令的集合,常看作软硬件之间的分界面。指令集对上限定了软件的基本功能,对下制定了硬件实现的功能目标。
ISA指令集架构是底层硬件电路层面向上层软件程序提供的一层接口规范。定义了: 基本数据类型、寄存器、指令、寻址模式、异常或者中断的处理方式
ISA的宽度指的是CPU中的通用寄存器的宽度,这决定了寻址范围的大小、以及数据运行运算的能力。ISA的宽度和指令编码长度无关ISA可分为CISC和RISC。CISC是指复杂指令系统计算机,RISC是指精简指令系统计算机。
CISC:通过设置一些功能复杂的指令,把一些原来由软件实现的、常用的功能改用硬件指令实现,以此来提高计算机的执行速度。越来越多的复杂指令被加人指令系统中,逐渐形成了一个庞大且复杂的指令集。目标是强化指令功能,减少程序的指令条数,达到提高性能的目的。X86是现存唯一的CISC指令集。
RISC:尽量简化计算机指令功能,只保留那些功能简单、能在一个节拍内执行完成的指令,而把较复杂的功能用段子程序来实现。 ...
RVV向量扩展
RISC-V Vector Extension
RISC-V 向量扩展(RVV, RISC-V Vector Extension)中的指令可以大致分为三大类:设置向量长度(setvl)、加载/存储(load/store)、和 数学运算(mathematical operations)。以下是这三类指令的详细描述:
setvl 指令
setvl 指令用于设置向量长度,并返回当前向量长度。它是 RVV 中的核心指令,用于动态地控制每条指令处理的向量元素数量。通过设置向量长度寄存器(vl),可以使得后续的指令在处理数据时,按照给定的向量长度来处理。
指令格式:
1setvl xlen, rs1
功能:
设置向量长度(vl)。
rs1 寄存器的值决定了目标向量长度(vl)。
返回的向量长度会被存储在 vlen 寄存器中。
示例:
1setvl x0, x1 // 设置向量长度
加载/存储指令(Load/Store)
加载和存储指令用于将数据从内存加载到向量寄存器中,或者将向量寄存器中的数据存储回内存。这些指令的操作对象是向量寄存器,可以处理 ...
RVV的内存管理单元
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 ...
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 到目标代码映射:
在后 ...

