0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

UCOS2系統(tǒng)內(nèi)核講述(二)_ 初始化調(diào)用函數(shù)

黃工的嵌入式技術(shù)圈 ? 來(lái)源:黃工的嵌入式技術(shù)圈 ? 2020-03-25 09:57 ? 次閱讀

Ⅰ、寫(xiě)在前面

學(xué)習(xí)本文之前可以參看我前面的文章:

UCOS2_STM32F1移植詳細(xì)過(guò)程(匯總文章)

UCOS2系統(tǒng)內(nèi)核講述(一)_總體描述

還是按照上一篇文章的思維(從外到內(nèi)),本文(結(jié)合源代碼)進(jìn)一步深入U(xiǎn)COS系統(tǒng)內(nèi)核,我會(huì)將講述過(guò)的源代碼注釋修改為中文,提供給大家參考。

上一篇文章總體描述了一下整個(gè)工程“外圍”的代碼,本文將進(jìn)一步“入圍”,進(jìn)一步講述OSInit所調(diào)用的函數(shù)。

本文還是結(jié)合前面移植好、可以運(yùn)行的源代碼來(lái)進(jìn)行講述關(guān)于最新版本UCOS2系統(tǒng)內(nèi)核部分代碼(圍繞源代碼來(lái)講述)。

本文講述的內(nèi)容不必深入理解,可以先做個(gè)了解。

關(guān)于本文的更多詳情請(qǐng)往下看。

Ⅱ、OSInit所調(diào)用的函數(shù)

上一篇文章大概講述了關(guān)于該函數(shù)的內(nèi)容,本文將進(jìn)一步講述OSInit系統(tǒng)初始化。

我將OSInit所調(diào)用的函數(shù)分為兩類(lèi):必須類(lèi)和非必須類(lèi)。


必須類(lèi):與系統(tǒng)、任務(wù)緊密相關(guān)的初始化。其實(shí)這些初始化就是對(duì)變量、結(jié)構(gòu)體等賦予初始值。(如:系統(tǒng)運(yùn)行標(biāo)志位初始化暫停運(yùn)行、最高優(yōu)先級(jí)指向空等)它們的初始化位于系統(tǒng)內(nèi)核os_core.c里面。

非必須類(lèi):這一類(lèi)就是可以不調(diào)用來(lái)初始化的一類(lèi)。從代碼可以看他們前面有一個(gè)預(yù)處理標(biāo)志位【如:#if (OS_FLAG_EN > 0u) && (OS_MAX_FLAGS > 0u)】,這些標(biāo)志位位于os_cfg.h(前面說(shuō)過(guò)系統(tǒng)的裁剪),當(dāng)我們不使用這些功能時(shí),也就是系統(tǒng)裁剪掉了這些功能,它們就不會(huì)被初始化。

事件標(biāo)志組、內(nèi)存管理、消息隊(duì)列等這些就屬于非必須類(lèi),它們的初始化位于自身的.c文件里面(不位于os_core.c)。【如:OS_FlagInit位于os_flag.c文件里面】

下面講述一下必須類(lèi)(非必須類(lèi)在后面結(jié)合相關(guān)資源講述):

1.OS_InitMisc(必須類(lèi))

這個(gè)函數(shù)會(huì)被OSInit()調(diào)用來(lái)初始化各項(xiàng)變量。對(duì)紅色框內(nèi)參數(shù)初始化數(shù)值,這些參數(shù)是系統(tǒng)必須的變量,類(lèi)似于我們定義一個(gè)全局變量,初始的時(shí)候?qū)λM(jìn)行賦值。


2.OS_InitRdyList(必須類(lèi))

這個(gè)函數(shù)被OSInit()調(diào)用來(lái)初始化就緒表。這里說(shuō)的就緒表其實(shí)指的是把一個(gè)一個(gè)任務(wù)排列成一個(gè)表,要將這個(gè)表初始化的意思。要執(zhí)行響應(yīng)任務(wù)就需要知道任務(wù)的優(yōu)先級(jí)、任務(wù)控制塊、目前指向的任務(wù)等一系列信息。


