.NET Micro Framework的旋转等待计时器(译文)
By S.F.
本文链接 https://www.kyfws.com/news/spin-wait-timer-for-net-micro-framework/
版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 2 分钟阅读 - 803 个词 阅读量 0.NET Micro Framework的旋转等待计时器(译文)
原文地址:https://www.codeproject.com/Articles/575067/Spin-wait-timer-for-NET-Micro-Framework
原文作者:Joel Ivory Johnson
译文由本站翻译
前言
.NET Micro Framework的旋转等待计时器.
我正在努力使用Netduino将硬件连接到计算机.该硬件的文档中有一些地方指定了延迟,对于这些延迟,可用的.NET Micro Framework功能对我而言不起作用.对于此应用程序,旋转等待很好.因此,我开设了一门课来照顾我的延迟.程序第一次启动时,我在该类上调用" Calibrate"方法. “校准"将执行旋转等待预定数量的周期,以计时完成所需的时间.完成所花费的时间然后用于计算周期与计时之间的比率.该值用于了解要等待大约一个时间量的延迟多少个周期. 我发现这完全可以满足我的需求.当需要极短的延迟时,要记住的一点是,函数调用和为循环做准备有一些开销.对于许多应用程序,这可能并不重要.如果旋转等待被中断(例如被另一个线程控制或触发了硬件中断),则计时可能会被取消.因此,此解决方案并不适用于每个解决方案. 我已经使用每秒要使用的硬件提供的值预填充了每秒周期数的变量.我使用的硬件是Netduino Plus2.所需的值在其他硬件上以及将来在同一硬件上的固件更新上可能会有所不同.
public class SpinWaitTimer
{
double _cyclesPerSecond = 112262.2255516001;
public double CyclesPerSecond
{
get { return _cyclesPerSecond; }
set { _cyclesPerSecond = value; }
}
public SpinWaitTimer()
{
}
public void Calibrate()
{
const int CYCLE_COUNT = 1048576;
int dummyValue = 0;
DateTime startTime = DateTime.Now;
for (int i = 0; i < CYCLE_COUNT; ++i)
{
++dummyValue;
}
DateTime endTime = DateTime.Now;
TimeSpan timeDifference = endTime.Subtract(startTime);
_cyclesPerSecond = ((double)CYCLE_COUNT / (double)timeDifference.Ticks)*10000000d;
}
public void WaitSeconds(double sec)
{
int cycleCount = (int)((sec * CyclesPerSecond));
int dummyValue = 0;
for (int i = 0; i < cycleCount; ++i)
{
++dummyValue;
}
}
public void WaitMilliseconds(double microseconds)
{
int cycleCount = (int)(_cyclesPerSecond * CyclesPerSecond / 1000d);
int dummyValue = 0;
for (int i = 0; i < cycleCount; ++i)
{
++dummyValue;
}
}
public void WaitMicroseconds(double microseconds)
{
int cycleCount = (int)(_cyclesPerSecond * CyclesPerSecond / 1000000d);
int dummyValue = 0;
for (int i = 0; i < cycleCount; ++i)
{
++dummyValue;
}
}
}
许可
本文以及所有相关的源代码和文件均已获得The Code Project Open License (CPOL)的许可。
C# .NET 新闻 翻译