基本概念

    系统时钟是由定时/计数器产生的输出脉冲触发中断而产生的,一般定义为整数或长整数。输出脉冲的周期叫做一个“时钟滴答”。系统时钟也称为时标或者Tick。一个Tick的时长可以静态配置。

    用户是以秒、毫秒为单位计时,而芯片CPU的计时是以Tick为单位的,当用户需要对系统操作时,例如任务挂起、延时等,输入秒为单位的数值,此时需要时间管理模块对二者进行转换。

    Tick与秒之间的对应关系可以配置。

    Huawei LiteOS的时间管理模块提供时间转换、统计、延迟功能以满足用户对时间相关需求的实现。

    相关概念

    • Cycle

    系统最小的计时单位。Cycle的时长由系统主频决定,系统主频就是每秒钟的Cycle数。

    • Tick

    Tick是操作系统的基本时间单位,对应的时长由系统主频及每秒Tick数决定,由用户配置。

    使用场景

    用户需要了解当前系统运行的时间以及Tick与秒、毫秒之间的转换关系等。

    功能

    Huawei LiteOS系统中的时间管理主要提供以下两种功能:

    • 时间转换:根据主频实现CPU Tick数到毫秒、微秒的转换。

    开发流程

    时间管理的典型开发流程:

    1. 确认配置项LOSCFG_BASE_CORE_TICK_HW_TIME为YES开启状态。

      在los_config.h中配置每秒的Tick数LOSCFG_BASE_CORE_TICK_PER_SECOND;

    2. 调用时钟转换接口。

    3. 获取系统Tick数完成时间统计。

      通过LOS_TickCountGet获取全局g_ullTickCount。

    • 获取系统Tick数需要在系统时钟使能之后。

    • 时间管理不是单独的功能模块,依赖于los_config.h中的OS_SYS_CLOCK和LOSCFG_BASE_CORE_TICK_PER_SECOND两个配置选项。

    • 系统的Tick数在关中断的情况下不进行计数,故系统Tick数不能作为准确时间计算。

    实例描述

    1. 时间统计和时间延迟:统计每秒的Cycle数、Tick数和延迟后的Tick数。

    编程示例

    前提条件:

    • 配好LOSCFG_BASE_CORE_TICK_PER_SECOND每秒的Tick数。

    • 配好OS_SYS_CLOCK 系统时钟,单位: Hz。

    时间转换:

    时间统计和时间延迟:

    1. {
    2. UINT32 uwRet = LOS_OK;
    3. UINT32 uwcyclePerTick;
    4. UINT64 uwTickCount1,uwTickCount2;
    5. uwcyclePerTick = LOS_CyclePerTickGet();//每个Tick多少Cycle数
    6. if(0 != uwcyclePerTick)
    7. {
    8. dprintf("LOS_CyclePerTickGet = %d \n", uwcyclePerTick);
    9. }
    10. uwTickCount1 = LOS_TickCountGet();//获取Tick数
    11. if(0 != uwTickCount1)
    12. dprintf("LOS_TickCountGet = %d \n", (UINT32)uwTickCount1);
    13. }
    14. LOS_TaskDelay(200);//延迟200 Tick
    15. uwTickCount2 = LOS_TickCountGet();
    16. {
    17. dprintf("LOS_TickCountGet after delay = %d \n", (UINT32)uwTickCount2);
    18. }
    19. if((uwTickCount2 - uwTickCount1) >= 200)
    20. {
    21. uwRet = LOS_InspectStatusSetByID(LOS_INSPECT_SYSTIC,LOS_INSPECT_STU_SUCCESS);
    22. if (LOS_OK != uwRet)
    23. dprintf("Set Inspect Status Err\n");
    24. }
    25. return LOS_OK;
    26. }
    27. else
    28. {
    29. uwRet = LOS_InspectStatusSetByID(LOS_INSPECT_SYSTIC,LOS_INSPECT_STU_ERROR);
    30. if (LOS_OK != uwRet)
    31. {
    32. dprintf("Set Inspect Status Err\n");
    33. }
    34. return LOS_NOK;
    35. }

    结果验证

    编译运行得到的结果为:

    4.8时间管理 - 图1
    示例中系统时钟频率为80MHZ。