3.OS_InitTCBList(必須類(lèi))

這個(gè)函數(shù)會(huì)被OSInit()調(diào)用來(lái)初始化空閑TCB(任務(wù)控制塊)。這個(gè)初始化函數(shù)包含的信息是比較難的,也是系統(tǒng)比較重要的(后面會(huì)對(duì)TCB進(jìn)行講述)。

所謂任務(wù)控制塊,就是控制任務(wù)相關(guān)變量數(shù)據(jù)信息各類(lèi)的結(jié)構(gòu)體的歸類(lèi),其結(jié)構(gòu)體里面包含的信息是很多的。

理解TCB就需要對(duì)數(shù)據(jù)結(jié)構(gòu)有一定的熟悉才行。


4.OS_InitEventList(必須類(lèi))

這個(gè)函數(shù)會(huì)被OSInit()調(diào)用來(lái)初始化空閑ECB(事件控制塊)。這個(gè)函數(shù)雖然我把它歸類(lèi)到系統(tǒng)必須類(lèi)這一塊,其實(shí)不完全正確。這里所說(shuō)的事件,其實(shí)就是系統(tǒng)相關(guān)資源(消息隊(duì)列、郵箱、信號(hào)量、互斥信號(hào)量等)的一個(gè)或集。在ucos_ii.h中可以看到下面宏定義:

#define OS_EVENT_EN (((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)) || (OS_MBOX_EN > 0u) || (OS_SEM_EN > 0u) || (OS_MUTEX_EN > 0u))

消息隊(duì)列、郵箱、信號(hào)量、互斥信號(hào)量等這些資源要被系統(tǒng)所調(diào)用,就需要進(jìn)行初始化。系統(tǒng)把他們定義為事件,而使用是需要調(diào)用相關(guān)數(shù)據(jù),系統(tǒng)就把他們定義為ECB(事件控制塊),有點(diǎn)類(lèi)似于TCB(任務(wù)控制塊)。


5.OS_InitTaskIdle(必須類(lèi))

這個(gè)函數(shù)會(huì)被OSInit()調(diào)用來(lái)創(chuàng)建空閑任務(wù)。這個(gè)函數(shù)在本節(jié)開(kāi)頭截圖中沒(méi)有截取出來(lái)(屏幕高度有限),其實(shí)這個(gè)函數(shù)也是屬于系統(tǒng)必須初始化的函數(shù)。空閑函數(shù)其實(shí)就是系統(tǒng)把所創(chuàng)建的任務(wù)都處理完了,那些都掛起了,或刪除了,系統(tǒng)空閑沒(méi)事做了,它就會(huì)來(lái)執(zhí)行這個(gè)空閑任務(wù)。

空閑任務(wù)在統(tǒng)計(jì)中起到一定作用,所謂統(tǒng)計(jì),就是我們都知道的CPU占用率,空閑統(tǒng)計(jì)的越多,CPU空閑越多,那么CPU占用率就越低?!緩腃PU使用率應(yīng)該很容易理解為什么要?jiǎng)?chuàng)建空閑任務(wù)】


Ⅲ、實(shí)例工程下載

筆者針對(duì)于初學(xué)者提供的例程都是去掉了許多不必要的功能,精簡(jiǎn)了官方的代碼,對(duì)初學(xué)者一看就明白,以簡(jiǎn)單明了的工程供大家學(xué)習(xí)。

筆者提供的實(shí)例工程都是在板子上經(jīng)過(guò)多次測(cè)試并沒(méi)有問(wèn)題才上傳至360云盤(pán),歡迎下載測(cè)試、參照學(xué)習(xí)。

我將最新UCOS2.92操作系統(tǒng)移植到F0、F1、F3、F4各個(gè)硬件平臺(tái)上,可以根據(jù)你芯片系列選擇下載。

UCOS基于STM32F0系列實(shí)例:

https://yunpan.cn/cByHFxCfpaIbh訪問(wèn)密碼 4437

UCOS基于STM32F1系列實(shí)例:

https://yunpan.cn/cByHum5BStkEK訪問(wèn)密碼 00a6

