系统组成
内核、用户态、SDK 和应用的职责,以及 BCI 与 CSV 数据路径。
本页目录
实时内核
kernel/linux 是已纳入版本控制的 Linux 6.6.0-rt15 源码,而不是构建时下载的占位目录。kernel/xtos_defconfig 在架构 defconfig 之后合并,启用 CONFIG_PREEMPT_RT=y、CONFIG_HIGH_RES_TIMERS=y、CONFIG_HZ_1000=y、模块支持及 /proc/config.gz。Kconfig 合并后必须以 olddefconfig 生成的最终配置为准,不能仅凭配置片段宣称目标内核启用了某项。
uname -r
cat /sys/kernel/realtime
zcat /proc/config.gz | grep '^CONFIG_PREEMPT_RT='
zcat /proc/config.gz | grep '^CONFIG_HZ='运行标志 /sys/kernel/realtime 的预期值为 1。CONFIG_HZ_1000 表示内核 tick 配置,不是对每个线程 1 ms 响应或传感器采样精度的承诺;高分辨率定时器、设备时钟与应用窗口是不同层面的参数。
调度辅助
kernel/linux/kernel/sched/xtos_sched.c 实现按 CPU 分配、带自旋锁的优先级队列与入队、出队、选取等辅助函数。
它明确不是 sched_class;Linux 的调度选择、task_struct 布局和 syscall ABI 不变。
默认配置的 CONFIG_XTOS_SCHED=y 表示编入内核,不是把 Linux SCHED_FIFO、SCHED_RR 或 SCHED_OTHER 替换成 XTOS 策略。
辅助函数 xtos_set_cpu_affinity 仅保存建议性元数据,不迁移 Linux 任务;xtos_set_deadline 保存 deadline_ns,不建立截止期调度保证。
应用的 libxtos-rt 则通过标准 sched_setscheduler、sched_setaffinity、mlock/munlock 工作,和这些内核辅助函数没有直接 SDK syscall 通道。
BCI 采集
drivers/xtos/bci 包含 xtos_bci_core 字符设备核心、xtos_bci_buffer 环形缓冲模块和 openbci_cyton serdev 驱动。
驱动源码面向 8 通道、24 位 ADC,默认采样率 250 Hz,串口设置 115200、关闭流控,并匹配设备树 compatible="openbci,cyton"。
加载模块只注册驱动;仍需要实际设备与正确 serdev/设备树绑定才可能获得数据。
接收回调将串口字节组装为 33 字节包,按源码的通道偏移提取 24 位有符号 ADC,符号扩展后用 64 位整数算术缩放为 s32 纳伏,再写入环形缓冲。
实际算式是 raw × 4500000000 / (24 × 2^23),其中 4500000000 是纳伏参考电压,24 是固定增益。
驱动注释中存在“microvolts”字样,但实际数据表达以这段整数算式为准,不能把字节当成 float 微伏。
源码提供开始/停止、通道开关和采样率设置分支(250、500、1000、2000 Hz)。
这些分支说明实现意图,不证明板卡在该串口配置下每个速率都正确工作。
calibrate 当前只是占位返回,阻抗检查返回不支持;应把真实包布局、速率命令效果、丢样和单位核对列入硬件 bring-up,而不是写成已经验证的设备能力。
UAPI 与样本
kernel/linux/include/uapi/linux/xtos_bci.h 定义整数型 ioctl ABI,SDK 在 sdk/libxtos-bci/include/xtos/bci_uapi.h 中保留相应声明。设备信息中的 input_range_mv 是整数 mV,阻抗数组是整数 kΩ,统计计数是 64 位整数;采样流的 raw 字节是另一条数据接口。整数型控制结构不意味着库已经完成 raw 样本的数值转换。
因此本文将 BCI SDK 定位为会话与采集控制接口,同时明确采样表示还需要修正和验证。
硬件数据接入 DSP 前应明确原始类型、端序、通道顺序、单位换算与帧时间戳,并用已知输入检验数值。
START/STOP、SET_RATE、SET_CHANNEL 等 ioctl 是采集控制,不是机器人、AR/VR 或通用反馈执行器接口。
用户态启动
x86_64 构建使用 system/busybox_defconfig,生成静态 BusyBox 1.37.0,并将 applet 链接安装到 /bin。
system/rootfs/init 作为 PID 1 挂载 proc、sysfs、devtmpfs、devpts 与 /dev/shm,打印内核版本和 realtime 标志;默认循环启动 /bin/sh。
没有设置 xtos.selftest=1 时不会自动运行系统测试,也没有默认网络服务。
| 客体路径 | x86_64 内容 |
|---|---|
| /usr/lib、/usr/include/xtos | 三个 SDK 的静态 .a 与头文件;不意味着客体带有编译器。 |
| /usr/libexec/xtos | test_rt、test_spsc、test_signal 三个静态测试程序。 |
| /usr/bin | xtos-selftest、xtos-eeg-pipeline、xtos-signal-benchmark、bci_test。 |
| /lib/modules/<kernelrelease> | 与镜像匹配的内核模块及 depmod 依赖索引。 |
| /usr/share/xtos/fixtures/valid.csv | EEG 管线的人工 CSV fixture,不是真实设备录制。 |
ARM64/RISC-V64 脚本使用 BusyBox defconfig 后启用静态链接,创建 /etc/inittab 和 /init→sbin/init,用 /bin/sh 提供控制台;测试程序装在 /bin。
verify_guest_* 单独复制 rootfs,将 /init 替换成 xtos-guest-check。
它不改变正常启动镜像,测试后关机,不能在 DONE 之后假定还有交互提示符。
CSV 与硬件
xtos-eeg-pipeline 从 CSV 文件读入双通道、250 Hz、纳伏数据,创建容量 16 的 SPSC 队列,逐帧 push/pop 并校验序号和数据一致性。
它不打开 BCI 设备、不调用 ioctl,也不通过内核 BCI 环形缓冲区。
可选带通由 libxtos-signal 在用户态处理 double 值;CSV 回放不是 serdev 采集的替身。
xtos-eeg-pipeline --input /usr/share/xtos/fixtures/valid.csv
xtos-eeg-pipeline --input /usr/share/xtos/fixtures/valid.csv \
--bandpass 5 40 --dump-filtered /run/filtered.csvCSV 格式头为 # xtos-eeg-v1,channels=2,sample_rate_hz=250,unit=nanovolt;数据行是 timestamp_ns,ch0_nv,ch1_nv,没有额外列名行。
相邻帧预期间隔 4000000 ns,容差 1%,时间戳应严格递增。
JSON 中 p50/p95/p99_latency_ns 只计量队列 push/pop 区段,不含 CSV 解析、带通、硬件输入、推理或反馈。
应用职责
- 输入契约:选定 CSV 或设备输入,记录单位、通道、采样率、帧时间与丢样策略;不要直接拼接有表示差异的接口。
- 计算契约:预分配工作缓冲、限定窗口与队列容量、定义调度权限失败和超时的处理;库函数存在不等于整个应用具有有界执行时间。
- 输出契约:模型、推理线程、结果消费、执行器和反馈安全策略全部属于应用;公开内核不保证识别准确率或控制安全。
公开依据:提交 dd313955ad57542bcd2af8827157d1bbd0cf5e83 的 kernel/xtos_defconfig、kernel/linux/kernel/sched/xtos_sched.c、kernel/linux/drivers/xtos/bci/devices/openbci_cyton.c、kernel/linux/include/uapi/linux/xtos_bci.h、sdk/libxtos-rt/src/rt.c、sdk/libxtos-bci/src/session.c、tools/xtos-eeg-pipeline/pipeline.c、system/rootfs/init,以及三种 build_system 脚本。