02綜合實驗三定位_第1頁
02綜合實驗三定位_第2頁
02綜合實驗三定位_第3頁
02綜合實驗三定位_第4頁
02綜合實驗三定位_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、所有 ©非經(jīng)本公司播。技術(shù),任何2018。 保留一切權(quán)利。和個人不得擅自摘抄、本文檔內(nèi)容的部分或全部,并不得以傳商標和其他商標均為技術(shù)的商標。本文檔提及的其他所有商標或商標,由各自的所有人擁有。注意您的、服務或特性等應受公司商業(yè)合同和條款的約束,本文檔中描述的全部或部分、服務或特性可能不在您的明或保證?;蚴褂梅秶畠?nèi)。除非合同另有約定,公司對本文檔內(nèi)容不做任何明示或默示的聲由于版本升級或其他,本文檔內(nèi)容會不定期進行更新。除非另有約定,本文檔僅作為使用指導,本文檔中的所有陳述、信息和建議不任何明示或暗示的擔保。技術(shù)地址:市龍崗區(qū)坂田總部辦公樓:518129:客戶服務郵箱: suppor

2、客戶服務:文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)iLiteOS開發(fā)指南目 錄目 錄1 知識共享協(xié)議說明12 前言23 概述43.1 背景介紹43.2 支持的核63.3 使用約束74 基礎內(nèi)核84.1 任務84.1.1 概述84.1.2 開發(fā)指導114.1.3 注意事項154.1.4 編程實例164.2 內(nèi)存184.2.1 概述184.2.2 動態(tài)內(nèi)存 開發(fā)指導 注意事項 編程實例234.2.3 靜態(tài)內(nè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)專有和所有 ©信息技術(shù)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)專有和所有 ©信息技術(shù)iiiLiteOS開發(fā)指南1 知識共享協(xié)

5、議說明1 知識共享協(xié)議說明您可以自由地:在任何媒介以、本演繹 修改、轉(zhuǎn)換或以本為基礎進行創(chuàng)作只要你遵守協(xié)議條款,人就無法收回你的這些權(quán)利。惟須遵守下列條件:署名 您必須提供適當?shù)模峁┮粋€到證,并指示是否作出更改。您可以以任何合理的方式這樣做,但不是以任何方式表明,方贊同您或您的使用。非商業(yè)性使用 您不得將本用于商業(yè)目的。相同方式共享 如果您的修改、轉(zhuǎn)換,或以本為基礎進行創(chuàng)作,僅得依本素材的授權(quán)條款來散布您的貢獻。沒有附加限制 您不能增設法律條款或科技措施,來限制別人依為。條款本已的作:當您使用本素材中屬于公眾領域的元素,或當法律有例外或限制條款您的使用,則您不需要遵守本條款。未提供保證。本

6、權(quán)、隱私權(quán)、著作條款未必能完全提供您預期用途所需要的所有 權(quán)等其他權(quán)利,可能限制您如何使用本素材。例如:形象注意為了方便用戶理解,這是協(xié)議的概述. 可以licenses/by-sa/3.0/legalcode了解完整協(xié)議內(nèi)容.文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)1LiteOS開發(fā)指南2 前言2 前言目的本文檔介紹LiteOS的體系結(jié)構(gòu),并介紹如何進行內(nèi)核相關(guān)的開發(fā)和調(diào)試。讀者對象本文檔主要適用于LiteOS Kernel的開發(fā)者。本文檔主要適用于以下對象:ll物聯(lián)網(wǎng)端側(cè)軟件開發(fā)工程師物聯(lián)網(wǎng)架構(gòu)設計師符號約定在本文中可能出現(xiàn)下列標志,它們所代表的含義如下。文檔

7、版本 01 (2018-04-24)專有和所有 ©信息技術(shù)2符號說明用于警示緊急的情形,若不避免,將會導致死亡或嚴重的人身用于警示潛在的情形,若不避免,可能會導致或嚴重的人身用于警示潛在的情形,若不避免,可能會導致中度或輕微的人身用于傳遞設備或環(huán)境安全警示信息,若不避免,可能會導致設備損壞、數(shù)據(jù)丟失、設備性能降低或其它不可預知的結(jié)果,“注意”不涉及人身說明“說明”不是安全警示信息,不涉及人身、設備及環(huán)境信息LiteOS開發(fā)指南2 前言修訂修改 內(nèi)容。累積了每次文檔更新的說明。最新版本的文檔包含以前所有文檔版本的更新文檔版本 01 (2018-04-24)專有和所有 ©信息技

