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

楼主: i386 (i386 cpu)   2014-07-19 14:36:26
1. 首先你要先确认timer上的clock为多少Hz(通常为APB clock), 这会
决定你的timer精准度到多少, 如果希望timer精准度到1ns, 意味着timer clock
要跑在1000MHz,换句话说, 就是timer counter加一时间经过1ns.
2. cpu透过bus读取timer counter是要花时间的, 这时间长短取决很多因素,
cpu频率,架构, bus频率等等...通常要精准知道cpu读取一个周边硬件暂存器需要多少
clock cycle, 大多会从IC designer上的模拟数据来估算.
3. 量测上既有的误差, 用print message或trigger GPIO看示波器都会有一定
的误差存在. 最基本的从cpu去读取timer counter就有一定的clock cycle延迟.
4. 一般timer IP可能都会有多组timer, 试试看可否改用别组timer来触发中断,
这样的方式overhead就落在OS的irq service routing, context switch, timer本身的精准度, 以及
timer发出中断给interrupt controller回应的时间.
5.context switch影响的变因跟cpu cache架构和OS的搭配有关系. 可以去看看最后作
context switch那段assembly code里面对TLB和cache的处理方式.
※ 引述《user48625 (小宫山先生)》之铭言:
: 我不确定这问题要发在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...
作者: user48625 (小宫山先生)   2014-07-19 19:28:00
谢谢! 学问很大, 我该考虑是否要换个架构...
作者: yvb   2014-07-20 01:09:00
原 PO 有提到打算用开发板 beaglebone black,看了一下规格, 其 timer 为 DMTimer, 不知算是怎样的 clock ?
楼主: i386 (i386 cpu)   2014-07-20 09:20:00
这要看AM335x technical reference manual

Links booklink

Contact Us: admin [ a t ] ucptt.com