我必须定时GPIO引脚上高->低和低->高信号沿之间的时间差。我写了一个简单的程序来做到这一点。运行了一段时间后,我对结果(0.01秒的变化)感到非常满意。但是,有时会出现0.5秒的错误。我当时认为这可能是由于当时正在运行其他系统进程所致。所以我的问题是:
我可以只为我的程序保留一个处理器内核,而为系统保留其他3个内核吗?
我正在使用Raspbian Jessie Lite,所以我认为3个内核足以运行它。
我必须定时GPIO引脚上高->低和低->高信号沿之间的时间差。我写了一个简单的程序来做到这一点。运行了一段时间后,我对结果(0.01秒的变化)感到非常满意。但是,有时会出现0.5秒的错误。我当时认为这可能是由于当时正在运行其他系统进程所致。所以我的问题是:
我可以只为我的程序保留一个处理器内核,而为系统保留其他3个内核吗?
我正在使用Raspbian Jessie Lite,所以我认为3个内核足以运行它。
Answers:
专注于核心可能是过大的。
我建议您尝试一下我的Pigpio库。默认情况下,它将使GPIO电平变化时间在10µs之内。
作为快速测试,我建议您看一下此Python示例,该示例将打印任何GPIO级别转换以及自该GPIO上一次转换以来的时间(以微秒为单位)。
在Jessie Lite中默认未安装Pigpio。从链接站点安装最新版本,或在存储库中安装旧版本。
sudo apt-get install pigpio python-pigpio python3-pigpio
pigpio - Library for Raspberry Pi GPIO control
python-pigpio - Python module which talks to the pigpio daemon (Python 2)
python3-pigpio - Python module which talks to the pigpio daemon (Python 3)
您可以schedutils
按照以下Cyberciti文章中的说明将程序锁定到一个内核:
sudo apt-get install schedutils
sudo taskset -c 3 -p 13545 # Lock PID 13545 to core 3
但是,其他进程仍可以安排在同一内核上。因此,第二件事是使用nice命令确保您的命令以最高优先级运行(这将告诉Linux内核,如有必要,其他进程应被抢占)。以这种方式启动程序:
nice -n -20 your-program
您的计时问题还有其他一些可能的原因。这些都不是一件容易的事:
有多种方法可以使您的流程成为实时流程,这意味着它将在一定的时间保证下运行。这样做的问题是,其他所有事情可能都比较慢,这是一个复杂的话题。如果您想解决这个难题,建议您开始阅读Linux中的实时进程。
由于您有计时要求,因此Raspberry Pi不再是适合此的平台。它不是一个实时平台,计时可能会因许多不同的干扰源而中断。
取而代之的是,您应该使用微控制器来测量该时间,最好使用中断,然后将信息传递给Pi。
根据您的要求,我认为您不需要使用单个核心处理器。您需要确保程序始终运行。为此,您可以将程序的优先级设置得很高,这样它就不会受到其他任何进程的干扰。
据我所知,我们使用的OS(通用OS)并非旨在用于实时系统,因此,如果要实时运行流程,以免其他进程干扰它,则需要执行用于实时操作系统(RTOS)。也许他们会提出核心选择。:)