8、術(shù)3日期修訂版本描述2018年03月30日C50社區(qū)開源版本LiteOS開發(fā)指南3 概述3 概述3.1 背景介紹3.2 支持的核3.3 使用約束3.1 背景介紹LiteOS是輕量級的實時操作系統(tǒng),Kernel是IOT OS的內(nèi)核。文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)4LiteOS開發(fā)指南3 概述圖 3-1LiteOS Kernel 的基本框架圖LiteOS基礎內(nèi)核是最精簡的LiteOS操作系統(tǒng)代碼,包括任務管理、內(nèi)存管理、時間管理、通信機制、中斷管理、隊列管理、礎組件,可以單獨運行。管理、定時器等操作系統(tǒng)基LiteOS Kernel 的優(yōu)勢l l l ll高

9、實時性,高穩(wěn)定性。超小內(nèi)核,基礎內(nèi)核體積可以裁剪至不到10K。低功耗。支持動態(tài)加載、分散加載。支持功能靜態(tài)裁剪。各模塊簡介任務提供任務的創(chuàng)建、刪除、延遲、掛起、恢復等功能,以及鎖定和任務按優(yōu)先級高低的搶占調(diào)度及同優(yōu)先級時間片輪轉(zhuǎn)調(diào)度。任務調(diào)度。支持任務同步文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)5LiteOS開發(fā)指南3 概述ll信號量:支持信號量的創(chuàng)建、刪除、申請和互斥鎖:支持互斥鎖的創(chuàng)建、刪除、申請和等功能。等功能。硬件相關(guān)提供中斷、定時器等功能。ll中斷:提供中斷的創(chuàng)建、刪除、使能、請求位的清除等功能。定時器:提供定時器的創(chuàng)建、刪除、啟動、停止等功能。IPC

10、通信提供、消息隊列功能。ll:支持讀和寫功能。消息隊列:支持消息隊列的創(chuàng)建、刪除、和接收功能。時間管理ll系統(tǒng)時間:系統(tǒng)時間是由定時/計數(shù)器產(chǎn)生的輸出脈沖觸發(fā)中斷而產(chǎn)生的。Tick時間:Tick是操作系統(tǒng)調(diào)度的基本時間Tick數(shù)決定,由用戶配置。,對應的時長由系統(tǒng)主頻及每秒l軟件定時器:以Tick為建的Tick軟中斷中被調(diào)用。的定時器功能,軟件定時器的超時處理函數(shù)在系統(tǒng)創(chuàng)內(nèi)存管理l提供靜態(tài)內(nèi)存和動態(tài)內(nèi)存兩種算法,支持內(nèi)存申請、。目前支持的內(nèi)存管理算法有固定大小的BOX算法、動態(tài)申請SLAB、DLINK算法。l提供內(nèi)存統(tǒng)計、內(nèi)存越界檢測功能。3.2 支持的核表 3-1LiteOS 開源 Kern

11、el 支持的核文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)6支持的核Cortex-M0STM32L053R8Tx ATSAMD21G18A ATSAMD21J18A ATSAMR21G18A EFM32HG322F64 MKL26Z128 MKW41Z512 LPC824M201JHI33 MM32L073PF nRF51822 NANO130KE3BNLiteOS開發(fā)指南3 概述3.3 使用約束lLiteOS提供一套致,但混用CMSIS和 接口申請信號量,但用開發(fā)驅(qū)動程序只能用LiteOS接口,同時支持CMSIS接口,它們功能一LiteOS接口可能會導致不可預知的

12、錯誤,例如用CMSISLiteOS接口信號量。lLiteOS的接口,上層APP建議用CMSIS接口。文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)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 基礎內(nèi)核4 基礎內(nèi)核4.1 任務4.2 內(nèi)存4.3 中斷機制4.4 隊列4.4.6 互斥鎖4.7 信號量4.8 時間管理4.9 軟件定時器4.10 雙向鏈表4.1 任務4.1.1 概述基本概念從系統(tǒng)的角度看,任務是競爭系統(tǒng)的最小運行單元。任務可以使用或等待CPU、使用內(nèi)存空間等系統(tǒng),并于其它任務運行。LiteOS的任務模塊可以給用戶

