6. Linux 应用层实时性与输入输出测试
实验目的
学习 Linux 用户态多线程编程,掌握使用 SCHED_FIFO 实时调度策略和内存锁定(mlockall)来提升定时器精度。同时,结合 Linux Input 子系统,实现外部物理按键事件触发 GPIO 输出的完整软硬件闭环测试。
硬件与底层说明
- GPIO 输出:使用开发板 40 Pin 排针的第 17 针(PB11,对应 GPIO 编号 43)作为输出测试引脚。
- 按键输入:开发板板载 ADC 按键,设备节点为
/dev/input/event0,键值对应KEY_VOLUMEDOWN(114) 和KEY_VOLUMEUP(115)。
源码解析
本节使用两个独立的测试程序:
1. 实时方波输出测试 (rt_gpio_ctrl.c)
程序创建了一个最高优先级(SCHED_FIFO 优先级 99)的实时线程,通过忙等待(busy_wait)以极高精度定时翻转 GPIO 43 的电平。程序内置了时间统计模块,会自动计算并打印出内核调度带来的延迟(Min / Max / Avg)。
2. 按键中断联动测试 (rt_input.c)
程序利用 select() 阻塞监听 /dev/input/event0 的按键事件。当通过 read() 读取到按键按下(buf.value == 1)时,向 GPIO 43 的 value 节点写入字符 "1"(输出高电平);松开时写入 "0"(输出低电平)。
源码获取
源码可通过以下链接获取
链接: https://pan.baidu.com/s/1kx5cKM6-fEFONYmFS4eXJA
提取码: YZJS
交叉编译与传输
分别在对应目录下执行交叉编译,并传输至开发板:
# 编译实时测试程序
arm-linux-gnueabihf-gcc -g -Wall -O3 rt_gpio_ctrl.c -o rt_gpio_ctrl -lpthread
scp rt_gpio_ctrl root@192.168.5.10:/root/
# 编译输入联动测试程序
arm-linux-gnueabihf-gcc -g -Wall -O3 rt_input.c -o rt_input -lpthread
scp rt_input root@192.168.5.10:/root/运行程序
1.首先需导出 GPIO 43 并配置为输出模式:
echo 43 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio43/direction测试 1:实时性延迟统计 (rt_gpio_ctrl)
./rt_gpio_ctrl -t 10 -d 500000(参数说明:-t 10 运行 10 秒,-d 500000 间隔 500 毫秒)
测试 2:按键输入触发输出 (rt_input)
在一个终端运行测试程序:
./rt_input在另一个终端监控 GPIO 状态变化:
while true; do echo “当前GPIO值为: $(cat /sys/class/gpio/gpio43/value)”; sleep 0.05; done
正常现象
现象 1:延迟测试结果
rt_gpio_ctrl 程序运行 10 秒后自动停止,终端成功打印出系统的调度延迟数据。
结论:系统最大响应延迟仅为 20 微秒,证明开发板在实时调度策略下具备极高的定时精度,满足工业级控制需求。
现象 2:按键联动结果
在监控终端中,初始状态持续打印 当前GPIO值为: 0。当按住开发板按键时,终端输出瞬间变为 1,松开后恢复为 0。
最后编辑:林晓燕 更新时间:2026-11-05 14:56