亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于STM32的mbedOS信號量調(diào)度機(jī)制剖析

        2023-11-02 12:36:44劉中華王宜懷劉長勇王浩波
        計算機(jī)應(yīng)用與軟件 2023年10期
        關(guān)鍵詞:信號量調(diào)用隊(duì)列

        劉中華 王宜懷 劉長勇 王浩波

        1(蘇州大學(xué)計算機(jī)科學(xué)與技術(shù)學(xué)院 江蘇 蘇州 215006)

        2(武夷學(xué)院數(shù)學(xué)與計算機(jī)學(xué)院 福建 武夷山 354300)

        0 引 言

        隨著嵌入式實(shí)時操作系統(tǒng)(RTOS)[1-2]不斷發(fā)展,對于共享數(shù)據(jù)訪問的不一致現(xiàn)象屢見不鮮,而多任務(wù)[3]的并發(fā)調(diào)度是造成這一現(xiàn)象的主要原因。面對操作系統(tǒng)的同步問題,1968年荷蘭計算機(jī)科學(xué)家艾茲格·迪杰斯特拉提出了信號量(Semaphore)的概念[4-5],用來實(shí)現(xiàn)對操作系統(tǒng)的資源管理[6]和多任務(wù)調(diào)度。信號量機(jī)制在常用的RTOS中一直有被應(yīng)用,無論是早期出現(xiàn)的MQX,還是之后陸續(xù)出現(xiàn)的諸如μC/OS、FreeRTOS及2014年Arm公司出品的mbedOS等RTOS中,信號量機(jī)制始終被保留并不斷完善[7]。因此,充分理解信號量的調(diào)度機(jī)制,有助于開發(fā)人員設(shè)計出實(shí)時性強(qiáng)、穩(wěn)定性好的RTOS。目前,有關(guān)操作系統(tǒng)的信號量機(jī)制剖析主要集中在Linux、FreeRTOS、VxWorks等操作系統(tǒng),并且不同的RTOS中信號量的名稱和實(shí)現(xiàn)細(xì)節(jié)不太一樣,例如FreeRTOS有二進(jìn)制信號量、計數(shù)信號量、互斥量和遞歸互斥量,mbedOS只有互斥信號量和計數(shù)信號量;FreeRTOS中信號量的創(chuàng)建通過隊(duì)列實(shí)現(xiàn),mbedOS通過構(gòu)造結(jié)構(gòu)體來創(chuàng)建信號量[8]。但對mbedOS中的信號量調(diào)度剖析方面缺乏資料。為此,本文對mbedOS中的信號量調(diào)度機(jī)制進(jìn)行理論分析,重點(diǎn)剖析關(guān)鍵函數(shù)的實(shí)現(xiàn)原理并加以流程圖分析,利用STM32L431RC芯片結(jié)合SD-mbedOS工程框架[9]作為軟硬件環(huán)境,通過多個任務(wù)使用信號量機(jī)制的并行調(diào)度實(shí)驗(yàn),將實(shí)驗(yàn)的整個調(diào)度流程以及當(dāng)前所運(yùn)行的時間通過printf函數(shù)[10]進(jìn)行輸出顯示,最后對調(diào)度機(jī)制的理論執(zhí)行時間和實(shí)際執(zhí)行時間進(jìn)行對比,從而分析mbedOS信號量調(diào)度機(jī)制的實(shí)時性。通過對信號量調(diào)度機(jī)制進(jìn)行全面剖析并分析其實(shí)時性,有助于理解調(diào)度機(jī)制的執(zhí)行流程,更加了解多任務(wù)的并發(fā)調(diào)度機(jī)制,同時也為分析其他RTOS的信號量調(diào)度機(jī)制提供了基礎(chǔ)[11]。

        1 信號量的含義及其應(yīng)用場合

        在RTOS中,信號量通常被定義成一個提供信號的非負(fù)整型變量,來保證在多任務(wù)并發(fā)的環(huán)境下,能使得操作系統(tǒng)不會發(fā)生沖突,穩(wěn)定運(yùn)行。在操作系統(tǒng)的信號量機(jī)制的管理下,對共享資源的訪問同步問題都可以用信號量來實(shí)現(xiàn)。比如一個讀取數(shù)據(jù)任務(wù)和一個寫入數(shù)據(jù)任務(wù)要訪問共享資源緩沖區(qū)的問題,就能通過三個信號量來實(shí)現(xiàn):SEM_Read,允許任務(wù)對緩沖區(qū)進(jìn)行讀取操作;SEM_Write,允許任務(wù)對緩存區(qū)進(jìn)行寫入操作;SEM_Mutex,限制緩沖區(qū)的互斥訪問。在同一時刻只能允許一個讀/寫任務(wù)訪問緩沖區(qū),對緩沖區(qū)進(jìn)行訪問之前必須先獲取信號量SEM_Mutex,并且任務(wù)執(zhí)行完成后需釋放信號量[12]。在任何一個任務(wù)中,獲取信號量和釋放信號量是同時存在的,意味著在任務(wù)結(jié)束的時候,并不會占用信號量。在RTOS中,信號量的調(diào)度機(jī)制如圖1所示。

        圖1 信號量調(diào)度的一般流程

        正是信號量這種有序的特性,使得信號量能應(yīng)用到很多場合:多任務(wù)之間的同步進(jìn)行;對共享資源的訪問;為了實(shí)現(xiàn)更好的性能而控制任務(wù)的并發(fā)數(shù)等。

        2 RTOS信號量調(diào)度機(jī)制及其關(guān)鍵要素

        在RTOS中的同步與通信機(jī)制中,與設(shè)置事件字來表達(dá)多種可能的情況相比,信號量是一種簡單的同步手段。

        2.1 RTOS信號量的調(diào)度機(jī)制

        采用信號量作為任務(wù)與任務(wù)間或中斷與任務(wù)間的同步與通信的方法時,則必定有任務(wù)(或中斷)創(chuàng)建信號量,同時有任務(wù)等待獲取信號量[13]。信號量的獲取與釋放必須在同一任務(wù)中,例如在mbedOS中,任務(wù)調(diào)用Wait()函數(shù)獲取信號量,實(shí)際是通過判斷信號量控制塊結(jié)構(gòu)體的Tokens變量來決定是否允許獲取信號量;在FreeRTOS中則是調(diào)用xSemaphoreTake()函數(shù)來獲取信號量,判斷隊(duì)列句柄xHandle中的uxMessageWaiting變量來決定是否允許獲取信號量。在任務(wù)執(zhí)行操作完成后,會將信號量釋放,例如在mbedOS中通過調(diào)用Release()函數(shù)來釋放信號量;在FreeRTOS中調(diào)用xSemaphoreGive()函數(shù)來釋放信號量[14]。若當(dāng)前等待隊(duì)列存在任務(wù)因等待獲取信號量而阻塞,則會將等待隊(duì)列中的優(yōu)先級最高的任務(wù)移入就緒隊(duì)列等待調(diào)度。

        2.2 信號量調(diào)度機(jī)制的關(guān)鍵要素

        信號量作為RTOS中任務(wù)同步與通信的重要方法之一,其主要功能是實(shí)現(xiàn)任務(wù)之間的同步或多任務(wù)并發(fā)執(zhí)行。在信號量調(diào)度機(jī)制過程中所涉及到的關(guān)鍵要素有信號量的創(chuàng)建、獲取、釋放、響應(yīng)、調(diào)度等[15]。

        (1) 信號量的創(chuàng)建:指明信號量的名稱,初始化信號量控制塊結(jié)構(gòu)體并設(shè)置信號量數(shù)值的大小。

        (2) 信號量的獲?。褐该髂膫€任務(wù)或中斷中請求獲取信號量,等待獲取信號量的時間為多少。

        (3) 信號量的釋放:在任務(wù)獲取到信號量并執(zhí)行完相關(guān)操作之后,釋放信號量,若信號量的等待隊(duì)列不為空,則取出任務(wù)準(zhǔn)備進(jìn)行調(diào)度。

        (4) 信號量的響應(yīng):當(dāng)信號量被獲取后,獲取信號量的任務(wù)會繼續(xù)往下執(zhí)行,當(dāng)操作完成后,會釋放信號量。

        (5) 信號量的調(diào)度:當(dāng)有任務(wù)釋放信號量時,會將等待隊(duì)列中優(yōu)先級最高的任務(wù)與正在運(yùn)行的任務(wù)的優(yōu)先級進(jìn)行比較,判斷是否需要重新進(jìn)行任務(wù)調(diào)度。

        3 mbedOS信號量調(diào)度機(jī)制理論剖析

        mbedOS信號量機(jī)制首先從創(chuàng)建信號量開始,從程序開始運(yùn)行到主任務(wù)執(zhí)行app_init()函數(shù)后,會調(diào)用Semaphore()函數(shù)來創(chuàng)建信號量。任務(wù)可以分別調(diào)用Wait()函數(shù)和Release()函數(shù)來進(jìn)行信號量的獲取和釋放[16]。

        下面將著重分析信號量創(chuàng)建、信號量獲取和信號量釋放的過程以及函數(shù)調(diào)用。

        3.1 信號量創(chuàng)建過程剖析

        在mbedOS中使用信號量控制塊結(jié)構(gòu)體來描述信號量,數(shù)據(jù)結(jié)構(gòu)如下:

        typedef struct{

        uint8_t

        id;//信號量ID

        uint8_t reserved_state;

        //互斥量狀態(tài)

        uint8_t

        flags;//信號量標(biāo)志

        uint8_t reserved;

        const char

        *name;//信號量名稱

        osRtxThread_t *thread_list;

        //信號量等待隊(duì)列

        uint16_t

        tokens;//當(dāng)前信號量的數(shù)值

        uint16_t max_tokens;

        //信號量的最大數(shù)值

        }osRtxSemaphore_t;

        信號量創(chuàng)建函數(shù)調(diào)用順序?yàn)镾emaphore()→Constructor()→osSemaphoreNew()→_svcSemaphoreNew()→SVC_Handler()→svcRtxSemaphoreNew()。信號量創(chuàng)建的流程如圖2所示。

        圖2 信號量創(chuàng)建的流程

        信號量的創(chuàng)建調(diào)用Semaphore()函數(shù),傳入?yún)?shù)count表示創(chuàng)建信號量的數(shù)值大小。緊接著調(diào)用Constructor()函數(shù),在該函數(shù)中初始化信號量屬性結(jié)構(gòu)體osSemaphoreAttr_t和信號量控制塊結(jié)構(gòu)體osRtxSemaphore_t。當(dāng)初始化結(jié)構(gòu)體后,調(diào)用osSemaphoreNew()函數(shù)來創(chuàng)建信號量。在任務(wù)模式下會調(diào)用_svcSemaphoreNew()函數(shù),從而觸發(fā)SVC中斷,轉(zhuǎn)而去執(zhí)行SVC_Handler中斷處理函數(shù)。然后實(shí)際執(zhí)行的函數(shù)是svcRtxSemaphoreNew(),由該函數(shù)來執(zhí)行信號量的創(chuàng)建。當(dāng)信號量創(chuàng)建之后,會對信號量等待隊(duì)列thread_list是否為空進(jìn)行判斷,若不為空,則說明存在任務(wù)等待獲取信號量,則從信號量等待隊(duì)列中取出優(yōu)先級最高的任務(wù)放入就緒隊(duì)列,等待調(diào)度[17]。

        3.2 信號量獲取過程剖析

        信號量獲取函數(shù)調(diào)用順序?yàn)閃ait()→OsSemaphoreAcquire()→_svcSemaphoreAcquire()→SVC_Handler()→svcRtxSemaphoreAcquire()。信號量獲取的流程如圖3所示。

        圖3 信號量獲取的流程

        信號量獲取通過調(diào)用Wait()函數(shù),傳入?yún)?shù)millisec設(shè)置等待信號量的時間,在該函數(shù)中調(diào)用_wait()函數(shù),然后再調(diào)用osSemaphoreAcquire()函數(shù)。由于處于任務(wù)模式下,則會調(diào)用_svcSemaphoreAcquire()函數(shù),在該函數(shù)中會觸發(fā)SVC中斷,轉(zhuǎn)而去執(zhí)行SVC_Handler中斷處理函數(shù)。而實(shí)際執(zhí)行的是svcRtxSemaphoreAcquire()函數(shù),在函數(shù)內(nèi)部來判斷Tokens的數(shù)值是否大于0,若大于0,則表示任務(wù)可以獲取信號量,此時首先要屏蔽系統(tǒng)中斷,然后對信號量的數(shù)值進(jìn)行減一操作,否則可能會多任務(wù)訪問信號量數(shù)據(jù)出現(xiàn)不一致;若不大于0,則會根據(jù)參數(shù)millisec進(jìn)行阻塞當(dāng)前任務(wù)或者返回獲取信號量失敗。

        3.3 信號量釋放過程剖析

        信號量釋放函數(shù)調(diào)用順序?yàn)镽elease()→OsSemaphoreRelease()→_svcSemaphoreRelease()→SVC_Handler()→svcRtxSemaphoreRelease()。信號量釋放的流程如圖4所示。

        圖4 信號量釋放的流程

        信號量的釋放和信號量獲取的過程大致相同。首先調(diào)用Release()函數(shù),請求釋放信號量,然后會跳轉(zhuǎn)到osSemaphoreRelease()函數(shù)。當(dāng)前處于任務(wù)模式下,則會調(diào)用_svcSemaphoreRelease()函數(shù),從而觸發(fā)SVC中斷。而實(shí)際調(diào)用的是svcRtxSemaphoreRelease()函數(shù),在該函數(shù)的執(zhí)行過程中,對信號量阻塞隊(duì)列進(jìn)行判斷,若為空,則直接調(diào)用SemaphoreTokenIncrement()函數(shù)進(jìn)行釋放信號量;若不為空,則調(diào)用osRtxThreadListGet()函數(shù)喚醒隊(duì)列中優(yōu)先級最高的任務(wù),重新進(jìn)行任務(wù)調(diào)度。

        4 mbedOS信號量調(diào)度機(jī)制實(shí)踐分析

        以ARM Cortex-M4為內(nèi)核的STM32L431RC開發(fā)芯片結(jié)合意法半導(dǎo)體(ST)公司研發(fā)了STM32CubeIDE為開發(fā)環(huán)境對mbedOS中的信號量調(diào)度機(jī)制進(jìn)行實(shí)踐。STM32L431RC芯片為64引腳LQFP封裝,Flash內(nèi)存為256 KB(共有128個扇區(qū)),RAM內(nèi)存為64 KB。在信號量調(diào)度機(jī)制的實(shí)踐中,使用了printf打樁輸出調(diào)試方法,對關(guān)鍵步驟進(jìn)行文字輸出,可以更好地了解整個程序的運(yùn)行。

        4.1 功能設(shè)計

        在SD-mbedOS工程框架下創(chuàng)建工程實(shí)例,實(shí)例的功能是:創(chuàng)建了三個優(yōu)先級相同的任務(wù)Td1、Td2和Td3,數(shù)值為2的信號量SP,按照Td1、Td2和Td3的順序啟動三個任務(wù)。在Td1任務(wù)中,先請求獲取信號量,獲取成功后Td1任務(wù)延時5 s;在Td2任務(wù)中,獲取信號量成功后,延時2 s。在Td3任務(wù)中,獲取信號量后,延時5 s,然后切換STM32L431RC芯片上的綠燈的亮暗。在信號量獲取和釋放的前后,輸出當(dāng)前系統(tǒng)的運(yùn)行時間,以便算出實(shí)際執(zhí)行時間。三個任務(wù)(Td1、Td2和Td3)的內(nèi)存地址分別為0x200016BC、0x2000177C和0x2000183C。實(shí)例的功能流程如圖5所示。

        圖5 實(shí)例工程的功能流程

        4.2 調(diào)度過程剖析

        結(jié)合實(shí)例對mbedOS中信號量機(jī)制的調(diào)度過程進(jìn)行更細(xì)致的分析,將當(dāng)前運(yùn)行的任務(wù)、任務(wù)的狀態(tài)、系統(tǒng)所執(zhí)行的時間用printf函數(shù)的方式進(jìn)行輸出。

        (1) 任務(wù)啟動。芯片上電啟動最后轉(zhuǎn)到主任務(wù)函數(shù)中執(zhí)行,先后啟動三個任務(wù),然后阻塞該函數(shù)的運(yùn)行,由mbedOS負(fù)責(zé)對任務(wù)的調(diào)度運(yùn)行。printf輸出結(jié)果如下(下同):

        Td1、Td2和Td3任務(wù)啟動完成,同時阻塞主任務(wù)。

        (2) Td1任務(wù)請求獲取信號量。在主任務(wù)阻塞后,mbedOS從就緒隊(duì)列中取出優(yōu)先級最高的任務(wù)(此時為Td1)開始執(zhí)行。任務(wù)啟動后請求獲取信號量,初始信號量數(shù)值為2,Td1任務(wù)獲取信號量成功,信號量數(shù)值減2變?yōu)?。

        Td1任務(wù)(200016BC)請求獲取SP,當(dāng)前時間:3.441 44 s。

        SP=2!=0,表示當(dāng)前任務(wù)(200016BC)可獲取SP。

        Td1任務(wù)獲取SP成功,當(dāng)前時間:3.445 627 s,延時5 s。

        (3) Td2任務(wù)請求獲取信號量。當(dāng)前信號量SP的數(shù)值為1,Td2任務(wù)可以獲取信號量SP。

        Td2任務(wù)(2000177C)請求獲取SP,當(dāng)前時間:3.447 029 s。

        SP=1!=0,表示當(dāng)前任務(wù)(2000177C)可獲取SP。

        Td2任務(wù)獲取SP成功,當(dāng)前時間:3.461 119 s,延時2 s。

        (4) Td3任務(wù)請求獲取信號量。由于當(dāng)前SP的數(shù)值為0,Td3任務(wù)請求獲取信號量失敗,會將Td3任務(wù)添加到信號量阻塞隊(duì)列和延時等待隊(duì)列中。

        Td3任務(wù)(2000183C)請求獲取SP,當(dāng)前時間:3.452 028 s。

        SP=0,表示當(dāng)前任務(wù)(2000183C)獲取SP失敗。

        將當(dāng)前任務(wù)(2000183C)放入等待隊(duì)列和SP阻塞隊(duì)列,獲取就緒隊(duì)列中的任務(wù),當(dāng)前時間:3.466 121 s。

        (5) Td2任務(wù)釋放信號量。當(dāng)信號量SP被Td1和Td2獲取之后,在Td2任務(wù)延時2 s后會釋放信號量,由于在信號量阻塞隊(duì)列中有一個Td3任務(wù)等待獲取信號量,因此,在Td2任務(wù)釋放信號量之后,會將Td3任務(wù)從延時等待隊(duì)列和信號量阻塞隊(duì)列中取出,并放入就緒隊(duì)列中準(zhǔn)備運(yùn)行。此時Td3任務(wù)已經(jīng)獲取到信號量,可以看成是Td2任務(wù)將信號量轉(zhuǎn)移給Td3任務(wù),當(dāng)前信號量數(shù)值還是為0。

        Td2任務(wù)釋放SP,當(dāng)前時間:8.053 098 s。

        從等待隊(duì)列和SP阻塞隊(duì)列中獲取等待SP的任務(wù)(2000183C),當(dāng)前時間:8.055 977 s。

        Td2任務(wù)釋放SP成功,當(dāng)前時間:8.056 314 s。

        Td3任務(wù)獲取SP成功,當(dāng)前時間:8.062 021 s,延時5 s并切換綠燈亮暗。

        (6) Td2任務(wù)開始新一輪的請求獲取信號量。Td2任務(wù)釋放信號量后,重新開始獲取信號量SP,此時信號量被Td1任務(wù)和Td3任務(wù)占據(jù),信號量數(shù)值為0。因此,Td2任務(wù)放入信號量阻塞隊(duì)列和延時等待隊(duì)列中,同時從就緒隊(duì)列中取出Td1任務(wù)準(zhǔn)備運(yùn)行。

        Td2任務(wù)(2000177C)請求獲取SP,當(dāng)前時間:11.505 674 s。

        SP=0,表示當(dāng)前任務(wù)(2000177C)獲取SP失敗。

        將當(dāng)前任務(wù)(2000177C)放入等待隊(duì)列和SP阻塞隊(duì)列,獲取就緒隊(duì)列中的任務(wù),當(dāng)前時間:11.519 806 s。

        (7) Td1任務(wù)釋放信號量。Td1任務(wù)延時5 s結(jié)束,釋放信號量。此時信號量阻塞隊(duì)列中有Td2任務(wù)在等待獲取信號量,當(dāng)Td1任務(wù)釋放信號量之后,將Td2任務(wù)從延時等待隊(duì)列和信號量阻塞隊(duì)列中取出,并放入就緒隊(duì)列中準(zhǔn)備運(yùn)行。

        Td1任務(wù)釋放SP,當(dāng)前時間:16.074 655 s。

        從等待隊(duì)列和SP阻塞隊(duì)列中獲取等待SP的任務(wù)(2000177C),當(dāng)前時間:16.082 538 s。

        Td1任務(wù)釋放SP成功,當(dāng)前時間:16.083 962 s。

        Td2任務(wù)獲取SP成功,當(dāng)前時間:16.090 021 s,延時2 s。

        (8) Td1任務(wù)開始新一輪的請求獲取信號量SP。Td1任務(wù)請求獲取信號量SP,當(dāng)前SP數(shù)值為0,將Td1任務(wù)放入延時等待隊(duì)列和信號量阻塞隊(duì)列中。

        Td1任務(wù)(200016BC)請求獲取SP,當(dāng)前時間:19.533 285 s。

        SP=0,表示當(dāng)前任務(wù)(200016BC)獲取SP失敗。

        將當(dāng)前任務(wù)(200016BC)放入等待隊(duì)列和SP阻塞隊(duì)列,獲取就緒隊(duì)列中的任務(wù),當(dāng)前時間:19.547 460 s。

        (9) Td2和Td3任務(wù)釋放信號量。Td2任務(wù)延時結(jié)束后,釋放信號量。同時將Td1任務(wù)從延時等待隊(duì)列和信號量阻塞隊(duì)列中移出,并放入就緒隊(duì)列中運(yùn)行。在Td2任務(wù)釋放信號量后,Td3任務(wù)延時結(jié)束釋放信號量(幾乎可以看作同時),此時信號量數(shù)值為1,故Td2獲取信號量成功,開始運(yùn)行。

        Td2任務(wù)釋放SP,當(dāng)前時間:21.834 034 s。

        從等待隊(duì)列和SP阻塞隊(duì)列中獲取等待SP的任務(wù)(200016BC),當(dāng)前時間:21.836 s。

        Td2任務(wù)釋放SP成功,當(dāng)前時間:21.837 424 s。

        Td3任務(wù)釋放SP,當(dāng)前時間:21.838 129 s。

        Td3任務(wù)釋放SP成功,當(dāng)前時間:21.841 097 s。

        Td1任務(wù)獲取SP成功,當(dāng)前時間:21.843 022 s,延時5 s。

        (10) Td1、Td2和Td3任務(wù)新一輪的請求獲取信號量。此時開始的運(yùn)行情況和之前一樣,循環(huán)之前的過程。按照Td1、Td2和Td3的順序反復(fù)獲取信號量執(zhí)行。任務(wù)的調(diào)度時序圖如圖6所示。

        圖6 基于信號量機(jī)制的任務(wù)調(diào)度時序圖

        4.3 調(diào)度性能剖析

        任務(wù)信號量的獲取和釋放的理論時間是判斷mbedOS中信號量機(jī)制的實(shí)時性好與壞的性能標(biāo)準(zhǔn)。在SD-mbedOS架構(gòu)下,系統(tǒng)時鐘頻率為48 MHz,一個指令周期的時間為0.020 8 μs。以任務(wù)請求獲取信號量為例,進(jìn)行理論時間和實(shí)際執(zhí)行時間的比較,在信號量數(shù)值不為0的情況下,任務(wù)申請獲取信號量的機(jī)器指令有461條,機(jī)器指令的條數(shù)是以執(zhí)行一條_NOP指令所花費(fèi)的時間為基準(zhǔn),所有執(zhí)行的機(jī)器指令都能在編譯之后生成的.lst文件中找到,關(guān)鍵函數(shù)及其對應(yīng)的機(jī)器碼和匯編指令如表1所示。

        表1 關(guān)鍵函數(shù)及其對應(yīng)的機(jī)器碼和匯編指令

        根據(jù)計算得:信號量獲取的理論時間為10.44 μs,而在單個任務(wù)執(zhí)行的情況下,信號量獲取(信號量數(shù)值不為0)的實(shí)際執(zhí)行時間為14.8 μs,理論時間和實(shí)際時間的誤差在微秒級別,誤差在可接受的范圍內(nèi)。

        在工程實(shí)例中,將任務(wù)請求獲取信號量前后、釋放信號量前后的系統(tǒng)運(yùn)行時間輸出。三個任務(wù)具體的調(diào)度時間如表2所示。

        表2 信號量獲取和釋放的實(shí)際執(zhí)行時間 單位:ms

        表2中獲取信號量I和獲取信號量II分別表示:獲取信號量時信號量數(shù)值不為0和為0,獲取信號量II中的時間I表示信號量數(shù)值為0,將任務(wù)添加到相應(yīng)隊(duì)列的時間,時間II表示在任務(wù)添加到隊(duì)列中后,到獲取信號量成功的時間。釋放信號量I和釋放信號量II分別表示:釋放信號量時信號量阻塞隊(duì)列為空和不為空,而時間III表示從隊(duì)列中移出任務(wù)的時間,時間IV表示其他時間。

        表2中的時間是結(jié)合實(shí)例工程中三個任務(wù)的延遲時間計算的,由于實(shí)例中是多任務(wù)并發(fā),并且系統(tǒng)的運(yùn)行狀態(tài)用printf方法進(jìn)行輸出,故信號量調(diào)度機(jī)制中的操作耗時較多??偟膩砜?信號量的獲取和釋放需要的時間很短,具有很好的實(shí)時性。

        5 結(jié) 語

        mbedOS的信號量調(diào)度機(jī)制是一個較為復(fù)雜的過程,其中涉及到多任務(wù)并發(fā)調(diào)度、任務(wù)對信號量的獲取和釋放、就緒隊(duì)列和等待隊(duì)列等的管理,其中的函數(shù)調(diào)用關(guān)系也較為復(fù)雜,觸發(fā)到的中斷函數(shù)有SVC中斷和Systick中斷等。本文重點(diǎn)剖析mbedOS中的信號量調(diào)度機(jī)制及其關(guān)鍵函數(shù),加以流程圖總結(jié),通過多任務(wù)并發(fā)的調(diào)度實(shí)驗(yàn),將調(diào)度過程中任務(wù)的切換、狀態(tài)的變化、當(dāng)前系統(tǒng)運(yùn)行時間進(jìn)行輸出,給出時序圖分析,進(jìn)一步驗(yàn)證信號量調(diào)度機(jī)制理論分析的正確性,最后還對調(diào)度過程進(jìn)行實(shí)時性能剖析,結(jié)果表明信號量調(diào)度機(jī)制的實(shí)時性能較好。通過對信號量調(diào)度機(jī)制的剖析,有助于更好地理解mbedOS的多任務(wù)并發(fā)機(jī)制,也為其他RTOS的信號量機(jī)制分析提供了基礎(chǔ)。

        猜你喜歡
        信號量調(diào)用隊(duì)列
        隊(duì)列里的小秘密
        基于多隊(duì)列切換的SDN擁塞控制*
        軟件(2020年3期)2020-04-20 00:58:44
        核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
        在隊(duì)列里
        LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
        Nucleus PLUS操作系統(tǒng)信號量機(jī)制的研究與測試
        豐田加速駛?cè)胱詣玉{駛隊(duì)列
        基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
        硬件信號量在多核處理器核間通信中的應(yīng)用
        μC/OS- -III對信號量的改進(jìn)
        国产精品熟女一区二区三区| 久久麻豆精亚洲av品国产蜜臀| 乱码一二区在线亚洲| 一区二区无码中出| 狠狠色丁香婷婷久久综合2021| 男人的av天堂狠狠操| 中文片内射在线视频播放| 高清国产亚洲精品自在久久| 久久一二区女厕偷拍图| 国产99视频精品免视看7| 国产欧美成人一区二区a片| 午夜福利理论片高清在线观看| 台湾佬娱乐中文22vvvv| 青草福利在线| 国产三级伦理视频在线| 免费观看日本一区二区三区 | 亚洲精品无码不卡在线播he | 国产乱妇乱子在线播视频播放网站| 亚洲av无码成人精品区天堂| 国产精品情侣露脸av在线播放| 视频一区中文字幕亚洲| 亚洲av日韩综合一区尤物| 艳妇臀荡乳欲伦交换h在线观看| 野花在线无码视频在线播放 | 无码人妻久久一区二区三区app| 五月婷婷激情小说| 无码成人AV在线一区二区| 亚洲国产综合精品一区最新| 亚洲乱码av乱码国产精品| а天堂8中文最新版在线官网| 久久水蜜桃亚洲av无码精品麻豆| 国产精彩视频| 亚洲一区二区三区久久久| 国产精品国产自产拍高清| 台湾佬中文网站| 久久亚洲av成人无码国产| 日本手机在线| 精品国产女主播一区在线观看| 中文字幕无码成人片| 中文字幕被公侵犯的漂亮人妻| 久久人妻公开中文字幕|