14、提供多個任務,實現(xiàn)了任務之間的切換和通信, 幫助用戶管理業(yè)務程序流程。這樣用戶可以將的精力投入到業(yè)務功能的實現(xiàn)中。LiteOS是一個支持多任務的操作系統(tǒng)。在LiteOS中,一個任務表示一個線程。LiteOS中的任務是搶占式調(diào)度機制,同時支持時間片輪轉(zhuǎn)調(diào)度方式。高優(yōu)先級的任務可打斷低優(yōu)先級任務,低優(yōu)先級任務必須在高優(yōu)先級任務阻塞或結(jié)束后才能得到調(diào)度。文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)8LiteOS開發(fā)指南4 基礎內(nèi)核LiteOS的任務一共有32個優(yōu)先級(0-31),最高優(yōu)先級為0,最低優(yōu)先級為31。任務相關(guān)概念任務狀態(tài)LiteOS系統(tǒng)中的每一任務都有多種運行

15、狀態(tài)。系統(tǒng)初始化完成后,創(chuàng)建的任務就可以在系統(tǒng)中競爭一定的,由內(nèi)核進行調(diào)度。任務狀態(tài)通常分為以下四種:l ll就緒(Ready):該任務在就緒列表中,只等待CPU。運行(Running):該任務正在執(zhí)行。阻塞(Blocked):該任務不在就緒列表中。包含任務被掛起、任務被延時、任務正在等待信號量、讀寫隊列或者等待讀寫等。l態(tài)(Dead):該任務運行結(jié)束,等待系統(tǒng)回收。圖 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)轉(zhuǎn)變?yōu)樽枞麘B(tài),該任務從就緒列表中刪除,參與任務調(diào)度,直到該任務被恢復。l運行態(tài)就緒態(tài):有更高優(yōu)先級任務創(chuàng)建或者恢

17、復后,會發(fā)生任務調(diào)度,此刻就緒列表中最高優(yōu)先級任務變?yōu)檫\行態(tài),那么原先運行的任務由運行態(tài)變?yōu)榫途w態(tài),依然在就緒列表中。文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)9LiteOS開發(fā)指南4 基礎內(nèi)核l運行態(tài)態(tài)運行中的任務運行結(jié)束,內(nèi)核自動將此任務刪除,任務狀態(tài)由運行態(tài)變?yōu)閼B(tài)。l阻塞態(tài)態(tài)阻塞的任務調(diào)用刪除接口,任務狀態(tài)由阻塞態(tài)變?yōu)閼B(tài)。任務ID任務ID,在任務創(chuàng)建時通過參數(shù)返回給用戶,作為任務的一個非常重要的標識。用戶可以通過任務ID對指定任務進行任務掛起、任務恢復、任務優(yōu)先級任務名等操作。優(yōu)先級表示任務執(zhí)行的優(yōu)先順序。任務的優(yōu)先級決定了在發(fā)生任務切換時即將要執(zhí)行的任務。

18、在就緒列表中的最高優(yōu)先級的任務將得到執(zhí)行。任務函數(shù)每個新任務得到調(diào)度后將執(zhí)行的函數(shù)。該函數(shù)由用戶實現(xiàn),在任務創(chuàng)建時,通過任務創(chuàng)建結(jié)構(gòu)體指定。任務塊TCB每一個任務都含有一個任務塊(TCB)。TCB包含了任務上下文棧指針(stack pointer)、任務狀態(tài)、任務優(yōu)先級、任務ID、任務名、任務棧大小等信息。TCB可以反映出每個任務運行情況。任務棧每一個任務都擁有一個的??臻g,我們稱為任務棧。??臻g里保存的信息包含局部變量、寄存器、函數(shù)參數(shù)、函數(shù)返回地址等。任務在任務切換時會將切出任務的上下文信息保存在自身的任務棧空間里面,以便任務恢復時還原現(xiàn)場,從而在任務恢復后在切出點繼續(xù)開始執(zhí)行。任務上下文