UCOS基于STM32F3系列實(shí)例:

https://yunpan.cn/cByHrMmkekIar訪問(wèn)密碼 da90

UCOS基于STM32F4系列實(shí)例:

https://yunpan.cn/cByHx47jehTgX訪問(wèn)密碼 5a04

本文所講述部分注釋修改為中文:

https://yunpan.cn/cMGZKfnVVb2Li訪問(wèn)密碼 49c2

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于旋轉(zhuǎn)平移解耦框架的視覺(jué)慣性初始化方法

    精確和魯棒的初始化對(duì)于視覺(jué)慣性里程計(jì)(VIO)至關(guān)重要,因?yàn)椴涣嫉?b class='flag-5'>初始化會(huì)嚴(yán)重降低姿態(tài)精度。
    的頭像 發(fā)表于 11-01 10:16 ?126次閱讀
    基于旋轉(zhuǎn)平移解耦框架的視覺(jué)慣性<b class='flag-5'>初始化</b>方法

    TMS320C6000 McBSP初始化

    電子發(fā)燒友網(wǎng)站提供《TMS320C6000 McBSP初始化.pdf》資料免費(fèi)下載
    發(fā)表于 10-26 10:10 ?0次下載
    TMS320C6000 McBSP<b class='flag-5'>初始化</b>

    使用RTOS_SDK,在哪里初始化我的串口UART0?

    重復(fù)編譯初始化函數(shù)造成存儲(chǔ)空間的浪費(fèi)?如果不這樣,我應(yīng)該怎么直接調(diào)用libdriver.a中的初始化函數(shù)?
    發(fā)表于 07-11 06:59

    stm32f4跑ucos+emwin5.16 gui_init()初始化失敗的原因?

    我用stm32f4discovery 連了一塊ra8875的4.3寸屏幕, ucosii已經(jīng)移植成功了,但是移植emwin5。16的時(shí)候在gui初始化的時(shí)候就會(huì)進(jìn)入 HardFault_Handler(); 不知道是什么情況; 單獨(dú)跑emwin 也能跑,為什么和ucos
    發(fā)表于 05-17 12:33

    stm32定時(shí)器在初始化參數(shù)之前是否必須開(kāi)啟對(duì)應(yīng)時(shí)鐘?

    調(diào)用RT-thread的PWM組件,發(fā)現(xiàn)HAL_TIM_PWM_MspInit用的默認(rèn)的,沒(méi)有任何操作的函數(shù)。這就導(dǎo)致在調(diào)用HAL_TIM_PWM_Init和HAL_TIM_Base_Init
    發(fā)表于 04-18 06:42

    字符型、指針型等變量等該如何初始化

     對(duì)于數(shù)值類(lèi)型的變量往往初始化為0,但對(duì)于其他類(lèi)型的變量,如字符型、指針型等變量等該如何初始化呢?
    的頭像 發(fā)表于 03-18 11:02 ?1208次閱讀

    【鴻蒙】小型系統(tǒng)LiteOS-A內(nèi)核

    對(duì)該芯片架構(gòu)的支持,這個(gè)工作較為復(fù)雜,不在這篇文章范圍內(nèi)。 基礎(chǔ)適配 LiteOS-A 提供系統(tǒng)運(yùn)行所需的系統(tǒng)初始化流程和定制配置選項(xiàng)。移植過(guò)程中,需要關(guān)注
    的頭像 發(fā)表于 02-29 16:16 ?1067次閱讀
    【鴻蒙】小型<b class='flag-5'>系統(tǒng)</b>LiteOS-A<b class='flag-5'>內(nèi)核</b>

    MCU單片機(jī)GPIO初始化該按什么順序配置?為什么初始化時(shí)有電平跳變?

    GPIO初始化時(shí)有時(shí)鐘配置、模式配置、輸出配置、復(fù)用配置,那么在編寫(xiě)初始化代碼時(shí),到底該按什么順序執(zhí)行呢?如果順序不當(dāng)那初始化過(guò)程可能會(huì)出現(xiàn)短暫的電平跳變。
    的頭像 發(fā)表于 02-22 11:07 ?1389次閱讀
    MCU單片機(jī)GPIO<b class='flag-5'>初始化</b>該按什么順序配置?為什么<b class='flag-5'>初始化</b>時(shí)有電平跳變?

    串口初始化一般是初始化哪些內(nèi)容

    串口初始化是指在使用串口進(jìn)行數(shù)據(jù)通信之前,對(duì)串口進(jìn)行一系列的設(shè)置和配置,以確保串口能夠正常工作。串口初始化的內(nèi)容主要包括以下幾個(gè)方面: 串口硬件設(shè)置:首先,需要確定要使用的串口是哪一個(gè),通常計(jì)算機(jī)
    的頭像 發(fā)表于 01-04 09:39 ?2987次閱讀

    labview運(yùn)行后如何初始化

    LabVIEW是一款強(qiáng)大的圖形編程軟件,在運(yùn)行之前通常需要進(jìn)行一些初始化操作。本文將詳細(xì)介紹LabVIEW運(yùn)行前的初始化過(guò)程,并提供了一些常用的初始化方法。 創(chuàng)建新項(xiàng)目: 在LabV
    的頭像 發(fā)表于 12-28 17:24 ?2406次閱讀

    自動(dòng)初始化機(jī)制原理詳解

    自動(dòng)初始化機(jī)制是指初始化函數(shù)不需要被顯式調(diào)用,只需要在函數(shù)定義處通過(guò)宏定義的方式進(jìn)行申明,就會(huì)在系統(tǒng)
    的頭像 發(fā)表于 12-16 09:33 ?948次閱讀
    自動(dòng)<b class='flag-5'>初始化</b>機(jī)制原理詳解

    C語(yǔ)言編程時(shí),各種類(lèi)型的變量該如何初始化

    C語(yǔ)言編程時(shí),各種類(lèi)型的變量該如何初始化? 在C語(yǔ)言中,每個(gè)變量都需要在使用之前進(jìn)行初始化。初始化是為變量分配內(nèi)存空間并賦予初始值的過(guò)程。C語(yǔ)言提供了不同的
    的頭像 發(fā)表于 12-07 13:53 ?1095次閱讀

    secondary cpu初始化狀態(tài)設(shè)置

    ,用于填寫(xiě)secondary cpu的入口地址。 uboot負(fù)責(zé)將這塊內(nèi)存的地址寫(xiě)入devicetree中,當(dāng)內(nèi)核初始化完成,需要啟動(dòng)secondary cpu時(shí),就將其內(nèi)核入口地址寫(xiě)到那塊內(nèi)存中
    的頭像 發(fā)表于 12-05 15:27 ?965次閱讀
    secondary cpu<b class='flag-5'>初始化</b>狀態(tài)設(shè)置

    實(shí)戰(zhàn)經(jīng)驗(yàn) | Keil、IAR、CubeIDE 中變量不被初始化方法

    關(guān)鍵詞:不被初始化,編譯環(huán)境 目錄預(yù)覽 1、前言 2、IAR 實(shí)現(xiàn)變量不初始化方法 3、Keil 實(shí)現(xiàn)變量不被初始化方法 4、CubeIDE 實(shí)現(xiàn)變量不
    的頭像 發(fā)表于 11-24 18:05 ?3751次閱讀

    如何查看及更改函數(shù)/函數(shù)塊的調(diào)用環(huán)境

    模塊設(shè)計(jì)的思想是把一些相似的功能(比如電機(jī)控制、閥控制)設(shè)計(jì)成函數(shù)函數(shù)塊,這樣就可以反復(fù)調(diào)用。其優(yōu)點(diǎn)是:使程序架構(gòu)更加清晰,避免重復(fù)編寫(xiě)相似功能的代碼。不過(guò)可能會(huì)產(chǎn)生一個(gè)疑惑:既然
    的頭像 發(fā)表于 11-17 09:08 ?839次閱讀
    如何查看及更改<b class='flag-5'>函數(shù)</b>/<b class='flag-5'>函數(shù)</b>塊的<b class='flag-5'>調(diào)用</b>環(huán)境