6. Linux 应用层实时性与输入输出测试

实验目的

学习 Linux 用户态多线程编程,掌握使用 SCHED_FIFO 实时调度策略和内存锁定(mlockall)来提升定时器精度。同时,结合 Linux Input 子系统,实现外部物理按键事件触发 GPIO 输出的完整软硬件闭环测试。

硬件与底层说明

  1. GPIO 输出:使用开发板 40 Pin 排针的第 17 针(PB11,对应 GPIO 编号 43)作为输出测试引脚。
  2. 按键输入:开发板板载 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-10-22 17:02
最后编辑:林晓燕  更新时间:2026-11-05 14:56