19、任務在運行過使用到的一些,如寄存器等,我們稱為任務上下文。當這個任務掛起時,其他任務繼續(xù)執(zhí)行,在任務恢復后,如果沒有把任務上下文保存下來,有可能任務切換會修改寄存器中的值,從而導致未知錯誤。因此,LiteOS在任務掛起的時候會將本任務的任務上下文信息,保存在的任務棧里面,以便任務恢復后,從棧空間中恢復掛起時的上下文信息,從而繼續(xù)執(zhí)行被掛起時被打斷的代碼。任務切換任務切換包含獲取就緒列表中最高優(yōu)先級任務、切出任務上下文保存、切入任務上下文恢復等動作。機制LiteOS任務管理模塊提供任務創(chuàng)建、任務刪除、任務延時、任務掛起和任務恢復、更改任務優(yōu)先級、鎖任務調(diào)度和任務調(diào)度、根據(jù)任務塊任務ID、根據(jù)ID

20、任務塊信息功能。在任務模塊初始化時,系統(tǒng)會先申請任務塊需要的內(nèi)存空間,如果系統(tǒng)可用的內(nèi)存空間小于其所需要的內(nèi)存空間,任務模塊就會初始化失敗。如果任務初始化,則系統(tǒng)對任務塊內(nèi)容進行初始化。文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)10LiteOS開發(fā)指南4 基礎內(nèi)核用戶創(chuàng)建任務時,系統(tǒng)會將任務棧進行初始化,預置上下文。此外,系統(tǒng)還會將“任務函數(shù)”地址放在相應位置。這樣在任務第一次啟動進入運行態(tài)時,將會執(zhí)行“任務函數(shù)”。4.1.2 開發(fā)指導使用場景任務創(chuàng)建后,內(nèi)核可以執(zhí)行鎖任務調(diào)度,任務調(diào)度,掛起,恢復,操作,同時也可以設置任務優(yōu)先級,獲取任務優(yōu)先級。任務結(jié)束的時候,

21、則進行當前任務自刪除操作。功能LiteOS 系統(tǒng)中的任務管理模塊為用戶提供下面幾種功能。文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)11功能分類接口名描述任務的創(chuàng)建和刪除LOS_TaskCreateOnly創(chuàng)建任務,并使該任務進入suspend狀態(tài),并不調(diào)度LOS_TaskCreate創(chuàng)建任務,并使該任務進入ready狀態(tài),并調(diào)度LOS_TaskDelete刪除指定的任務任務狀態(tài)LOS_TaskResume恢復掛起的任務LOS_TaskSuspend掛起指定的任務LOS_TaskDelay任務待LOS_TaskYield顯式放權(quán),調(diào)整指定優(yōu)先級的任務調(diào)度順序任務調(diào)度

22、的LOS_TaskLock鎖任務調(diào)度LOS_TaskUnlock任務調(diào)度任務優(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獲取即將被調(diào)度的任務的IDLiteOS開發(fā)指南4 基礎內(nèi)

23、核開發(fā)流程以創(chuàng)建任務為例,講解開發(fā)流程。1.在los_config.h中配置任務模塊。配置LOSCFG_BASE_CORE_TSK_LIMIT系統(tǒng)支持最大任務數(shù),這個可以根據(jù)需求配置。配置LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE 空閑(IDLE)任務棧大小,這個默認即可。配置LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE默認任務棧大小,用戶根據(jù)的需求進行配置,在用戶創(chuàng)建任務時,可以進行性設置。配置LOSCFG_BASE_CORE_TIMESLICE時間片開關(guān)為YES。配置LOSCFG_BASE_CORE_TIMESLICE_TIM

24、EOUT時間片,根據(jù)實際情況配置。配置LOSCFG_BASE_CORE_TSK_MONITOR任務監(jiān)測模塊裁剪開關(guān),可選擇是否打開。鎖任務LOS_TaskLock,鎖住任務,防止高優(yōu)先級任務調(diào)度。創(chuàng)建任務LOS_TaskCreate。任務LOS_TaskUnlock,讓任務按照優(yōu)先級進行調(diào)度。.6.7.延時任務LOS_TaskDelay,任務待。掛起指定的任務LOS_TaskSuspend,任務掛起等待恢復操作。恢復掛起的任務LOS_TaskResume。TASK 狀態(tài)LiteOS任務的狀態(tài)由內(nèi)核自動維護,對用戶不可見,不需要用戶去操作。用戶在調(diào)用LOS_TaskCreate接口

25、創(chuàng)建任務時,需要將創(chuàng)建任務的TSK_INIT_PARAM_S 參數(shù)的uwResved域設置為LOS_TASK_STATUS_DETACHED,即自刪除狀態(tài),設置成自刪除狀態(tài)的任務會在運行完成時進行自刪除動作。注意在調(diào)用內(nèi)核LOS_TaskCreate接口創(chuàng)建任務時,默認必須要將任務狀態(tài)設置為LOS_TASK_STATUS_DETACHED。TASK 錯誤碼對任務存在失敗可能性的操作,包括創(chuàng)建任務、刪除任務、掛起任務、恢復任務、延時任務等等,均需要返回對應的錯誤碼,以便快速錯誤。文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)12序號定義實際數(shù)值描述參考解決方案1LOS_

