前言
1.之前是直接看定时器的计数值来粗略估计,可能会存在一些差错,也不够方便;所以做一个比较通用的计算任务运行时间的小Demo。
2.用定时器的计数值查看开始的Tick和结束的Tick,然后定时器每隔1毫秒溢出一次,通过简单计算,求任务运行时间。
3.在测到us级时存在误差,可能是一些语句执行需要时间,不过任务执行时间为us级,对单片机运行整体上没什么影响。
3.毫秒级和秒级基本准确。
有纰漏请指出,转载请说明。
学习交流请发邮件 1280253714@qq.com
runTime.h
#ifndef __RUN_TIME_H
#define __RUN_TIME_H
#include "includes.h"
typedef enum {
TaskRunTime1 = 0,
TaskRunTime2,
TaskRunTime3,
TaskRunTimeNum,
} TaskRunTime_Num;
typedef enum {
TaskRunTimeStart,
TaskRunTimeRunning,
TaskRunTimeStop,
} TaskRunTime_Flag;
typedef struct {
u32 startTick;
u32 stopTick;
u32 overFlowCnt;
u32 runTime;
TaskRunTime_Flag flag;
} TaskRunTime_S;
void TaskStartTick(TaskRunTime_Num taskx);
void TaskStopTick(TaskRunTime_Num taskx);
void TaskRunTimeOverFlow(void);
#endif //__RUN_TIME_H
runTime.c
#include "includes.h"
__IO TaskRunTime_S stRunTime[TaskRunTimeNum];
void TaskStartTick(TaskRunTime_Num taskx)
{
memset(&stRunTime[taskx], 0, sizeof(TaskRunTime_S));
stRunTime[taskx].startTick = TIM4->CNT;
stRunTime[taskx].flag = TaskRunTimeStart;
}
void TaskStopTick(TaskRunTime_Num taskx)
{
s16 timeInterval = 0;
stRunTime[taskx].stopTick = TIM4->CNT;
stRunTime[taskx].flag = TaskRunTimeStop;
timeInterval = (stRunTime[taskx].stopTick - stRunTime[taskx].startTick);
stRunTime[taskx].runTime = 1000 * stRunTime[taskx].overFlowCnt + timeInterval;
}
void TaskRunTimeOverFlow(void)
{
for (int i=0; i<TaskRunTimeNum; i++)
{
if (stRunTime[i].flag == TaskRunTimeStart)
{
stRunTime[i].overFlowCnt++;
}
}
}
void TIM4_IRQHandler(void)
{
if ( TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET )
{
TaskRunTimeOverFlow();
TIM_ClearITPendingBit(TIM4 , TIM_FLAG_Update);
}
}