<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linux :: 标签 :: yafeng 的博客</title><link>http://yafengabc.github.io/tags/linux/index.html</link><description/><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sat, 19 Sep 2026 14:36:30 +0800</lastBuildDate><atom:link href="http://yafengabc.github.io/tags/linux/index.xml" rel="self" type="application/rss+xml"/><item><title>树莓派提高实时性的新思路[原创]</title><link>http://yafengabc.github.io/cnblogs/p6292265/index.html</link><pubDate>Tue, 17 Jan 2017 11:15:00 +0800</pubDate><guid>http://yafengabc.github.io/cnblogs/p6292265/index.html</guid><description>树莓派提高实时性的新思路&#10;by yafeng 转载请注明&#10;树莓派是一台应用linux系统的ARM电脑，由于linux是非实时性系统，所以各个任务之间会不停的切换，时间片20ms-100ms不等，所以很难获得实时的输出，这里先贴个小例子，内容很简单，把一个IO点置为高电平，等待1000us（1ms）然后置为低电平，并记录需要的时间，记录10000次（2ms*10000=20秒）。&#10;#include "stdio.h" #include "wiringPi.h" #define rec_num 10000 int main(){ int time_arry[rec_num]; int current_time=0; wiringPiSetup(); pinMode(0,OUTPUT); for(int i=0;i&lt;rec_num;i++){ current_time=micros(); digitalWrite(0,HIGH); delayMicroseconds(1000); digitalWrite(0,LOW); delayMicroseconds(1000); time_arry[i]=micros()-current_time; } for(int j=0;j&lt;rec_num;j++){ printf("%d ",time_arry[j]); } } 代码很简单，最后打印10000次时间结果，单位为微秒,部分结果如下：&#10;$ gcc set_io_pluse_nort.c -lwiringPi $ sudo ./a.out 2189 2127 2127 2128 2127 2126 2125 2125 2128 2126 2125 2126 2126 2128 2126 2126 2125 2133 2134 2133 2132 2132 2134 2132 2132 2133 2132 2134 2133 2132 2132 2133 2132 2133 2132 2132 2135 2132 2132 2132 2132 2133 2131 2132 2133 2137 2133 2132 2132 2131 2133 2132 2132 2132 2132 2133 2132 2132 2132 2137 2126 2126 2125 2126 2132 2133 2132 2132 2132 2133 2134 2133 2132 2132 2133 2132 2132 2132 2133 2132 2132 2132 2132 2133 2132 2132 2131 2132 2135 2126 2126 2125 2130 2132 2131 2131 2131 2133 2131 2131 2131 2132 2138 2131 2132 2131 2132 2132 2131 2131 2131 2132 2131 2133 2132 2131 2128 2126 2125 2125 2129 2128 2127 2126 2131 2129 2126 2125 2125 2126 2129 2126 2126 2126 2125 2128 2126 2126 2126 2128 2127 2126 2126 2125 2134 2155 2140 2139 2138 2138 2138 2138 2137 2137 2139 2137 2136 2136 21 由于数据太多，不容易看出结果，所以我用Python写了个统计结果的程序，分析均值以及偏差。代码很简单，我就不贴出来了，只贴结果：&#10;平均时间: 2132 &lt;10us: 9621 &gt;10us: 282 &gt;20us: 49 &gt;30us: 19 &gt;40us: 7 &gt;50us: 4 &gt;60us: 2 &gt;70us: 2 &gt;80us: 2 &gt;90us: 2 &gt;100us: 2 &gt;110us: 2 &gt;120us: [2488, 2346] 可以看出，现在结果还是不错的，只有2个结果误差超过均值60us，但是平均时间是2.132ms，跟预计时间有132us的误差。&#10;下边是该程序在CPU满载的情况下的测试结果（我写了个多进程程序，把所有CPU撑到100%）：&#10;平均时间: 2128 &lt;10us: 73 &gt;10us: 9902 &gt;20us: 175 &gt;30us: 153 &gt;40us: 71 &gt;50us: 24 &gt;60us: 15 &gt;70us: 15 &gt;80us: 15 &gt;90us: 15 &gt;100us: 15 &gt;110us: 15 &gt;120us: [12448, 5813, 9480, 13708, 7936, 11588, 14554, 10433, 13771, 14565, 12347, 5887, 9486, 13725, 2955] 这时，出现了非常差的情况，15次误差大于120us，并且有多次10-15ms误差的！</description></item></channel></rss>