26、ERRNO_TSK_ NO_MEMORY0x03000200內(nèi)存空間不足分配更大的內(nèi)存分區(qū)LiteOS開發(fā)指南4 基礎內(nèi)核文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)13序號定義實際數(shù)值描述參考解決方案2LOS_ERRNO_TSK_ PTR_NULL0x02000201任務參數(shù)為空檢查任務參數(shù)3LOS_ERRNO_TSK_ STKSZ_NOT_ALIG N0x02000202任務棧大小未對齊對齊任務棧4LOS_ERRNO_TSK_ PRIOR_ERROR0x02000203不正確的任務優(yōu)先級檢查任務優(yōu)先級5LOS_ERRNO_TSK_ ENTRY_NULL0x020

27、00204任務函數(shù)為空定義任務函數(shù)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任務已經(jīng)被掛起等待這個任務被恢復后,再去嘗試掛起這個任務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沒有或者僅有一個可用任務能進行行程安排增加任務數(shù)LiteOS開發(fā)指南4 基礎內(nèi)核文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)14序號定義實際數(shù)值描述參考解決方案18LOS_ERRNO_TSK_ TCB_UNAVAILABL E0x02000211沒有空閑的任務塊可用增加任務塊數(shù)量19LOS_ERRNO_TSK_ HOOK_NOT_MATC H0x02000212任務的

30、鉤子函數(shù)不匹配暫不使用該錯誤碼20LOS_ERRNO_TSK_ HOOK_IS_FULL0x02000213任務的鉤子函數(shù)數(shù)量超過界限暫不使用該錯誤碼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í)行任務轉(zhuǎn)換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 基礎內(nèi)核錯誤碼定義:錯誤碼是一個32位的單元,3124位表示錯誤等級,2316位表示錯誤碼標志,158位代表錯誤碼所屬模塊,70位表示錯誤碼序號,如下

33、例如:注意錯誤碼序號 0x16、0x1c、0x0b,未被定義,不可用。平臺差異性無。4.1.3 注意事項l創(chuàng)建新任務時,會對之前自刪除任務的任務塊和任務棧進行回收,非自刪除任務的塊和棧在任務刪除的時候已經(jīng)回收。l任務名是指針沒有分配空間,在設置任務名時, 務名指針。若指定的任務棧大小為0,則使用配置項將局部變量的地址賦值給任lLOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE指定默認的任務棧大小。任務棧的大小按8字節(jié)大小對齊。確定任務棧大小的原則是,夠用就行:多了浪費,少了任務棧溢出。掛起任務的時候若為當前任務且已鎖任務,則不能被掛起??臻e(IDLE)任務及軟件定時

34、器任務不能被掛起或者刪除。ll l l l l ll在中斷處理函數(shù)中或者在鎖任務的情,執(zhí)行LOS_TaskDelay操作會失敗。鎖任務調(diào)度,并不關(guān)中斷,因此任務仍可被中斷打斷。鎖任務調(diào)度必須和任務調(diào)度配合使用。設置任務優(yōu)先級的時候可能會發(fā)生任務調(diào)度。除去空閑(IDLE)任務以外,系統(tǒng)可配置的任務個數(shù)是指:整個系統(tǒng)的任務總個數(shù),而非用戶能使用的任務個數(shù)。例如:系統(tǒng)軟件定時器多占用一個任務數(shù),那么系統(tǒng)可配置的任務就會減少一個。l ll為了防止系統(tǒng)出現(xiàn)問題,系統(tǒng)對軟件定時器任務優(yōu)先級進行修改。LOS_CurTaskPriSet和LOS_TaskPriSet接口不能在中斷中使用。LOS_TaskPri

