我正在做一个微控制器程序员,目前,我一直在使用usleep()
来尝试引入适当的延迟。
似乎有时程序能工作,有时却不能。
我在编译代码时尝试了-O2
标志,但我开始怀疑这是否是一个错误。
另外,除了usleep()
之外,是否还有一个更精确的计时功能,不涉及标准系统中未包含的任何库?我不想使用系统在后台缓存的函数(而且会搞砸时间)。如果它意味着调用系统中的特定地址来等待时钟滴答声,那么我宁愿这样做。
有什么建议吗?
最佳答案
可能吧,但这完全取决于你的硬件。
在某些机器上,你可以直接读取某些给定地址的定时器值,但不能有一个通用的答案。准备使用volatile
属性在程序执行时读取这些计时器的变化。
在更便携的方面,一个更可靠的系统调用(如果可用)是nanosleep
如果您的系统可用(How to use nanosleep() in C? What are `tim.tv_sec` and `tim.tv_nsec`?)。
它通过活动/校准循环工作,因此当您调用它时,不涉及系统调用(至少对于小值,可能取决于实现)。
如果你没有,那么,你可以通过以下方式来实现它:
校准回路(启动时)
使用此校准值实现所需延迟
最好将这个睡眠实现包含在一个根本没有优化的部分中(-O0
)。你不会有纳秒的精度,但在毫秒内你应该没事。
关于c - 最简单的真实计时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48802356/