tft每日頭條

 > 科技

 > liteos和linux區别

liteos和linux區别

科技 更新时间:2024-09-29 07:33:46

持續分享嵌入式技術,操作系統,算法,c語言/python等,歡迎小友關注支持

概述

基本概念

時間管理以系統時鐘為基礎。時間管理提供給應用程序所有和時間有關的服務。

系統時鐘是由定時/計數器産生的輸出脈沖觸發中斷而産生的,一般定義為整數或長整數。輸出脈沖的周期叫做一個“時鐘滴答”。系統時鐘也稱為時标或者Tick。一個Tick的時長可以靜态配置。

用戶是以秒、毫秒為單位計時,而芯片CPU的計時是以Tick為單位的,當用戶需要對系統操作時,例如任務挂起、延時等,輸入秒為單位的數值,此時需要時間管理模塊對二者進行轉換。

Tick與秒之間的對應關系可以配置。

Huawei LiteOS的時間管理模塊提供時間轉換、統計、延遲功能以滿足用戶對時間相關需求的實現。

相關概念

  • Cycle

系統最小的計時單位。Cycle的時長由系統主頻決定,系統主頻就是每秒鐘的Cycle數。

  • Tick

Tick是操作系統的基本時間單位,對應的時長由系統主頻及每秒Tick數決定,由用戶配置。

開發指導

Huawei LiteOS系統中的時間管理主要提供以下兩種功能:

  1. 時間轉換:根據主頻實現CPU Tick數到毫秒、微秒的轉換。
  2. 時間統計:獲取系統Tick數。

liteos和linux區别(liteos實時操作系統之時間管理)1

開發流程

時間管理的典型開發流程:

确認配置項LOSCFG_BASE_CORE_TICK_HW_TIME為YES開啟狀态。

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

調用時鐘轉換接口。

獲取系統Tick數完成時間統計。

通過LOS_TickCountGet獲取全局g_ullTickCount。

注意事項

獲取系統Tick數需要在系統時鐘使能之後。

時間管理不是單獨的功能模塊,依賴于los_config.h中的OS_SYS_CLOCK和LOSCFG_BASE_CORE_TICK_PER_SECOND兩個配置選項。

系統的Tick數在關中斷的情況下不進行計數,故系統Tick數不能作為準确時間計算。

編程實例

在下面的例子中,介紹了時間管理的基本方法,包括:

時間轉換:将毫秒數轉換為Tick數,或将Tick數轉換為毫秒數。

時間統計和時間延遲:統計每秒的Cycle數、Tick數和延遲後的Tick數。

編程示例

前提條件:

配好LOSCFG_BASE_CORE_TICK_PER_SECOND每秒的Tick數。

配好OS_SYS_CLOCK 系統時鐘,單位: Hz。

時間轉換:

VOID Example_TransformTime(VOID) { UINT32 uwMs; UINT32 uwTick; uwTick = LOS_MS2Tick(10000);//10000 ms數轉換為Tick數 printf("uwTick = %d \n",uwTick); uwMs= LOS_Tick2MS(100);//100 Tick數轉換為ms數 printf("uwMs = %d \n",uwMs); }

時間統計和時間延遲:

UINT32 Example_GetTick(VOID) { UINT32 uwRet = LOS_OK; UINT32 uwcyclePerTick; UINT64 uwTickCount1,uwTickCount2; uwcyclePerTick = LOS_CyclePerTickGet();//每個Tick多少Cycle數 if(0 != uwcyclePerTick) { dprintf("LOS_CyclePerTickGet = %d \n", uwcyclePerTick); } uwTickCount1 = LOS_TickCountGet();//獲取Tick數 if(0 != uwTickCount1) { dprintf("LOS_TickCountGet = %d \n", (UINT32)uwTickCount1); } LOS_TaskDelay(200);//延遲200 Tick uwTickCount2 = LOS_TickCountGet(); if(0 != uwTickCount2) { dprintf("LOS_TickCountGet after delay = %d \n", (UINT32)uwTickCount2); } if((uwTickCount2 - uwTickCount1) >= 200) { uwRet = LOS_InspectStatusSetByID(LOS_INSPECT_SYSTIC,LOS_INSPECT_STU_SUCCESS); if (LOS_OK != uwRet) { dprintf("Set Inspect Status Err\n"); } return LOS_OK; } else { uwRet = LOS_InspectStatusSetByID(LOS_INSPECT_SYSTIC,LOS_INSPECT_STU_ERROR); if (LOS_OK != uwRet) { dprintf("Set Inspect Status Err\n"); } return LOS_NOK; } }

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved