STM32程序代码时间测量的思考-面向对象

怎么计算程序从A跑到B需要的时间?

以前物联网充电桩设备是带有RTC模块的,每次去获得时间即可。

也就是A获取时间B获取时间,相减即可,并且可以获得A.B的准确北京时间。

现在低成本,没有RTC,怎么做?

我想配置一个定时器,和延时函数一样,控制定时器的计数值,比如1MS计数值up一个,A去设置计数值为0,B去读取计数值,就可以算出AB之间的相对时间。

没有动手,问问了别人,不建议用 硬定时 来做。用系统自己的滴答定时器。

开始吧。

OSTimeGet()
在工程里面搜索就看到了。(现在没有使用)

测量任务运行时间请使用UCOS自带的OSTimeGet()函数,进入函数的时候调用一次OSTimeGet(),任务执行完以后在调用一次OSTimeGet(),两者相减就是任务运行时间,注意两者相减的结果的单位不是ms,而是时钟节拍数。如果要测量任务运行时间的话最好将OS_TICKS_PER_SEC设置为1000。

很快就能成功,在线仿真可以看到效果,watch那个全局变量即可!



现在想写的优秀一点,抽象一个模块。

typedef struct
{
    u32     TimeCounter;
    void     (*TimeStart)( void );
    u32      (*TimeEnd)(void);                            
}_TimeMeasureHandleType,*TimeMeasureHandleType;

_TimeMeasureHandleType Time1=
{
     0,
    _TimeStart,
    _TimeEnd,
};

void _TimeStart( void)
{
    Time1.TimeCounter=OSTimeGet( );
}

u32 _TimeEnd(void )
{
   return  OSTimeGet( )-Time1.TimeCounter;
}



此时大功告成。

问题1:时间一个单位是1MS这个自己算一下,现在因为定义1S走1000次

OS_TICKS_PER_SEC



u32 _TimeEnd(void )
{
   return ( OSTimeGet( )-Time1.TimeCounter)*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);

猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/80592195