有些人可能会埋怨raw-os中没有us级别的延时以及us精度的时间测量,其实这个机制早就是有了,只需要打开一个宏定义开关就好了。
把下面的开关定义为1就好了。
#define RAW_CONFIG_CPU_TIME 1
然后使用RAW_CPU_TIME_GET() 得到目前的一个cpu内部时间的点,然后做延时还是做什么事情都行,然后再调用RAW_CPU_TIME_GET(),得到第二个时间点,前后相减结合cpu频率换算一下就出来了。具体的示意如下:
t1 = RAW_CPU_TIME_GET();
do something
t2 = RAW_CPU_TIME_GET();
测量时间 = 1000000*(t1 - t2) / frequency
至于延时也是一样的,不再表述。
在trochili rtos里是这么实现的
/*************************************************************************************************
* 功能:获得系统已运行时钟节拍数 *
* 参数:(1) pStamp 返回系统已运行时钟节拍数 *
* 返回:无 *
* 说明: *
*************************************************************************************************/
void xKernelGetJiffies(TTimeTick* pJiffies)
{
TReg32 imask;
CpuEnterCritical(&imask);
*pJiffies = uKernelVariable.Jiffies;
CpuLeaveCritical(imask);
}
/*************************************************************************************************
* 功能:获得系统已运行时钟节拍数 *
* 参数:(1) pJiffies 保存系统已运行的时钟节拍数 *
* 返回:无 *
* 说明: *
*************************************************************************************************/
void TclGetTimeJiffies(TTimeTick* pJiffies)
{
KNL_ASSERT((pJiffies != (TTimeTick*)0), "");
xKernelGetJiffies(pJiffies);
}
/*************************************************************************************************
* 功能:获得系统已运行时间戳 *
* 参数:(1) pStamp 以微秒为单位的时间戳数值 *
* 返回:无 *
* 说明: *
*************************************************************************************************/
void TclGetTimeStamp(TTimeStamp* pStamp)
{
TTimeTick jiffies;
KNL_ASSERT((pStamp != (TTimeStamp*)0), "");
xKernelGetJiffies(&jiffies);
*pStamp = (jiffies * 1000U * 1000U) / TCL_TIME_TICK_RATE;
}
不错,国产RTOS活力无限
非常好的功能,raw-os有很多非常棒的特性