Linux c++用户空间应用程序实时睡眠功能(POSIX,树莓派)
Linux C++ userspace app real time sleep function (POSIX, Raspberry Pi)
我需要一个函数在µs内挂起我的程序,它应该是实时的,所以如果我在50µs内调用它,线程应该正好停止50µs。我的c++程序运行在安装了普通Raspberry Pi的树莓派上。
我编写了这个示例程序,它使用posix time函数来挂起和测量挂起时间。
#include <cstdlib>
#include "stdint-gcc.h"
#include "signal.h"
#include <time.h>
#include <cerrno>
#include <cstdio>
#include <iostream>
#include <cstring>
#define S_IN_NS 1000000000UL
#define MS_IN_NS 1000000UL
#define US_IN_NS 1000UL
#define GET_TIME_CLOCK CLOCK_MONOTONIC
using namespace std;
int main(int argc, char** argv) {
struct timespec newTimeStamp;
struct timespec oldTimeStamp;
struct timespec sleeptime;
sleeptime.tv_sec = 0;
sleeptime.tv_nsec = 50000; //50us
if (clock_gettime(GET_TIME_CLOCK, &oldTimeStamp) == -1)
cout << "Could not get clock time! ERRNO: " << strerror(errno);
if ((clock_nanosleep(CLOCK_MONOTONIC, 0, &sleeptime, NULL)) == -1)
cout << "Sleep failed! ERRNO: " << strerror(errno);
if (clock_gettime(GET_TIME_CLOCK, &newTimeStamp) == -1)
cout << "Could not get clock time! ERRNO: " << strerror(errno);
uint64_t measuredSec = (newTimeStamp.tv_sec - oldTimeStamp.tv_sec);
int32_t measuredNs = (newTimeStamp.tv_nsec - oldTimeStamp.tv_nsec);
uint64_t diffus = (((measuredSec * S_IN_NS) + measuredNs + 500) / 1000UL);
uint64_t diffns = (((measuredSec * S_IN_NS) + measuredNs));
cout << "Diffns:" << diffns << " Diffus:" << diffus << endl;
return 0;
}
构建命令:
arm-bcm2708hardfp-linux-gnueabi-g++ -lrt -c -g -MMD -MP -MF "build/Debug/GNU_ARM_HARDFP-Linux-x86/main.o.d" -o build/Debug/GNU_ARM_HARDFP-Linux-x86/main.o main.cpp
arm-bcm2708hardfp-linux-gnueabi-g++ -lrt -o dist/Debug/GNU_ARM_HARDFP-Linux-x86/timetest build/Debug/GNU_ARM_HARDFP-Linux-x86/main.o
结果(chrt -操作进程的实时属性):
pi@raspberrypi ~ $ sudo chrt 99 ./timetest
Diffns:130994 Diffus:131
pi@raspberrypi ~ $ sudo chrt 99 ./timetest
Diffns:135994 Diffus:136
pi@raspberrypi ~ $ sudo chrt 99 ./timetest
Diffns:138993 Diffus:139
程序应该正好睡眠50us,但我测量了130-139us。如果我将GET_TIME_CLOCK定义更改为CLOCK_PROCESS_CPUTIME_ID,则测量cpu时间(不包括睡眠时间)。
结果:pi@raspberrypi ~ $ sudo chrt 99 ./timetest
Diffns:89000 Diffus:89
pi@raspberrypi ~ $ sudo chrt 99 ./timetest
Diffns:86000 Diffus:86
pi@raspberrypi ~ $ sudo chrt 99 ./timetest
Diffns:88000 Diffus:88
执行clock_nanosleep()函数需要大约80-90µs,即使我将睡眠时间更改为500µs!
那么有什么方法可以在Raspbian上的c++用户空间应用程序中暂停线程的确切时间(µs) ?
thx
如果您需要睡眠如此精确的时间,您可能需要使用带有当前时间检查的旋转循环。这将消耗相当多的电力(并产生热量),但这是一种相当可靠和便携的方法。另一个想法是尝试这个页面上的想法:http://blog.regehr.org/archives/794
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 对可变参数使用声明.如何选择正确的功能
- 询问在设计我的手臂模拟器功能表示格式1
- 哪些是安卓系统中不可用的最重要的POSIX功能
- Linux c++用户空间应用程序实时睡眠功能(POSIX,树莓派)