1.之前是直接看定时器的计数值来粗略估计,可能会存在一些差错,也不够方便;所以做一个比较通用的计算任务运行时间的小Demo。
2.用定时器的计数值查看开始的Tick和结束的Tick,然后定时器每隔1毫秒溢出一次,通过简单计算,求任务运行时间。
3.在测到us级时存在误差,可能是一些语句执行需要时间,不过任务执行时间为us级,对单片机运行整体上没什么影响。
3.毫秒级和秒级基本准确。
有纰漏请指出,转载请说明。
学习交流请发邮件 1280253714@qq.com
- #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
- #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)
- {
-