35、Get接口傳入的task ID對應的任務未創(chuàng)建或者超過最大任務數(shù),統(tǒng)一返回0xffff。文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)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 基礎內(nèi)核l在刪除任務時要保證任務申請的(如互斥鎖、信號量等)已被。4.1.4 編程實例實例描述下面的示例介紹任務的基本操作方法,包含任務創(chuàng)建、任務延時、任務鎖與調(diào)度、掛起和恢復、當前任務PID、根據(jù)PID 調(diào)度的機制以及各接口的應用。任務信息等操作,闡述任務優(yōu)先級1.2.3.創(chuàng)建了2個任務:TaskHi和TaskLo。TaskHi為高優(yōu)先級任務。TaskLo為低優(yōu)先級任務。編程示例文檔版本 01 (20

37、18-04-24)專有和所有 ©信息技術(shù)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 基礎內(nèi)核結(jié)果驗證編譯運行得到的結(jié)果為:完整實例代碼los_api_task.c文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)17dprintf("TaskHi delete failed .n"); return LOS_NOK;return LOS_OK;/*低優(yōu)先級任務函數(shù)*/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 基礎內(nèi)核4.2 內(nèi)存4.2.1 概述基本概念內(nèi)存管理模塊管理系統(tǒng)的內(nèi)存,它是操作系統(tǒng)的模塊之一。主要包括內(nèi)存的初始化、分配以及。在系統(tǒng)運行過,內(nèi)存管理模塊通過對內(nèi)存的申請/操作,來管理用戶和OS對內(nèi)存的使用,使內(nèi)存的利用率和使用效率達到最優(yōu),同時最大限度地解決系統(tǒng)的內(nèi)存碎片問題。LiteOS的內(nèi)存管理分為靜態(tài)內(nèi)存管理和動態(tài)內(nèi)存管理,提供內(nèi)存初始化、分配、l等功能。動態(tài)內(nèi)存:在動態(tài)內(nèi)存 優(yōu)點:按需分配。分配用戶指定大小的內(nèi)存塊。 缺點:內(nèi)存可能出現(xiàn)碎片。l靜態(tài)內(nèi)存:在靜態(tài)內(nèi)存 優(yōu)點:分配和分

44、配用戶初始化時預設(固定)大小的內(nèi)存塊。效率高,靜態(tài)內(nèi)存無碎片。 缺點:只能申請到初始化預設大小的內(nèi)存塊,不能按需申請。動態(tài)內(nèi)存機制動態(tài)內(nèi)存管理,即在內(nèi)存充足的情,從系統(tǒng)配置的一塊比較大的連續(xù)內(nèi)存(內(nèi)存池),根據(jù)用戶需求,分配任意大小的內(nèi)存塊。當用戶不需要該內(nèi)存塊時,又可以供下一次使用。與靜態(tài)內(nèi)存相比,動態(tài)內(nèi)存管理的好處是按需分配,缺點是內(nèi)存LiteOS動態(tài)內(nèi)存支持DLINK和BEST LITTLE兩種標準算法。容易出現(xiàn)碎片。1.DLINKDLINK動態(tài)內(nèi)存管理結(jié)構(gòu)如圖1所示:圖 4-2文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)18LiteOS開發(fā)指南4 基礎內(nèi)核

45、第一部分:堆內(nèi)存(也稱內(nèi)存池)的起始地址及堆區(qū)域總大小第二部分:本身是一個數(shù)組,每個元素是一個雙向鏈表,所有free節(jié)點的分類掛在這個數(shù)組的雙向鏈表中。頭都會被假設內(nèi)存的最小節(jié)點為2min字節(jié),則數(shù)組的第一個雙向鏈表的是所有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é)點。每次申請內(nèi)存的時候,會從這個數(shù)組檢索最合適大小的free節(jié)點,進行分配內(nèi)存。每次內(nèi)存時,會將該片

46、內(nèi)存作為free節(jié)點至這個數(shù)組,以便下次再利用。第三部分:占用內(nèi)存大部分的空間,是用于存放各節(jié)點的實際區(qū)域。以下是LOS_MEM_DYN_NODE節(jié)點結(jié)構(gòu)體申明以及簡單介紹: 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)內(nèi)存分配支持最佳適配算法,即BEST LITTLE,每次分配時選擇內(nèi)存池中最小最適合的內(nèi)存塊

