怎么计算程序从A跑到B需要的时间?
以前物联网充电桩设备是带有RTC模块的,每次去获得时间即可。
也就是A获取时间B获取时间,相减即可,并且可以获得A.B的准确北京时间。
现在低成本,没有RTC,怎么做?
我想配置一个定时器,和延时函数一样,控制定时器的计数值,比如1MS计数值up一个,A去设置计数值为0,B去读取计数值,就可以算出AB之间的相对时间。
没有动手,问问了别人,不建议用 硬定时 来做。用系统自己的滴答定时器。
开始吧。
测量任务运行时间请使用UCOS自带的OSTimeGet()函数,进入函数的时候调用一次OSTimeGet(),任务执行完以后在调用一次OSTimeGet(),两者相减就是任务运行时间,注意两者相减的结果的单位不是ms,而是时钟节拍数。如果要测量任务运行时间的话最好将OS_TICKS_PER_SEC设置为1000。 |
很快就能成功,在线仿真可以看到效果,watch那个全局变量即可!
现在想写的优秀一点,抽象一个模块。
此时大功告成。
问题1:时间一个单位是1MS这个自己算一下,现在因为定义1S走1000次
OS_TICKS_PER_SEC
问题2:纯C语言技巧,我现在的参数不好,没有this指针怎么办?自己把自己传进去。
上面这种结构体写法不行了,自己把自己搞死了。怎么办?改变写法!
参考文章:https://blog.csdn.net/stophin/article/details/54646796
最后效果:
typedef struct _TimeMeasureHandleType _TimeMeasureHandleType;
struct _TimeMeasureHandleType
{
u32 TimeCounter;
void (*TimeStart)(_TimeMeasureHandleType Time);
u32 (*TimeEnd)(_TimeMeasureHandleType Time);
};
void _TimeStart(_TimeMeasureHandleType Time);
u32 _TimeEnd(_TimeMeasureHandleType Time);
_TimeMeasureHandleType Time1=
{
0,
_TimeStart,
_TimeEnd,
};
void _TimeStart(_TimeMeasureHandleType Time)
{
Time.TimeCounter=OSTimeGet();
}
u32 _TimeEnd(_TimeMeasureHandleType Time)
{
return (OSTimeGet()-Time1.TimeCounter)*1000/OS_TICKS_PER_SEC;
}
================拿去试一试,我擦,犯了C语言的低级错误,传递是值不值址根本不work========
typedef struct _TimeMeasureHandleType _TimeMeasureHandleType;
struct _TimeMeasureHandleType
{
u32 TimeCounter;
void (*TimeStart)(_TimeMeasureHandleType *Time);
u32 (*TimeEnd)(_TimeMeasureHandleType *Time);
};
void _TimeStart(_TimeMeasureHandleType *Time);
u32 _TimeEnd(_TimeMeasureHandleType *Time);
_TimeMeasureHandleType Time1=
{
0,
_TimeStart,
_TimeEnd,
};
void _TimeStart(_TimeMeasureHandleType *Time)
{Time->TimeCounter=OSTimeGet();}
u32 _TimeEnd(_TimeMeasureHandleType *Time)
{return (OSTimeGet()-Time->TimeCounter)*1000/OS_TICKS_PER_SEC;}
unsigned int tt=12;
unsigned int ttt=0;
void Business_Init(void)
{
char times=0;
//tt=OSTimeGet();
Time1.TimeStart(&Time1);
TIM3_Delay(4000);
// ttt=OSTimeGet();
ttt=Time1.TimeEnd(&Time1);
Set_DevStatus(PreRun);
stm32_flash_page_clear(STM32ADDR_ADJUSTMENT);