标签归档:c

对比用SHELL SCRIPT和C语言API操作RASPBERRY PI GPIO的速度

对Raspberry Pi的GPIO在shell script里面可以直接用sysfs的方式进行操作,也可以调用gpio命令来进行操作,还可以用API来进行操作。今天做了个实验对比sysfs方式、第三方gpio命令以及C语言API操作对效率的影响。

昨天写的文章里面提到了用GPIO来控制LED灯的显示,今天其实是突发奇想,想看看用第三方gpio命令来操作和直接操作sysfs的效率到底有多大的区别。

物理连线

连线和昨天写的文章里面的连线方法基本一样,只是在GPIO管脚和GND之间跨接了一个可以测频率的万用表(UNI-T UT136D)。

Shell Script 响应速度测试

测试脚本

#!/bin/bash
#Written by Kang Liu (http://www.liukang.com)
#You have the freedom to use and/or modify the script, and the freedom to distribute modified and therefore derivative script.
#Actually in this test, I will only use GPIO 17 (WiringIO 0) (Red LED)
orgled=27
greenled=18
redled=17
init_led()
{
 for i in $orgled $greenled $redled
 do
 if [ ! -d /sys/class/gpio/gpio$i ]
 then
 echo $i >/sys/class/gpio/export
 fi
 echo "out" >/sys/class/gpio/gpio$i/direction
 echo 0 >/sys/class/gpio/gpio$i/value
 done
}

cleanup()
{
 init_led
 for i in $orgled $greenled $redled
 do
 if [ -d /sys/class/gpio/gpio$i ]
 then
 echo $i > /sys/class/gpio/unexport
 fi
 done
 exit 0
}
gpio_ben()
{
 echo 1 > /sys/class/gpio/gpio$1/value
 echo 0 > /sys/class/gpio/gpio$1/value
 #gpio write 0 1 #method 4
 #gpio write 0 0 #method 4
}

init_led
trap cleanup INT TERM EXIT
while :
do
 #gpio_ben 17 #method 2, method 4
 echo 1 > /sys/class/gpio/gpio17/value #method 1
 echo 0 > /sys/class/gpio/gpio17/value #method 1
 #gpio write 0 1 #method 3
 #gpio write 0 0 #method 3
done

方法1:直接调用sysfs控制通断

脚本中默认没有注释掉的就是方法1,相当于用下面命令来操作gpio实现让电路通断:

while :
do
 echo 1 > /sys/class/gpio/gpio17/value #method 1
 echo 0 > /sys/class/gpio/gpio17/value #method 1
done

实测频率在1.1kHz左右。目测LED基本感觉不到闪烁。

测试结果照片如下,最后两位数字在不断跳动。

万用表测试GPIO接口频率 (Shell Script)

方法2:用shell脚本中的函数调用sysfs控制通断

相当于用下面命令来通过自定义函数gpio_ben操作gpio,实现电路通断: