树莓派配置
Wifi认证及静态IP
1 | ### Raspbian |
树莓派连接游戏手柄
驱动
xpadneo
依赖
1 | Raspbian |
安装
1 | git clone https://github.com/atar-axis/xpadneo.git |
连接
1 | bluetoothctl |
其他
1 | 查看设备 |
使用
Python
安装依赖
1 | sudo pip3 install evdev asyncio |
测试
1 | $ cd xpadneo/misc/examples # 克隆下来的Git仓库 |
按键
按键 | code | type | 值类型 |
---|---|---|---|
LT | 10 | 03 | 区间,0~1023 |
RT | 09 | 03 | 区间,0~1023 |
LB | 310 | 01 | 单值,00,01 |
RB | 311 | 01 | 单值,00,01 |
左摇杆 Y轴 | 01 | 03 | 区间,0~65535 |
左摇杆 X轴 | 00 | 03 | 区间,0~65535 |
右摇杆 Y轴 | 05 | 03 | 区间,0~65535 |
右摇杆 X轴 | 02 | 03 | 区间,0~65535 |
视图 | 158 | 01 | 单值,00,01 |
菜单 | 315 | 01 | 单值,00,01 |
十字键 上 | 17 | 03 | 单值,00,-1 |
十字键 下 | 17 | 03 | 单值,00,01 |
十字键 左 | 16 | 03 | 单值,00,-1 |
十字键 右 | 16 | 03 | 单值,00,01 |
Y | 308 | 01 | 单值,00,01 |
X | 307 | 01 | 单值,00,01 |
A | 304 | 01 | 单值,00,01 |
B | 305 | 01 | 单值,00,01 |
注
- 摇杆X轴左侧为0,Y轴上侧为0
树莓派连接硬件
Speaker
1 | play audio |
Camera
Web Stream
1 | install |
Reference
1 | setup and test |
L298N
参考
树莓派配置
linux-headers / kernel-headers
1 | Raspbian |
GPIO
1 | pip3 install RPIO |
Linux之查看设备
CPU
1 | lscpu |
PCI 设备
1 | lspci |
块设备信息
1 | lsblk |
参数
-f
显示文件系统信息-a
显示所有设备
硬盘
初始化步骤
- 创建分区表
- 创建分区
- 格式化分区
- 挂载分区
- 配置启动时挂载
列出设备及分区信息
1 | parted -l |
初始化设备
格式化
1 | mkfs [options] [-t type fs-options] device [size] |
示例
1 | sudo mkfs -t ext4 /dev/sda |
类型
- ext4
- FAT32
- NTFS
使用中无法格式化
1 | dmsetup status |
创建主分区
打开存储盘
1 | sudo parted -a optimal /dev/sda |
创建分区表
1 | (parted) mklabel [partition_table_type] |
分区表类型
- aix
- amiga
- bsd
- dvh
- gpt
- mac
- ms-dos
- pc98
- sun
- loop
示例
1 | (parted) mklabel gpt |
检查
1 | (parted) print |
创建分区
1 | 主分区 |
示例
1 | (parted) mkpart primary 0.00B 100GB # 按容量 |
格式化分区
1 | sudo mkfs.ext4 /dev/sda1 |
自动挂载分区
1 | sudo mkdir data |
1 | echo -e "UUID=$(sudo blkid -o value -s UUID /dev/sdb1)\t/data\text4\tdefaults\t0 0" | sudo tee -a /etc/fstab |
示例
1 | sudo parted /dev/sda |
注 创建分区表时 4096s
的取值,可以参考 这里 和 这里。
脚本创建分区 & 格式化
1 | 分区 |
创建 LVM 分区
概念
- 物理卷(Physical Volumes)
- 卷组(Volume Groups)
- 逻辑卷(Logical Volumes)
查看信息
查看所有 LVM 可以管理的块设备
1 | sudo lvmdiskscan |
查看物理卷信息
1 | sudo lvmdiskscan -l |
查看 Volumn Group 的信息
1 | sudo vgscan |
查看 Logical Volumn 信息
1 | sudo lvscan |
创建 LVM 卷
从 Raw Storage Device 创建 Physical Volumes
1 | 列出所有可用的设备 |
如果没有列出目标设备,可能是设备使用了不支持的分区表。重新设置设备的分区表为兼容的 BIOS 表。
1 | sudo parted /dev/sda |
标记存储设备为 LVM 物理卷。
1 | sudo pvcreate /dev/sda |
从 Physical Volumes 创建 Volume Group
1 | sudo vgcreate lvm-storage /dev/sda |
从 Volume Group 创建 Logical Volume
1 | 创建指定 size |
格式化分区
1 | sudo mkfs.ext4 /dev/<lvm-vg-name>/<lvm-lv-name> |
挂载 LV
1 | sudo mount /dev/<lvm-vg-name>/<lvm-lv-name> /path/to/destination |
自动挂载
1 | 查看 logical volume 的 uuid |
更多操作
向 Volume Group 添加 Physical Volume
1 | sudo vgextend <volume-group-name> /dev/sdb |
增加 Logical Volume 的空间
Solution 1
1 | sudo lvresize -L +5G --resizefs <lvm-vg-name>/<lvm-lv-name> # 调整 lvm size |
注意: lvresize 之后通过 df -h 查看空间,并不会生效,需要再运行 resize2fs
Solution 2
为 Ubuntu 的 lv 分区扩容
1 | sudo vgdisplay # 查看 vg 信息 |
删除 Logical Volume
1 | sudo umount /dev/<lvm-vg-name>/<lvm-lv-name> |
删除 Volume Group
1 | sudo umount /dev/<lvm-vg-name>/* # unmount vg 下所有 lv |
删除 Physical Volume
1 | sudo pvremove /dev/sda |
挂载新硬盘
1 | 创建文件系统 |
查看接口
1 | sudo dmidecode --type connector |
参考
Linux之网络配置
DNS
Debian+
1 | interfaces; configured by dns-nameserver |
Proxy
全局代理
1 | export http_proxy=socks5://<host>:<port> |
适用
- cURL
Git 代理
1 | 设置代理 |
CMD ip
1 | via : [FAMILY] ADDRESS, 指定下一跳地址 |
table
1 | show table |
rule
1 | show rule |
gateway
1 | 添加 |
静态路由
1 | github ip 走网关 192.168.6.68 |
CMD route
1 | 添加路由 |
Route Trace
1 | traceroute -4 baidu.com |
tcpdump
1 | 客户端抓取向服务端发送的数据 |
树莓派 - PWM 调速马达
L298N
接口
- OUT A,接马达 A
- OUT B ,接马达 B
- POWER,+5V、GND、+12V
- 5V 电源,接 +5V + GND
- 12V 电源,接 +12V + GND
- 控制端口,ENA、INA1、INA2、INB1、INB2、ENB
- 接 GPIO
- ENA、INA1、INA2 控制马达 A
- ENB、INB1、INB2 控制马达 B
JVM 参数
参数
参数 | 默认值 | 说明 |
---|---|---|
-XX:MaxDirectMemorySize | 64M | 非堆内存大小 |
GC
G1GC
G1GC是区域化、分代式垃圾回收器。堆内存被划分为大小相同的若干区域(Region),区域大小取值为[1,32]
之间2的幂,若不配置Region大小,JVM以数量不超过2048个区域为目标,确定Region大小。这些Region逻辑上组合成传统的Eden、Survivor、Tenured。
概念
- Region:对内存块,逻辑组合为传统的年轻代、老年代
- CSet:回收集
- RSet:记忆集
- SATB: Snapshot-At-The-Beginning,初始快照
- IHOP:Initiating Heap Occupancy Percent
分区
阶段
G1GC在两个阶段之间交替,young-only和space-reclamation。young-only 阶段包括垃圾回收,其逐渐将
Young-only 阶段
该阶段开始是一些普通年轻代回收(Normal yount collection),其将对象晋升至老年代。Young-only向Space-reclamatioin阶段过渡始自老年代使用率达到设定阈值。此时,G1执行**并行开始年轻代回收(Concurrent Start young collection)**替代普通年轻代回收。过渡周期包含以下阶段。
- Concurrent Start:除了执行普通年轻代回收,同时开始标记过程(marking process)。并行标记决定老年代区域中(old generation regions)所有当前可达对象,在接下来的space-reclamation阶段被保留。当回收标记还未完成时,可能会进行普通年轻代回收。标记完成伴随两个STW阶段:Remark和Cleanup。
- Remark:完成标记本身、执行全局引用处理、类卸载、回收空区域、清理内部数据结构。在Remark和Cleanup之间,G1会计算信息,以便后面能够在选中的老年代区域中并发回收可用空间,该过程在Cleanup阶段完成。
- Cleanup:决定是否将实际执行space-reclamation阶段。如果随后进行space-reclamation阶段,young-only阶段以单个就绪混合年轻代回收(Prepare Mixed young collection)结束。
Space-reclamation 阶段
该阶段包含多个混合回收,除了年轻代区域外,还会压缩(evacuate)老年代区域集合中的存活对象。当G1确定压缩更多老年代区域不会产生足够值得努力的空间时,space-reclamation阶段结束。
细节
确定初始堆占用率
初始堆占用率(Initiating Heap Occupancy Percent,IHOP)是触发初始标记回收的阈值,定义为老年代大小的百分比。
默认情况下,G1通过观察标记耗时及标记周期内老年代分配内存,自动决定最佳的IHOP。该特性称为Adaptive IHOP,当该特性激活时,参数-XX:InitiatingHeapOccupancyPercent
指定的值作为,G1在还没有足够观察值确定该值时的初始值。通过参数-XX:-G1UseAdaptiveIHOP
可关闭该特性,此时 -XX:InitiatingHeapOccupancyPercent
参数指定的值总是决定该阈值。
标记
G1标记使用初始快照算法(Snapshot-At-The-Beginning,SATB)。在初始标记暂停时(Initial Mark pause),为堆创建虚拟快照,
参数
参数 | 默认值 | 说明 |
---|---|---|
-XX:+UseG1GC | - | 使用G1回收器 |
-XX:MaxGCPauseMillis | 200 | 最大GC停顿时间,单位毫秒 |
-XX:InitiatingHeapOccupancyPercent | 45 | 触发标记周期的堆占用率阈值 |
-XX:NewRatio | 2 | 新生代与老年代大小比例 |
-XX:SurvivorRatio | 8 | eden与suvivor区大小比例 |
-XX:MaxTenuringThreshold | 15 | 提升年老代的最大临界值 |
-XX:ParallelGCThreads | - | STW工作线程数 |
-XX:ConcGCThreads | - | 并行标记线程数 |
-XX:G1ReservePercent | 10 | 空闲空间的预留内存百分比 |
-XX:G1HeapWastePercent | 10 | 触发混合垃圾回收的可回收堆内存阈值 |
-XX:G1HeapRegionSize | - | region分片size,1M~32M,2的幂 |
-XX:G1MixedGCCountTarget | 8 | |
-XX:G1OldCSetRegionThresholdPercent | 10 | |
-XX:-G1UseAdaptiveIHOP | - | 关闭自动设置IHOP特性 |
实验参数
使用实验参数,需要添加解锁实验参数标记。
参数 | 默认值 | 说明 |
---|---|---|
-XX:+UnlockExperimentalVMOptions | - | 解锁实验参数 |
-XX:G1NewSizePercent | 5 | 年轻代最小百分比 |
-XX:G1MaxNewSizePercent=60 | 60 | 年轻代最大百分比 |
-XX:G1MixedGCLiveThresholdPercent | 65 | 混合垃圾回收周期中要包括的老年代region使用率阈值 |
日志
参数 | 说明 |
---|---|
-verbose:gc | - |
-XX:+PrintGCDetails | - |
-XX:+PrintGCDateStamps | - |
-XX:+PrintGCApplicationStoppedTime | 打印应用停留时间 |
-XX:+PrintTenuringDistribution | 老年代分布 |
-Xloggc:/path/to/gc.log | - |
-XX:+UseGCLogFileRotation | - |
-XX:NumberOfGCLogFiles=10 | - |
-XX:GCLogFileSize=128M | - |
注意
- G1触发Full GC,退化使用Serial收集完成垃圾回收,仅适用单线程
- 避免使用 -Xmn或 -XX:NewRatio 显示设置年轻代大小,会覆盖期望STW时间设置
- 优先调优项
-XX:InitiatingHeapOccupancyPercent
-XX:G1MixedGCLiveThresholdPercent
-XX:G1HeapWastePercent
-XX:G1MixedGCCountTarget
-XX:G1OldCSetRegionThresholdPercent
参考
memset & fill
memset
头文件
1 | // c |
使用
1 | void *memset( void *dest, int ch, size_t count ); |
示例
1 | char str[] = "hello world"; |
fill
头文件
1 | #include <algorithm> |
使用
1 | template< class ForwardIt, class T > |