使用忙等待和睡眠结合实现节约CPU的同时保证精确定时
- 单纯使用忙等待可以实现较高精度的定时,但是会导致CPU占用率升高,因此需要将忙等待和睡眠结合,让出CPU给其他进程使用,需要的时候再上处理机运行
- 代码
void* threadRT(void*)
{
// setThreadRT(98);
FILE* fp;
fp = fopen("log.txt", "w");
uint64_t prev = get_us();
uint64_t cur;
while(1)
{
usleep(1500);
while(get_us() - prev < 2500UL){}
cur = get_us();
fprintf(fp, "%lu,", cur-prev);
prev = cur;
}
} - 将线程设置为实时线程
纯忙等测试
- 除了小部分误差很大的极端位置之外,运行时间极为稳定
- 大部分误差在50000微秒左右
- 将上述位置除去之后,发现剩余的时间几乎不发生任何变化
- 推测是是实时线程的
sched_rt_runtime_us设置为950000导致的 - 将
sched_rt_runtime_us设置为1000000之后,测试结果十分稳定
引入usleep节省CPU占用
usleep设置为1500的情况
- 可见误差最大不超过1微秒
usleep设置为2000
- 可见误差最大不超过2微秒
- 而且在1600次测试中只发生了不超过三次
注意上述测试不能在虚拟机完成,必须在物理机完成
不设置为实时线程的情况
- 不设置为实时线程的时候,线程大体定时是准确的,但是容易受到外界打扰,外界有操作的时候会导致进程延迟