[问题] clock_nanosleep() 还是不准的问题...

楼主: user48625 (小宫山先生)   2014-07-17 21:54:50
我不确定这问题要发在linux板或C_and_CPP板比较好,
目前我打算用嵌入式开发板 beaglebone black 上安装Debian, kernel 3.15,
因为某些需要,所以时间精度要求要在 1us 以下,所以我打算用clock_nanosleep()实现
但我给 1s 的delay,他实际睡眠时间却是 1s 又 120us,我是在clock_nanosleep()前后
加上clock_gettime(),然后把两个时间相减得到的数字.. 总是会睡过头。
另外我有用linuxPTP(某种利用PTP校正系统时间(CLOCK_REALTIME)的软件),并且将示波器
接上GPIO看1PPS的准确度,delay也是多了100us左右...
请问有办法让系统达到至少 1us 以下的时间精度吗? 譬如我设delay 1s,实际delay是
1s 又 200ns 之类的,用realtime OS有帮助吗? 或者这是kernel counter的问题(但我对
linux的时间设计并不是很了解,只知道作业系统的计时跟counter有关)?
希望能获前辈指教,谢谢。
下面是我其中的三组数据:
da 69033 dan 946956445
db 69034 dbn 947070913
da 69035 dan 947355036
db 69036 dbn 947490079
da 69037 dan 947738536
db 69038 dbn 947863215
左边是秒(绝对时间),右边是奈秒(绝对时间),故上下两组相减可看到多了快100us...
作者: filiaslayers (司马云)   2014-07-18 09:53:00
之前做的时候,linux好像没办法做到这么高的准度
作者: scott260202 (Cake)   2014-07-18 13:10:00
还是不行的话买个震晶自己弄上gpio? 不知道可不可以XD
楼主: user48625 (小宫山先生)   2014-07-18 14:44:00
不晓得若改成realtime OS有效吗?
作者: yvb   2014-07-18 15:01:00
1. 是否已将 function/system call overhead 列入考虑 ?2. context switch 需要时间, 且可能有相当范围的误差.3. 是否使用 chrt 之类调高执行的 priority ?
作者: bitlife (BIT一生)   2014-07-19 12:58:00
需要us级精准度的,就不该使用OS了,应该是main loop程式自行控制会比较好.如果要用OS,可能要自己把sleep时间扣掉OSoverhead,但这不保险,除非完全熟悉OS流程怎么跑
楼主: user48625 (小宫山先生)   2014-07-19 19:31:00
谢谢,我查了一些资料,preempt的jitter似乎只能到10us..
作者: yvb   2014-07-20 00:51:00
比起 Linux 板, 也许 LinuxDev 板更合适?要求时间精度有几种类型,包含读取时间刻度,短延时,长延时几种;短延时比方10us delay不可误差超过1us,长延时则如 1s 的误差,这几种类型的处理方式都有相当的差异.另外, b大的意思是完全不用OS? 或只是不要使用 syscall ?
作者: gaiwei (gaiwei)   2014-07-23 00:49:00
schedule一定不准,但user mode好像没busy waiting可用考虑自己弄一个?

Links booklink

Contact Us: admin [ a t ] ucptt.com