# æ—¶é—´ç®¡ç† ## 基本概念 时间管ç†ä»¥ç³»ç»Ÿæ—¶é’Ÿä¸ºåŸºç¡€ã€‚æ—¶é—´ç®¡ç†æä¾›ç»™åº”ç”¨ç¨‹åºæ‰€æœ‰å’Œæ—¶é—´æœ‰å…³çš„æœåŠ¡ã€‚ç³»ç»Ÿæ—¶é’Ÿæ˜¯ç”±å®šæ—¶/计数器产生的输出脉冲触å‘䏿–而产生的,一般定义为整数或长整数。输出脉冲的周期å«åšä¸€ä¸ªâ€œæ—¶é’Ÿæ»´ç”â€ã€‚ ç³»ç»Ÿæ—¶é’Ÿä¹Ÿç§°ä¸ºæ—¶æ ‡æˆ–è€…Tick。一个Tick的时长å¯ä»¥é™æ€é…ç½®ã€‚ç”¨æˆ·æ˜¯ä»¥ç§’ã€æ¯«ç§’为å•ä½è®¡æ—¶ï¼Œè€Œæ“作系统时钟计时是以Tick为å•ä½çš„,当用户需è¦å¯¹ç³»ç»Ÿæ“作时,例如任务挂起ã€å»¶æ—¶ç‰ï¼Œè¾“入秒为å•ä½çš„æ•°å€¼ï¼Œæ¤æ—¶éœ€è¦æ—¶é—´ç®¡ç†æ¨¡å—对二者进行转æ¢ã€‚ **Tick与秒之间的对应关系å¯ä»¥é…置。** - **Cycle** 系统最å°çš„计时å•ä½ã€‚Cycle的时长由系统主频决定,系统主频就是æ¯ç§’é’Ÿçš„Cycle数。 - **Tick** Tick是æ“作系统的基本时间å•ä½ï¼Œå¯¹åº”çš„æ—¶é•¿ç”±ç³»ç»Ÿä¸»é¢‘åŠæ¯ç§’Tick数决定,由用户é…置。 **OpenHarmonyç³»ç»Ÿçš„æ—¶é—´ç®¡ç†æ¨¡å—æä¾›æ—¶é—´è½¬æ¢ã€ç»Ÿè®¡ã€å»¶è¿ŸåŠŸèƒ½ä»¥æ»¡è¶³ç”¨æˆ·å¯¹æ—¶é—´ç›¸å…³éœ€æ±‚çš„å®žçŽ°ã€‚** ## 开呿Œ‡å¯¼ 用户需è¦äº†è§£å½“å‰ç³»ç»Ÿè¿è¡Œçš„æ—¶é—´ä»¥åŠTickä¸Žç§’ã€æ¯«ç§’之间的转æ¢å…³ç³»ï¼Œä»¥åŠéœ€è¦ä½¿ç”¨åˆ°æ—¶é—´ç®¡ç†æ¨¡å—的接å£ã€‚ ### 接å£è¯´æ˜Ž OpenHarmony LiteOS-Aå†…æ ¸çš„æ—¶é—´ç®¡ç†æä¾›ä»¥ä¸‹å‡ ç§åŠŸèƒ½ï¼ŒæŽ¥å£è¯¦ç»†ä¿¡æ¯å¯æŸ¥çœ‹APIå‚考。 **表1** 时间管ç†ç›¸å…³æŽ¥å£è¯´æ˜Žï¼š | 功能分类 | æŽ¥å£æè¿° | | -------- | ------------------------------------------------------------ | | æ—¶é—´è½¬æ¢ | LOS_MS2Tickï¼šæ¯«ç§’è½¬æ¢æˆTick<br/>LOS_Tick2MS:Tickè½¬æ¢æˆæ¯«ç§’ | | 时间统计 | LOS_TickCountGet:获å–当å‰Tickæ•°<br/>LOS_CyclePerTickGet:æ¯ä¸ªTickçš„cycleæ•° | ### 开呿µç¨‹ 1. è°ƒç”¨æ—¶é—´è½¬æ¢æŽ¥å£ï¼› 2. 获å–系统Tickæ•°å®Œæˆæ—¶é—´ç»Ÿè®¡ç‰ã€‚ >  **说明:** > > - 获å–系统Tick数需è¦åœ¨ç³»ç»Ÿæ—¶é’Ÿä½¿èƒ½ä¹‹åŽã€‚ > > - 时间管ç†ä¸æ˜¯å•独的功能模å—,ä¾èµ–于los_config.hä¸çš„OS_SYS_CLOCKå’ŒLOSCFG_BASE_CORE_TICK_PER_SECOND两个é…置选项。 > > - 系统的Tickæ•°åœ¨å…³ä¸æ–的情况下ä¸è¿›è¡Œè®¡æ•°ï¼Œæ•…系统Tickæ•°ä¸èƒ½ä½œä¸ºå‡†ç¡®æ—¶é—´è®¡ç®—。 ### 编程实例 å‰ç½®æ¡ä»¶ï¼š - é…置好LOSCFG_BASE_CORE_TICK_PER_SECOND,å³ç³»ç»Ÿæ¯ç§’çš„Tick数,范围(0, 1000)。 - é…置好OS_SYS_CLOCK 系统时钟频率,å•ä½ï¼šHz。 **示例代ç ** 时间转æ¢ï¼š ``` VOID Example_TransformTime(VOID) { UINT32 uwMs; UINT32 uwTick; uwTick = LOS_MS2Tick(10000); //10000 ms数转æ¢ä¸ºTickæ•° PRINTK("uwTick = %d \n",uwTick); uwMs= LOS_Tick2MS(100); //100 Tick数转æ¢ä¸ºmsæ•° PRINTK("uwMs = %d \n",uwMs); } ``` 时间统计和时间延迟: ``` VOID Example_GetTime(VOID) { UINT32 uwcyclePerTick; UINT64 uwTickCount; uwcyclePerTick = LOS_CyclePerTickGet(); //æ¯ä¸ªTick多少Cycleæ•° if(0 != uwcyclePerTick) { PRINTK("LOS_CyclePerTickGet = %d \n", uwcyclePerTick); } uwTickCount = LOS_TickCountGet(); //获å–Tickæ•° if(0 != uwTickCount) { PRINTK("LOS_TickCountGet = %d \n", (UINT32)uwTickCount); } LOS_TaskDelay(200);//延迟200 Tick uwTickCount = LOS_TickCountGet(); if(0 != uwTickCount) { PRINTK("LOS_TickCountGet after delay = %d \n", (UINT32)uwTickCount); } } ``` **结果验è¯** 编译è¿è¡Œçš„结果如下: 时间转æ¢ï¼š ``` uwTick = 10000 uwMs = 100 ``` 时间统计和时间延迟: ``` LOS_CyclePerTickGet = 49500 LOS_TickCountGet = 347931 LOS_TickCountGet after delay = 348134 ```