47、進行分配。LiteOS動態(tài)內(nèi)存管理在最佳適配算法的基礎上加入了SLAB機制,用于分配固定大小的內(nèi)存塊,進而減小產(chǎn)生內(nèi)存碎片的可能性。LiteOS內(nèi)存管理中的SLAB機制支持可配置的SLAB CLASS數(shù)目及每個CLASS的最大空間,現(xiàn)以SLAB CLASS數(shù)目為4,每個CLASS的最大空間為512字節(jié)為例說明SLAB機制。在內(nèi)存共有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是從內(nèi)存按照最佳適配算法分配出來的。初始化內(nèi)存管理時,首先初始化內(nèi)存池,然后在初始化后的內(nèi)存按照最佳適配算法申請4個SLAB CLASS,再逐個按照SLAB內(nèi)存管理機制初始化4個SLAB CLASS。文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)19LiteOS開發(fā)指南4 基礎內(nèi)核每次申請內(nèi)存時,先在滿足申請大小的最佳SLAB CLASS中申請,(比如用戶申請20字節(jié)內(nèi)存,就在SLAB塊大小為32字節(jié)的SLAB CLASS中申請),如果申請,就將SLAB內(nèi)存塊整塊返回給用戶,時整塊回收。如

49、果滿足條件的SLAB CLASS中已無可以分配的內(nèi)存塊,則繼續(xù)向內(nèi)存池按照最佳適配算法申請。需要注意的是,如果當前的SLAB CLASS中無可用SLAB塊了,則直接向內(nèi)存池申請,而SLAB塊空間的SLAB CLASS申請。繼續(xù)向有著更大內(nèi)存時,先檢查的內(nèi)存塊是否屬于SLAB CLASS,如果是SLAB CLASS的內(nèi)存塊,則還回對應的SLAB CLASS中,否則還回內(nèi)存。靜態(tài)內(nèi)存機制靜態(tài)內(nèi)存實質(zhì)上是一塊靜態(tài)數(shù)組,靜態(tài)內(nèi)存池內(nèi)的塊大小在初始化時設定,初始化后塊大小不可變更。靜態(tài)內(nèi)存一個塊和若干相同大小的內(nèi)存塊。塊位于內(nèi)存池頭部,用于內(nèi)存塊管理。內(nèi)存塊的申請和以塊大小為粒度。圖 4-4 靜態(tài)內(nèi)存示

50、意圖4.2.2 動態(tài)內(nèi)存 開發(fā)指導使用場景內(nèi)存管理的主要工作是動態(tài)的劃分并管理用戶分配好的內(nèi)存區(qū)間。動態(tài)內(nèi)存管理主要是在用戶需要使用大小不等的內(nèi)存塊的場景中使用。當用戶需要分配內(nèi)存時,可以通過操作系統(tǒng)的動態(tài)內(nèi)存申請函數(shù)索取指定大小內(nèi)存塊,一旦使用完畢,通過動態(tài)內(nèi)存函數(shù)歸還所占用內(nèi)存,使之可以重復使用。文檔版本 01 (2018-04-24)專有和所有 ©信息技術(shù)20LiteOS開發(fā)指南4 基礎內(nèi)核功能LiteOS系統(tǒng)中的動態(tài)內(nèi)存管理模塊為用戶提供下面幾種功能,具體的API詳見接口手冊。DLINK 開發(fā)流程1.配置:OS_SYS_MEM_ADDR:系統(tǒng)動態(tài)內(nèi)存池起始地址,

51、一般不需要修改OS_SYS_MEM_SIZE:系統(tǒng)動態(tài)內(nèi)存池大小,以byte為后未使用的空間,系統(tǒng)默認分配DDRLOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK:內(nèi)存越界檢測開關(guān),默認關(guān)閉。打開后,每次申請動態(tài)內(nèi)存時執(zhí)行動態(tài)內(nèi)存塊越界檢查;每次存時執(zhí)行靜態(tài)內(nèi)存塊越界檢查。初始化LOS_MemInit。靜態(tài)內(nèi)2.初始一個內(nèi)存如圖,生成一個 EndNode,并且剩余的內(nèi)存全部被標記為FreeNode節(jié)點。注:EndNode作為內(nèi)存池末尾的節(jié)點,size為0。3.申請任意大小的動態(tài)內(nèi)存LOS_MemAlloc。動態(tài)內(nèi)存是否存在申請量大小的空間,若存在,則劃出一塊內(nèi)存塊,以指針形式返回,若不存在,返回NULL。調(diào)用三次LOS_MemAlloc函數(shù)可以創(chuàng)建三個節(jié)點,假設名稱分別為UsedA,UsedB, UsedC,大小分別

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論