• 单片机测量任务运行时间


    前言

    1.之前是直接看定时器的计数值来粗略估计,可能会存在一些差错,也不够方便;所以做一个比较通用的计算任务运行时间的小Demo。

    2.用定时器的计数值查看开始的Tick和结束的Tick,然后定时器每隔1毫秒溢出一次,通过简单计算,求任务运行时间。

    3.在测到us级时存在误差,可能是一些语句执行需要时间,不过任务执行时间为us级,对单片机运行整体上没什么影响。

    3.毫秒级和秒级基本准确。

    有纰漏请指出,转载请说明。

    学习交流请发邮件 1280253714@qq.com


    runTime.h

    1. #ifndef __RUN_TIME_H
    2. #define __RUN_TIME_H
    3. #include "includes.h"
    4. typedef enum {
    5. TaskRunTime1 = 0,
    6. TaskRunTime2,
    7. TaskRunTime3,
    8. TaskRunTimeNum,
    9. } TaskRunTime_Num;
    10. typedef enum {
    11. TaskRunTimeStart,
    12. TaskRunTimeRunning,
    13. TaskRunTimeStop,
    14. } TaskRunTime_Flag;
    15. typedef struct {
    16. u32 startTick;
    17. u32 stopTick;
    18. u32 overFlowCnt;
    19. u32 runTime;
    20. TaskRunTime_Flag flag;
    21. } TaskRunTime_S;
    22. void TaskStartTick(TaskRunTime_Num taskx);
    23. void TaskStopTick(TaskRunTime_Num taskx);
    24. void TaskRunTimeOverFlow(void);
    25. #endif //__RUN_TIME_H

    runTime.c

    1. #include "includes.h"
    2. __IO TaskRunTime_S stRunTime[TaskRunTimeNum];
    3. void TaskStartTick(TaskRunTime_Num taskx)
    4. {
    5. memset(&stRunTime[taskx], 0, sizeof(TaskRunTime_S));
    6. stRunTime[taskx].startTick = TIM4->CNT;
    7. stRunTime[taskx].flag = TaskRunTimeStart;
    8. }
    9. void TaskStopTick(TaskRunTime_Num taskx)
    10. {
    11. s16 timeInterval = 0;
    12. stRunTime[taskx].stopTick = TIM4->CNT;
    13. stRunTime[taskx].flag = TaskRunTimeStop;
    14. timeInterval = (stRunTime[taskx].stopTick - stRunTime[taskx].startTick);
    15. stRunTime[taskx].runTime = 1000 * stRunTime[taskx].overFlowCnt + timeInterval;
    16. }
    17. void TaskRunTimeOverFlow(void)
    18. {
    19. for (int i=0; i
    20. {
    21. if (stRunTime[i].flag == TaskRunTimeStart)
    22. {
    23. stRunTime[i].overFlowCnt++;
    24. }
    25. }
    26. }
    27. void TIM4_IRQHandler(void)
    28. {
    29. if ( TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET )
    30. {
    31. TaskRunTimeOverFlow();
    32. TIM_ClearITPendingBit(TIM4 , TIM_FLAG_Update);
    33. }
    34. }

    演示

  • 相关阅读:
    Reggie外卖项目 —— 分类管理模块之删除分类功能
    2023最新的接口自动化测试完整版
    二、Docker基本操作
    ITSS认证从申报到获得证书需要多长时间?
    2.2线性表的顺序表示-综合应用题(408统考真题10-14)
    javaEE -9(7000字详解TCP/IP协议)
    在K8S中,静态、动态、自主式Pod有何区别?
    动态规划——区间DP
    springboot依赖管理和自动配置
    竞赛选题 深度学习YOLO图像视频足球和人体检测 - python opencv
  • 原文地址:https://blog.csdn.net/weixin_45817947/article/details/133050517