




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、所有 ©非經本公司播。技術,任何2018。 保留一切權利。和個人不得擅自摘抄、本文檔內容的部分或全部,并不得以傳商標和其他商標均為技術的商標。本文檔提及的其他所有商標或商標,由各自的所有人擁有。注意您的、服務或特性等應受公司商業(yè)合同和條款的約束,本文檔中描述的全部或部分、服務或特性可能不在您的明或保證?;蚴褂梅秶畠?。除非合同另有約定,公司對本文檔內容不做任何明示或默示的聲由于版本升級或其他,本文檔內容會不定期進行更新。除非另有約定,本文檔僅作為使用指導,本文檔中的所有陳述、信息和建議不任何明示或暗示的擔保。技術地址:市龍崗區(qū)坂田總部辦公樓:518129:客戶服務郵箱: suppor
2、客戶服務:文檔版本 01 (2018-04-24)專有和所有 ©信息技術iLiteOS開發(fā)指南目 錄目 錄1 知識共享協議說明12 前言23 概述43.1 背景介紹43.2 支持的核63.3 使用約束74 基礎內核84.1 任務84.1.1 概述84.1.2 開發(fā)指導114.1.3 注意事項154.1.4 編程實例164.2 內存184.2.1 概述184.2.2 動態(tài)內存 開發(fā)指導 注意事項 編程實例234.2.3 靜態(tài)內存 開發(fā)指導 注意事項 編程實例254.3
3、中斷機制274.3.1 概述274.3.2 開發(fā)指導294.3.3 注意事項294.3.4 編程實例294.4 隊列304.4.1 概述314.4.2 開發(fā)指導324.4.3 注意事項364.4.4 編程實例36文檔版本 01 (2018-04-24)專有和所有 ©信息技術iiLiteOS開發(fā)指南目 錄4. 384.5.1 概述394.5.2 開發(fā)指導404.5.3 注意事項424.5.4 編程實例434.6 互斥鎖444.6.1 概述454.6.2 開發(fā)指導454.6.3 注意事項484.6.4 編程實例484.7 信號量514.7.1 概述514.7.2 開發(fā)指導524.7.3
4、注意事項544.7.4 編程實例544.8 時間管理574.8.1 概述574.8.2 開發(fā)指導574.8.3 注意事項584.8.4 編程實例584.9 軟件定時器604.9.1 概述604.9.2 開發(fā)指導614.9.3 注意事項644.9.4 編程實例644.10 雙向鏈表674.10.1 概述674.10.2 開發(fā)指導674.10.3 注意事項684.10.4 編程實例685 AgentTiny.705.1 概述705.2 開發(fā)指導715.3 注意事項725.4 編程實例73文檔版本 01 (2018-04-24)專有和所有 ©信息技術iiiLiteOS開發(fā)指南1 知識共享協
5、議說明1 知識共享協議說明您可以自由地:在任何媒介以、本演繹 修改、轉換或以本為基礎進行創(chuàng)作只要你遵守協議條款,人就無法收回你的這些權利。惟須遵守下列條件:署名 您必須提供適當的,提供一個到證,并指示是否作出更改。您可以以任何合理的方式這樣做,但不是以任何方式表明,方贊同您或您的使用。非商業(yè)性使用 您不得將本用于商業(yè)目的。相同方式共享 如果您的修改、轉換,或以本為基礎進行創(chuàng)作,僅得依本素材的授權條款來散布您的貢獻。沒有附加限制 您不能增設法律條款或科技措施,來限制別人依為。條款本已的作:當您使用本素材中屬于公眾領域的元素,或當法律有例外或限制條款您的使用,則您不需要遵守本條款。未提供保證。本
6、權、隱私權、著作條款未必能完全提供您預期用途所需要的所有 權等其他權利,可能限制您如何使用本素材。例如:形象注意為了方便用戶理解,這是協議的概述. 可以licenses/by-sa/3.0/legalcode了解完整協議內容.文檔版本 01 (2018-04-24)專有和所有 ©信息技術1LiteOS開發(fā)指南2 前言2 前言目的本文檔介紹LiteOS的體系結構,并介紹如何進行內核相關的開發(fā)和調試。讀者對象本文檔主要適用于LiteOS Kernel的開發(fā)者。本文檔主要適用于以下對象:ll物聯網端側軟件開發(fā)工程師物聯網架構設計師符號約定在本文中可能出現下列標志,它們所代表的含義如下。文檔
7、版本 01 (2018-04-24)專有和所有 ©信息技術2符號說明用于警示緊急的情形,若不避免,將會導致死亡或嚴重的人身用于警示潛在的情形,若不避免,可能會導致或嚴重的人身用于警示潛在的情形,若不避免,可能會導致中度或輕微的人身用于傳遞設備或環(huán)境安全警示信息,若不避免,可能會導致設備損壞、數據丟失、設備性能降低或其它不可預知的結果,“注意”不涉及人身說明“說明”不是安全警示信息,不涉及人身、設備及環(huán)境信息LiteOS開發(fā)指南2 前言修訂修改 內容。累積了每次文檔更新的說明。最新版本的文檔包含以前所有文檔版本的更新文檔版本 01 (2018-04-24)專有和所有 ©信息技
8、術3日期修訂版本描述2018年03月30日C50社區(qū)開源版本LiteOS開發(fā)指南3 概述3 概述3.1 背景介紹3.2 支持的核3.3 使用約束3.1 背景介紹LiteOS是輕量級的實時操作系統,Kernel是IOT OS的內核。文檔版本 01 (2018-04-24)專有和所有 ©信息技術4LiteOS開發(fā)指南3 概述圖 3-1LiteOS Kernel 的基本框架圖LiteOS基礎內核是最精簡的LiteOS操作系統代碼,包括任務管理、內存管理、時間管理、通信機制、中斷管理、隊列管理、礎組件,可以單獨運行。管理、定時器等操作系統基LiteOS Kernel 的優(yōu)勢l l l ll高
9、實時性,高穩(wěn)定性。超小內核,基礎內核體積可以裁剪至不到10K。低功耗。支持動態(tài)加載、分散加載。支持功能靜態(tài)裁剪。各模塊簡介任務提供任務的創(chuàng)建、刪除、延遲、掛起、恢復等功能,以及鎖定和任務按優(yōu)先級高低的搶占調度及同優(yōu)先級時間片輪轉調度。任務調度。支持任務同步文檔版本 01 (2018-04-24)專有和所有 ©信息技術5LiteOS開發(fā)指南3 概述ll信號量:支持信號量的創(chuàng)建、刪除、申請和互斥鎖:支持互斥鎖的創(chuàng)建、刪除、申請和等功能。等功能。硬件相關提供中斷、定時器等功能。ll中斷:提供中斷的創(chuàng)建、刪除、使能、請求位的清除等功能。定時器:提供定時器的創(chuàng)建、刪除、啟動、停止等功能。IPC
10、通信提供、消息隊列功能。ll:支持讀和寫功能。消息隊列:支持消息隊列的創(chuàng)建、刪除、和接收功能。時間管理ll系統時間:系統時間是由定時/計數器產生的輸出脈沖觸發(fā)中斷而產生的。Tick時間:Tick是操作系統調度的基本時間Tick數決定,由用戶配置。,對應的時長由系統主頻及每秒l軟件定時器:以Tick為建的Tick軟中斷中被調用。的定時器功能,軟件定時器的超時處理函數在系統創(chuàng)內存管理l提供靜態(tài)內存和動態(tài)內存兩種算法,支持內存申請、。目前支持的內存管理算法有固定大小的BOX算法、動態(tài)申請SLAB、DLINK算法。l提供內存統計、內存越界檢測功能。3.2 支持的核表 3-1LiteOS 開源 Kern
11、el 支持的核文檔版本 01 (2018-04-24)專有和所有 ©信息技術6支持的核Cortex-M0STM32L053R8Tx ATSAMD21G18A ATSAMD21J18A ATSAMR21G18A EFM32HG322F64 MKL26Z128 MKW41Z512 LPC824M201JHI33 MM32L073PF nRF51822 NANO130KE3BNLiteOS開發(fā)指南3 概述3.3 使用約束lLiteOS提供一套致,但混用CMSIS和 接口申請信號量,但用開發(fā)驅動程序只能用LiteOS接口,同時支持CMSIS接口,它們功能一LiteOS接口可能會導致不可預知的
12、錯誤,例如用CMSISLiteOS接口信號量。lLiteOS的接口,上層APP建議用CMSIS接口。文檔版本 01 (2018-04-24)專有和所有 ©信息技術7支持的核Cortex-M3STM32F103RB ATSAM4SD32C EFM32GG990F1024 GD32F103VCT6 GD32150R8 GD32F190R8 GD32F207VC MM32F103CBT6 MM32L373PSCortex-M4STM32F411RE STM32F412ZG STM32F429ZI STM32F429IG STM32F476RG EFM32PG1B200F256GM48 GD
13、32F450IKCC3220SF LPC54114j256BD64:M4 nRF52840nRF52832 NUC472HI8AE ATSAMG55J19 ADuCM4050LFCortex-M7STM32F746ZG ATSAME70Q21LiteOS開發(fā)指南4 基礎內核4 基礎內核4.1 任務4.2 內存4.3 中斷機制4.4 隊列4.4.6 互斥鎖4.7 信號量4.8 時間管理4.9 軟件定時器4.10 雙向鏈表4.1 任務4.1.1 概述基本概念從系統的角度看,任務是競爭系統的最小運行單元。任務可以使用或等待CPU、使用內存空間等系統,并于其它任務運行。LiteOS的任務模塊可以給用戶
14、提供多個任務,實現了任務之間的切換和通信, 幫助用戶管理業(yè)務程序流程。這樣用戶可以將的精力投入到業(yè)務功能的實現中。LiteOS是一個支持多任務的操作系統。在LiteOS中,一個任務表示一個線程。LiteOS中的任務是搶占式調度機制,同時支持時間片輪轉調度方式。高優(yōu)先級的任務可打斷低優(yōu)先級任務,低優(yōu)先級任務必須在高優(yōu)先級任務阻塞或結束后才能得到調度。文檔版本 01 (2018-04-24)專有和所有 ©信息技術8LiteOS開發(fā)指南4 基礎內核LiteOS的任務一共有32個優(yōu)先級(0-31),最高優(yōu)先級為0,最低優(yōu)先級為31。任務相關概念任務狀態(tài)LiteOS系統中的每一任務都有多種運行
15、狀態(tài)。系統初始化完成后,創(chuàng)建的任務就可以在系統中競爭一定的,由內核進行調度。任務狀態(tài)通常分為以下四種:l ll就緒(Ready):該任務在就緒列表中,只等待CPU。運行(Running):該任務正在執(zhí)行。阻塞(Blocked):該任務不在就緒列表中。包含任務被掛起、任務被延時、任務正在等待信號量、讀寫隊列或者等待讀寫等。l態(tài)(Dead):該任務運行結束,等待系統回收。圖 4-1 任務狀態(tài)示意圖任務狀態(tài)遷移說明:l就緒態(tài)運行態(tài):任務創(chuàng)建后進入就緒態(tài),發(fā)生任務切換時,就緒列表中最高優(yōu)先級的任務被執(zhí)行,從而進入運行態(tài),但此刻該任務依舊在就緒列表中。l運行態(tài)阻塞態(tài):正在運行的任務發(fā)生阻塞(掛起、延時、
16、獲取互斥鎖、讀消息、讀信號量等待等) 時,該任務會從就緒列表中刪除,任務狀態(tài)由運行態(tài)變成阻塞態(tài),然后發(fā)生任務切換,運行就緒列表中剩余最高優(yōu)先級任務。l阻塞態(tài)就緒態(tài)(阻塞態(tài)運行態(tài)):阻塞的任務被恢復后(任務恢復、延時時間超時、讀信號量超時或讀到信號量等), 此時被恢復的任務會被加入就緒列表,從而由阻塞態(tài)變成就緒態(tài);此時如果被恢復任務的優(yōu)先級高于正在運行任務的優(yōu)先級,則會發(fā)生任務切換,將該任務由就緒態(tài)變成運行態(tài)。l就緒態(tài)阻塞態(tài):任務也有可能在就緒態(tài)時被阻塞(掛起),此時任務狀態(tài)會由就緒態(tài)轉變?yōu)樽枞麘B(tài),該任務從就緒列表中刪除,參與任務調度,直到該任務被恢復。l運行態(tài)就緒態(tài):有更高優(yōu)先級任務創(chuàng)建或者恢
17、復后,會發(fā)生任務調度,此刻就緒列表中最高優(yōu)先級任務變?yōu)檫\行態(tài),那么原先運行的任務由運行態(tài)變?yōu)榫途w態(tài),依然在就緒列表中。文檔版本 01 (2018-04-24)專有和所有 ©信息技術9LiteOS開發(fā)指南4 基礎內核l運行態(tài)態(tài)運行中的任務運行結束,內核自動將此任務刪除,任務狀態(tài)由運行態(tài)變?yōu)閼B(tài)。l阻塞態(tài)態(tài)阻塞的任務調用刪除接口,任務狀態(tài)由阻塞態(tài)變?yōu)閼B(tài)。任務ID任務ID,在任務創(chuàng)建時通過參數返回給用戶,作為任務的一個非常重要的標識。用戶可以通過任務ID對指定任務進行任務掛起、任務恢復、任務優(yōu)先級任務名等操作。優(yōu)先級表示任務執(zhí)行的優(yōu)先順序。任務的優(yōu)先級決定了在發(fā)生任務切換時即將要執(zhí)行的任務。
18、在就緒列表中的最高優(yōu)先級的任務將得到執(zhí)行。任務函數每個新任務得到調度后將執(zhí)行的函數。該函數由用戶實現,在任務創(chuàng)建時,通過任務創(chuàng)建結構體指定。任務塊TCB每一個任務都含有一個任務塊(TCB)。TCB包含了任務上下文棧指針(stack pointer)、任務狀態(tài)、任務優(yōu)先級、任務ID、任務名、任務棧大小等信息。TCB可以反映出每個任務運行情況。任務棧每一個任務都擁有一個的棧空間,我們稱為任務棧。??臻g里保存的信息包含局部變量、寄存器、函數參數、函數返回地址等。任務在任務切換時會將切出任務的上下文信息保存在自身的任務棧空間里面,以便任務恢復時還原現場,從而在任務恢復后在切出點繼續(xù)開始執(zhí)行。任務上下文
19、任務在運行過使用到的一些,如寄存器等,我們稱為任務上下文。當這個任務掛起時,其他任務繼續(xù)執(zhí)行,在任務恢復后,如果沒有把任務上下文保存下來,有可能任務切換會修改寄存器中的值,從而導致未知錯誤。因此,LiteOS在任務掛起的時候會將本任務的任務上下文信息,保存在的任務棧里面,以便任務恢復后,從??臻g中恢復掛起時的上下文信息,從而繼續(xù)執(zhí)行被掛起時被打斷的代碼。任務切換任務切換包含獲取就緒列表中最高優(yōu)先級任務、切出任務上下文保存、切入任務上下文恢復等動作。機制LiteOS任務管理模塊提供任務創(chuàng)建、任務刪除、任務延時、任務掛起和任務恢復、更改任務優(yōu)先級、鎖任務調度和任務調度、根據任務塊任務ID、根據ID
20、任務塊信息功能。在任務模塊初始化時,系統會先申請任務塊需要的內存空間,如果系統可用的內存空間小于其所需要的內存空間,任務模塊就會初始化失敗。如果任務初始化,則系統對任務塊內容進行初始化。文檔版本 01 (2018-04-24)專有和所有 ©信息技術10LiteOS開發(fā)指南4 基礎內核用戶創(chuàng)建任務時,系統會將任務棧進行初始化,預置上下文。此外,系統還會將“任務函數”地址放在相應位置。這樣在任務第一次啟動進入運行態(tài)時,將會執(zhí)行“任務函數”。4.1.2 開發(fā)指導使用場景任務創(chuàng)建后,內核可以執(zhí)行鎖任務調度,任務調度,掛起,恢復,操作,同時也可以設置任務優(yōu)先級,獲取任務優(yōu)先級。任務結束的時候,
21、則進行當前任務自刪除操作。功能LiteOS 系統中的任務管理模塊為用戶提供下面幾種功能。文檔版本 01 (2018-04-24)專有和所有 ©信息技術11功能分類接口名描述任務的創(chuàng)建和刪除LOS_TaskCreateOnly創(chuàng)建任務,并使該任務進入suspend狀態(tài),并不調度LOS_TaskCreate創(chuàng)建任務,并使該任務進入ready狀態(tài),并調度LOS_TaskDelete刪除指定的任務任務狀態(tài)LOS_TaskResume恢復掛起的任務LOS_TaskSuspend掛起指定的任務LOS_TaskDelay任務待LOS_TaskYield顯式放權,調整指定優(yōu)先級的任務調度順序任務調度
22、的LOS_TaskLock鎖任務調度LOS_TaskUnlock任務調度任務優(yōu)先級的LOS_CurTaskPriSet設置當前任務的優(yōu)先級LOS_TaskPriSet設置指定任務的優(yōu)先級LOS_TaskPriGet獲取指定任務的優(yōu)先級任務信息獲取LOS_CurTaskIDGet獲取當前任務的IDLOS_TaskInfoGet獲取指定任務的信息LOS_TaskStatusGet獲取指定任務的狀態(tài)LOS_TaskNameGet獲取指定任務的名稱LOS_TaskInfoMonitor所有任務,獲取所有任務的信息LOS_NextTaskIDGet獲取即將被調度的任務的IDLiteOS開發(fā)指南4 基礎內
23、核開發(fā)流程以創(chuàng)建任務為例,講解開發(fā)流程。1.在los_config.h中配置任務模塊。配置LOSCFG_BASE_CORE_TSK_LIMIT系統支持最大任務數,這個可以根據需求配置。配置LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE 空閑(IDLE)任務棧大小,這個默認即可。配置LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE默認任務棧大小,用戶根據的需求進行配置,在用戶創(chuàng)建任務時,可以進行性設置。配置LOSCFG_BASE_CORE_TIMESLICE時間片開關為YES。配置LOSCFG_BASE_CORE_TIMESLICE_TIM
24、EOUT時間片,根據實際情況配置。配置LOSCFG_BASE_CORE_TSK_MONITOR任務監(jiān)測模塊裁剪開關,可選擇是否打開。鎖任務LOS_TaskLock,鎖住任務,防止高優(yōu)先級任務調度。創(chuàng)建任務LOS_TaskCreate。任務LOS_TaskUnlock,讓任務按照優(yōu)先級進行調度。.6.7.延時任務LOS_TaskDelay,任務待。掛起指定的任務LOS_TaskSuspend,任務掛起等待恢復操作。恢復掛起的任務LOS_TaskResume。TASK 狀態(tài)LiteOS任務的狀態(tài)由內核自動維護,對用戶不可見,不需要用戶去操作。用戶在調用LOS_TaskCreate接口
25、創(chuàng)建任務時,需要將創(chuàng)建任務的TSK_INIT_PARAM_S 參數的uwResved域設置為LOS_TASK_STATUS_DETACHED,即自刪除狀態(tài),設置成自刪除狀態(tài)的任務會在運行完成時進行自刪除動作。注意在調用內核LOS_TaskCreate接口創(chuàng)建任務時,默認必須要將任務狀態(tài)設置為LOS_TASK_STATUS_DETACHED。TASK 錯誤碼對任務存在失敗可能性的操作,包括創(chuàng)建任務、刪除任務、掛起任務、恢復任務、延時任務等等,均需要返回對應的錯誤碼,以便快速錯誤。文檔版本 01 (2018-04-24)專有和所有 ©信息技術12序號定義實際數值描述參考解決方案1LOS_
26、ERRNO_TSK_ NO_MEMORY0x03000200內存空間不足分配更大的內存分區(qū)LiteOS開發(fā)指南4 基礎內核文檔版本 01 (2018-04-24)專有和所有 ©信息技術13序號定義實際數值描述參考解決方案2LOS_ERRNO_TSK_ PTR_NULL0x02000201任務參數為空檢查任務參數3LOS_ERRNO_TSK_ STKSZ_NOT_ALIG N0x02000202任務棧大小未對齊對齊任務棧4LOS_ERRNO_TSK_ PRIOR_ERROR0x02000203不正確的任務優(yōu)先級檢查任務優(yōu)先級5LOS_ERRNO_TSK_ ENTRY_NULL0x020
27、00204任務函數為空定義任務函數6LOS_ERRNO_TSK_ NAME_EMPTY0x02000205任務名為空設置任務名7LOS_ERRNO_TSK_ STKSZ_TOO_SMAL L0x02000206任務棧太小擴大任務棧8LOS_ERRNO_TSK_I D_INVALID0x02000207無效的任務ID檢查任務ID9LOS_ERRNO_TSK_ ALREADY_SUSPEN DED0x02000208任務已經被掛起等待這個任務被恢復后,再去嘗試掛起這個任務10LOS_ERRNO_TSK_ NOT_SUSPENDED0x02000209任務未被掛起掛起這個任務11LOS_ERRNO_
28、TSK_ NOT_CREATED0x0200020a任務未被創(chuàng)建創(chuàng)建這個任務12LOS_ERRNO_TSK_ OPERATE_SWTMR0x02000222不操作軟件定時器任務用戶不要試圖去操作軟件定時器任務的設置13LOS_ERRNO_TSK_ MSG_NONZERO0x0200020c任務信息非零暫不使用該錯誤碼14LOS_ERRNO_TSK_ DELAY_IN_INT0x0300020d中斷期間,進行任務延時等待中斷后再進行延時操作15LOS_ERRNO_TSK_ DELAY_IN_LOCK0x0200020e任務被鎖的狀態(tài)下,進行延時等待任務之后再進行延時操作16LOS_ERRNO_T
29、SK_ YIELD_INVALID_T ASK0x0200020f將被排入行程的任務是無效的檢查這個任務17LOS_ERRNO_TSK_ YIELD_NOT_ENOU GH_TASK0x02000210沒有或者僅有一個可用任務能進行行程安排增加任務數LiteOS開發(fā)指南4 基礎內核文檔版本 01 (2018-04-24)專有和所有 ©信息技術14序號定義實際數值描述參考解決方案18LOS_ERRNO_TSK_ TCB_UNAVAILABL E0x02000211沒有空閑的任務塊可用增加任務塊數量19LOS_ERRNO_TSK_ HOOK_NOT_MATC H0x02000212任務的
30、鉤子函數不匹配暫不使用該錯誤碼20LOS_ERRNO_TSK_ HOOK_IS_FULL0x02000213任務的鉤子函數數量超過界限暫不使用該錯誤碼21LOS_ERRNO_TSK_ OPERATE_IDLE0x02000214這是個IDLE任務檢查任務ID,不要試圖操作IDLE任務22LOS_ERRNO_TSK_ SUSPEND_LOCKED0x03000215將被掛起的任務處于被鎖狀態(tài)等待任務后再嘗試掛起任務23LOS_ERRNO_TSK_ FREE_STACK_FAIL ED0x02000217任務棧free失敗該錯誤碼暫不使用24LOS_ERRNO_TSK_ STKAREA_TOO_S
31、 MALL0x02000218任務棧區(qū)域太小該錯誤碼暫不使用25LOS_ERRNO_TSK_ ACTIVE_FAILED0x03000219任務觸發(fā)失敗創(chuàng)建一個IDLE任務后執(zhí)行任務轉換26LOS_ERRNO_TSK_ CONFIG_TOO_MA NY0x0200021a過多的任務配置項該錯誤碼暫不使用27LOS_ERRNO_TSK_ CP_SAVE_AREA_N OT_ALIGN0x0200021b暫無該錯誤碼暫不使用28LOS_ERRNO_TSK_ MSG_Q_TOO_MAN Y0x0200021d暫無該錯誤碼暫不使用29LOS_ERRNO_TSK_ CP_SAVE_AREA_N ULL0
32、x0200021e暫無該錯誤碼暫不使用30LOS_ERRNO_TSK_ SELF_DELETE_ERR0x0200021f暫無該錯誤碼暫不使用31LOS_ERRNO_TSK_ STKSZ_TOO_LARG E0x02000220任務棧大小設置過大減小任務棧大小32LOS_ERRNO_TSK_ SUSPEND_SWTMR_NOT_ALLOWED0x02000221不掛起軟件定時器任務檢查任務ID, 不要試圖掛起軟件定時器任務LiteOS開發(fā)指南4 基礎內核錯誤碼定義:錯誤碼是一個32位的單元,3124位表示錯誤等級,2316位表示錯誤碼標志,158位代表錯誤碼所屬模塊,70位表示錯誤碼序號,如下
33、例如:注意錯誤碼序號 0x16、0x1c、0x0b,未被定義,不可用。平臺差異性無。4.1.3 注意事項l創(chuàng)建新任務時,會對之前自刪除任務的任務塊和任務棧進行回收,非自刪除任務的塊和棧在任務刪除的時候已經回收。l任務名是指針沒有分配空間,在設置任務名時, 務名指針。若指定的任務棧大小為0,則使用配置項將局部變量的地址賦值給任lLOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE指定默認的任務棧大小。任務棧的大小按8字節(jié)大小對齊。確定任務棧大小的原則是,夠用就行:多了浪費,少了任務棧溢出。掛起任務的時候若為當前任務且已鎖任務,則不能被掛起??臻e(IDLE)任務及軟件定時
34、器任務不能被掛起或者刪除。ll l l l l ll在中斷處理函數中或者在鎖任務的情,執(zhí)行LOS_TaskDelay操作會失敗。鎖任務調度,并不關中斷,因此任務仍可被中斷打斷。鎖任務調度必須和任務調度配合使用。設置任務優(yōu)先級的時候可能會發(fā)生任務調度。除去空閑(IDLE)任務以外,系統可配置的任務個數是指:整個系統的任務總個數,而非用戶能使用的任務個數。例如:系統軟件定時器多占用一個任務數,那么系統可配置的任務就會減少一個。l ll為了防止系統出現問題,系統對軟件定時器任務優(yōu)先級進行修改。LOS_CurTaskPriSet和LOS_TaskPriSet接口不能在中斷中使用。LOS_TaskPri
35、Get接口傳入的task ID對應的任務未創(chuàng)建或者超過最大任務數,統一返回0xffff。文檔版本 01 (2018-04-24)專有和所有 ©信息技術15LOS_ERRNO_TSK_NO_MEMORY LOS_ERRNO_OS_FATAL(LOS_MOD_TSK, 0x00)#define LOS_ERRNO_OS_NORMAL(MID,ERRNO) (LOS_ERRTYPE_NORMAL | LOS_ERRNO_OS_ID | (UINT32)(MID) << 8) | (ERRNO)LOS_ERRTYPE_NORMAL :Define the error level
36、as critical LOS_ERRNO_OS_ID :OS error code flag.MID:OS_MOUDLE_IDERRNO:error ID numberLiteOS開發(fā)指南4 基礎內核l在刪除任務時要保證任務申請的(如互斥鎖、信號量等)已被。4.1.4 編程實例實例描述下面的示例介紹任務的基本操作方法,包含任務創(chuàng)建、任務延時、任務鎖與調度、掛起和恢復、當前任務PID、根據PID 調度的機制以及各接口的應用。任務信息等操作,闡述任務優(yōu)先級1.2.3.創(chuàng)建了2個任務:TaskHi和TaskLo。TaskHi為高優(yōu)先級任務。TaskLo為低優(yōu)先級任務。編程示例文檔版本 01 (20
37、18-04-24)專有和所有 ©信息技術16static UINT32 g_uwTskHiID; static UINT32 g_uwTskLoID;#define TSK_PRIOR_HI 4#define TSK_PRIOR_LO 5static UINT32 Example_TaskHi(VOID)UINT32 uwRet = LOS_OK;dprintf("Enter TaskHi Handler.rn");/*延時5個Tick,延時后該任務會掛起,執(zhí)行剩余任務中高優(yōu)先級的任務(g_uwTskLoID任務)*/ uwRet = LOS_TaskDelay(
38、5);if (uwRet != LOS_OK)dprintf("Delay Task Failed.rn"); return LOS_NOK;/*2個tick時間到了后,該任務恢復,繼續(xù)執(zhí)行*/ dprintf("TaskHi LOS_TaskDelay Done.rn");/*掛起自身任務*/uwRet = LOS_TaskSuspend(g_uwTskHiID); if (uwRet != LOS_OK)dprintf("Suspend TaskHi Failed.rn");uwRet = LOS_InspectStatusSet
39、ByID(LOS_INSPECT_TASK,LOS_INSPECT_STU_ERROR); if (LOS_OK != uwRet)dprintf("Set Inspect Status Errn");return LOS_NOK;dprintf("TaskHi LOS_TaskResume Success.rn");uwRet = LOS_InspectStatusSetByID(LOS_INSPECT_TASK,LOS_INSPECT_STU_SUCCESS); if (LOS_OK != uwRet)dprintf("Set Inspec
40、t Status Errn");/*刪除任務*/if(LOS_OK != LOS_TaskDelete(g_uwTskHiID)LiteOS開發(fā)指南4 基礎內核結果驗證編譯運行得到的結果為:完整實例代碼los_api_task.c文檔版本 01 (2018-04-24)專有和所有 ©信息技術17dprintf("TaskHi delete failed .n"); return LOS_NOK;return LOS_OK;/*低優(yōu)先級任務函數*/static UINT32 Example_TaskLo(VOID)UINT32 uwRet;dprintf(
41、"Enter TaskLo Handler.rn");/*延時10個Tick,延時后該任務會掛起,執(zhí)行剩余任務中就高優(yōu)先級的任務(背景任務)*/ uwRet = LOS_TaskDelay(10);if (uwRet != LOS_OK)dprintf("Delay TaskLo Failed.rn"); return LOS_NOK;dprintf("TaskHi LOS_TaskSuspend Success.rn");/*恢復被掛起的任務g_uwTskHiID*/ uwRet = LOS_TaskResume(g_uwTskHi
42、ID); if (uwRet != LOS_OK)dprintf("Resume TaskHi Failed.rn");uwRet = LOS_InspectStatusSetByID(LOS_INSPECT_TASK,LOS_INSPECT_STU_ERROR); if (LOS_OK != uwRet)dprintf("Set Inspect Status Errn");return LOS_NOK;/*刪除任務*/if(LOS_OK != LOS_TaskDelete(g_uwTskLoID)dprintf("TaskLete faile
43、d .n");return LOS_NOK;return LOS_OK;LiteOS開發(fā)指南4 基礎內核4.2 內存4.2.1 概述基本概念內存管理模塊管理系統的內存,它是操作系統的模塊之一。主要包括內存的初始化、分配以及。在系統運行過,內存管理模塊通過對內存的申請/操作,來管理用戶和OS對內存的使用,使內存的利用率和使用效率達到最優(yōu),同時最大限度地解決系統的內存碎片問題。LiteOS的內存管理分為靜態(tài)內存管理和動態(tài)內存管理,提供內存初始化、分配、l等功能。動態(tài)內存:在動態(tài)內存 優(yōu)點:按需分配。分配用戶指定大小的內存塊。 缺點:內存可能出現碎片。l靜態(tài)內存:在靜態(tài)內存 優(yōu)點:分配和分
44、配用戶初始化時預設(固定)大小的內存塊。效率高,靜態(tài)內存無碎片。 缺點:只能申請到初始化預設大小的內存塊,不能按需申請。動態(tài)內存機制動態(tài)內存管理,即在內存充足的情,從系統配置的一塊比較大的連續(xù)內存(內存池),根據用戶需求,分配任意大小的內存塊。當用戶不需要該內存塊時,又可以供下一次使用。與靜態(tài)內存相比,動態(tài)內存管理的好處是按需分配,缺點是內存LiteOS動態(tài)內存支持DLINK和BEST LITTLE兩種標準算法。容易出現碎片。1.DLINKDLINK動態(tài)內存管理結構如圖1所示:圖 4-2文檔版本 01 (2018-04-24)專有和所有 ©信息技術18LiteOS開發(fā)指南4 基礎內核
45、第一部分:堆內存(也稱內存池)的起始地址及堆區(qū)域總大小第二部分:本身是一個數組,每個元素是一個雙向鏈表,所有free節(jié)點的分類掛在這個數組的雙向鏈表中。頭都會被假設內存的最小節(jié)點為2min字節(jié),則數組的第一個雙向鏈表的是所有size為2min<size< 2min+1的free節(jié)點,第二個雙向鏈表的是所有size為2min+1<size< 2min+2的free節(jié)點,依次類推第n個雙向鏈表的是所有size為2min+n-1<size< 2min+n的free節(jié)點。每次申請內存的時候,會從這個數組檢索最合適大小的free節(jié)點,進行分配內存。每次內存時,會將該片
46、內存作為free節(jié)點至這個數組,以便下次再利用。第三部分:占用內存大部分的空間,是用于存放各節(jié)點的實際區(qū)域。以下是LOS_MEM_DYN_NODE節(jié)點結構體申明以及簡單介紹: typedef struct tagLOS_MEM_DYN_NODELOS_DL_LIST stFreeNodeInfo;struct tagLOS_MEM_DYN_NODE *pstPreNode; UINT32 uwSizeAndFlag;LOS_MEM_DYN_NODE;圖 4-32.BEST LITTLELiteOS的動態(tài)內存分配支持最佳適配算法,即BEST LITTLE,每次分配時選擇內存池中最小最適合的內存塊
47、進行分配。LiteOS動態(tài)內存管理在最佳適配算法的基礎上加入了SLAB機制,用于分配固定大小的內存塊,進而減小產生內存碎片的可能性。LiteOS內存管理中的SLAB機制支持可配置的SLAB CLASS數目及每個CLASS的最大空間,現以SLAB CLASS數目為4,每個CLASS的最大空間為512字節(jié)為例說明SLAB機制。在內存共有4個SLAB CLASS,每個SLAB CLASS的總共可分配大小為512字節(jié),第一個SLAB CLASS被分為32個16字節(jié)的SLAB塊,第二個SLAB CLASS被分為16 個32字節(jié)的SLAB塊,第三個SLAB CLASS被分為8個64字節(jié)的SLAB塊,第四個
48、SLAB CLASS被分為4個128字節(jié)的SLAB塊。這4個SLAB CLASS是從內存按照最佳適配算法分配出來的。初始化內存管理時,首先初始化內存池,然后在初始化后的內存按照最佳適配算法申請4個SLAB CLASS,再逐個按照SLAB內存管理機制初始化4個SLAB CLASS。文檔版本 01 (2018-04-24)專有和所有 ©信息技術19LiteOS開發(fā)指南4 基礎內核每次申請內存時,先在滿足申請大小的最佳SLAB CLASS中申請,(比如用戶申請20字節(jié)內存,就在SLAB塊大小為32字節(jié)的SLAB CLASS中申請),如果申請,就將SLAB內存塊整塊返回給用戶,時整塊回收。如
49、果滿足條件的SLAB CLASS中已無可以分配的內存塊,則繼續(xù)向內存池按照最佳適配算法申請。需要注意的是,如果當前的SLAB CLASS中無可用SLAB塊了,則直接向內存池申請,而SLAB塊空間的SLAB CLASS申請。繼續(xù)向有著更大內存時,先檢查的內存塊是否屬于SLAB CLASS,如果是SLAB CLASS的內存塊,則還回對應的SLAB CLASS中,否則還回內存。靜態(tài)內存機制靜態(tài)內存實質上是一塊靜態(tài)數組,靜態(tài)內存池內的塊大小在初始化時設定,初始化后塊大小不可變更。靜態(tài)內存一個塊和若干相同大小的內存塊。塊位于內存池頭部,用于內存塊管理。內存塊的申請和以塊大小為粒度。圖 4-4 靜態(tài)內存示
50、意圖4.2.2 動態(tài)內存 開發(fā)指導使用場景內存管理的主要工作是動態(tài)的劃分并管理用戶分配好的內存區(qū)間。動態(tài)內存管理主要是在用戶需要使用大小不等的內存塊的場景中使用。當用戶需要分配內存時,可以通過操作系統的動態(tài)內存申請函數索取指定大小內存塊,一旦使用完畢,通過動態(tài)內存函數歸還所占用內存,使之可以重復使用。文檔版本 01 (2018-04-24)專有和所有 ©信息技術20LiteOS開發(fā)指南4 基礎內核功能LiteOS系統中的動態(tài)內存管理模塊為用戶提供下面幾種功能,具體的API詳見接口手冊。DLINK 開發(fā)流程1.配置:OS_SYS_MEM_ADDR:系統動態(tài)內存池起始地址,
51、一般不需要修改OS_SYS_MEM_SIZE:系統動態(tài)內存池大小,以byte為后未使用的空間,系統默認分配DDRLOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK:內存越界檢測開關,默認關閉。打開后,每次申請動態(tài)內存時執(zhí)行動態(tài)內存塊越界檢查;每次存時執(zhí)行靜態(tài)內存塊越界檢查。初始化LOS_MemInit。靜態(tài)內2.初始一個內存如圖,生成一個 EndNode,并且剩余的內存全部被標記為FreeNode節(jié)點。注:EndNode作為內存池末尾的節(jié)點,size為0。3.申請任意大小的動態(tài)內存LOS_MemAlloc。動態(tài)內存是否存在申請量大小的空間,若存在,則劃出一塊內存塊,以指針形式返回,若不存在,返回NULL。調用三次LOS_MemAlloc函數可以創(chuàng)建三個節(jié)點,假設名稱分別為UsedA,UsedB, UsedC,大小分別
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 內科醫(yī)患溝通技巧
- 開顱鉆顱術后引流管的護理
- 營銷策略流程圖
- 圓錐曲線精美課件
- 風險分散型草牧場托管養(yǎng)殖合同
- 市場營銷策劃與市場戰(zhàn)略制定專員勞動合同
- 知識產權評估與財務顧問服務合作協議
- 跨國公司車輛收費員勞務派遣協議書
- 商業(yè)大廈立體停車庫租賃合同
- 親子插畫故事書創(chuàng)作合同
- 個人信息保護合規(guī)審計師CCRC-PIPCA含答案
- 2025年山西焦煤集團有限責任公司招聘筆試參考題庫含答案解析
- 2025年福建日報社招聘筆試參考題庫含答案解析
- 國家開放大學-法學專業(yè)-2023年秋季《法律文化》形成性考核作業(yè)答案
- GA 1517-2018金銀珠寶營業(yè)場所安全防范要求
- 提高痰留取成功率PDCA課件
- 組合導航與融合導航解析課件
- 伊金霍洛旗事業(yè)編招聘考試《行測》歷年真題匯總及答案解析精選V
- 深基坑支護工程驗收表
- 浦發(fā)銀行個人信用報告異議申請表
- 顱腦CT影像課件
評論
0/150
提交評論