<rt id="m4md3"></rt>
  • <bdo id="m4md3"><meter id="m4md3"></meter></bdo>
  • <label id="m4md3"></label>
      <center id="m4md3"><optgroup id="m4md3"></optgroup></center>
      產(chǎn)品分類

      當(dāng)前位置: 首頁 > 工業(yè)電氣產(chǎn)品 > 電氣附件 > 冷壓端子

      類型分類:
      科普知識
      數(shù)據(jù)分類:
      冷壓端子

      Windows Embedded Compact 實時調(diào)度介紹

      發(fā)布日期:2022-04-27 點擊率:127 品牌:EMB

      • 關(guān)鍵詞: Windows Embedded Compact
      • 摘要:本文介紹了Windows Embedded Compact 實時調(diào)度的定義、軟硬件平臺搭建及程序運行設(shè)置等,可供學(xué)習(xí)參考。

        實時調(diào)度機制(Real-Time Scheduler)是Windows Embedded Compact區(qū)別于其他所有Windows系統(tǒng)的最顯著特性,同時也是開發(fā)嵌入式系統(tǒng)時需要著重考慮的部分。在工程領(lǐng)域?qū)Α皩崟r”的理解,我非常欣賞下面的定義:“一個實時系統(tǒng)必須要滿足明確的(受限的)響應(yīng)時間約束或風(fēng)險的嚴重后果,包括失效狀態(tài)”- 出自于Phillip A. Laplante Real-Time System Design and Analysis所以,一個實時系統(tǒng)中執(zhí)行一個代碼必須在規(guī)定的時間約束內(nèi)有明確的結(jié)果,否則就可能會導(dǎo)致系統(tǒng)失效,實時并不一定意味著快速處理能力。Windows Embedded Compact正符合上述對于實時系統(tǒng)的定義,因此為了進一步理解,我們首先來了解它的任務(wù)調(diào)度機制,WinCE的任務(wù)調(diào)度內(nèi)核每隔1ms查詢一次現(xiàn)有任務(wù)并依據(jù)下面兩個原則來決定處理哪個任務(wù):

      a). 具有更高優(yōu)先級的任務(wù)先被執(zhí)行

      b). 同樣優(yōu)先級的任務(wù)按100ms時間間隔(或Task Quantum定義的時間間隔)循環(huán)輪流執(zhí)行

      對于第一條規(guī)則,WinCE提供256個優(yōu)先級等級(0-255),數(shù)字越小優(yōu)先級越高,因此0級為最高優(yōu)先級,關(guān)于優(yōu)先級的應(yīng)用本文不做重點描述,請參考下面文章:

      Real-TimePriority System Levels (Windows Embedded CE 6.0)

      對于第二條規(guī)則,當(dāng)多個待處理任務(wù)擁有同樣的優(yōu)先級,將按照100ms時間間隔(可以根據(jù)Thread Quantum自定義)循環(huán)輪流執(zhí)行。例如有N個同樣優(yōu)先級的任務(wù),當(dāng)?shù)谝粋€運行了上述定義時間片(WinCE稱其為Quantum,如100ms),系統(tǒng)內(nèi)核就會將其中斷然后執(zhí)行第二個任務(wù),依此類推,直到N個任務(wù)都執(zhí)行過一個Quantum時間后再重新回到第一個任務(wù)執(zhí)行,如此循環(huán)。任一個線程最多只能運行一個Quantum的時間,除非另一個更高優(yōu)先級的任務(wù)需要占用CPU,則按照第一條規(guī)則,這個線程會被更高優(yōu)先級任務(wù)占用。


      下面我們通過兩個例子來驗證上述兩個規(guī)則,硬件平臺使用ToradexColibri VF61NXP/Freescale Vybrid Cortex-A5 )計算機模塊搭配Iris 載板,軟件使用Toradex提供的對應(yīng)此平臺的工業(yè)級的WinCE6OSGPIO

      a). 軟硬件平臺搭建請參考開發(fā)指南,如下圖所示

      b). 驗證原理為在系統(tǒng)中啟動兩個任務(wù),第一個任務(wù)驅(qū)動硬件某個GPIO輸出為低電平,而另一個則將同一個GPIO輸出為高電平;再將這兩個任務(wù)的優(yōu)先級分別設(shè)置為相同和不同時候,通過觀測GPIO連接的示波器輸出來判定上述的兩個調(diào)度規(guī)則。關(guān)鍵代碼如下:創(chuàng)建兩個線程入口函數(shù)ThreadONThreadOFF,分別用來將選定的GPIO輸出為高電平和低電平,而從函數(shù)內(nèi)部代碼可見會持續(xù)輸出高電平或者低電平,因此我們通過示波器觀察GPIO管腳的輸出即可得出目前是哪個函數(shù)在運行。

      --------------------------------------------------------------------------------------------------------------

      #include

      #include"gpio.h"

      // ===define constant pins / gpios ===

      // SODIMMpin 101

      uIo io1 =COLIBRI_PIN(101);

      HANDLE hGpio;

      HANDLE hThreadON,hThreadOFF;

      //defineThreadON

      DWORD WINAPI ThreadON( LPVOID lpParam ){

          //Set ThreadPriority

          CeSetThreadPriority(GetCurrentThread(), 100);

          Sleep(5); //Allowthe orther Thread to configure it's PRIO

          //FNFINITELOCKING LOOP

          while(1){

              //Set GPIOlogic high

              Gpio_SetLevel(hGpio, io1, ioHigh);

          }

          return 0;

      }

      //defineThreadOFF

      DWORD WINAPI ThreadOFF( LPVOID lpParam ){

          //Set ThreadPriority

          CeSetThreadPriority(GetCurrentThread(),100);

          //FNFINITELOCKING LOOP

          while(1){

              //Set GPIOlogic low

              Gpio_SetLevel(hGpio, io1, ioLow);

          }

          return 0;

      }

      //=============================================================================

      //Application Entry Point

      //

      // Thesimple error handling using ASSERT statements is only effective when

      // theapplication is run as a debug version.

      //=============================================================================

      int wmain(int argc, _TCHAR* argv[])  

      {

         BOOL success;

         // === InitializeGPIO library. ===

         // We don't useregistry-based  configuration, thus wecan

         // pass NULL goGpio_Init()

         hGpio = Gpio_Init(NULL);  

         ASSERT(hGpio != 0);

         success = Gpio_Open(hGpio);

         ASSERT (success);

         // Configure thepin to act as GPIO (as opposed to an Alternate function)

         // Set it toOutput,  High

         Gpio_ConfigureAsGpio(hGpio, io1);

         Gpio_SetDir         (hGpio, io1, ioOutput);

         Gpio_SetLevel       (hGpio, io1, ioHigh);

         CeSetThreadPriority(GetCurrentThread(),99);

          //Create twoconcorrent Threads, one set GPIO to High and other to Low

          hThreadON = CreateThread(NULL, 0, ThreadON,NULL, 0, NULL);

         hThreadOFF = CreateThread(0, 0, ThreadOFF,NULL, 0, NULL);

         

      //Time to finish the Program

      Sleep(3000);

         return(TRUE);

      }

      --------------------------------------------------------------------------------------------------------------

      c). 首先我們來測試第二條規(guī)則,將兩個任務(wù)的優(yōu)先級設(shè)置為相同值(如上面代碼為100),運行程序后示波器圖形如下,可以看到每隔100ms GPIO輸出循環(huán)交替變化,完全符合我們第二條規(guī)則。

      d). 然后我們再來測試第一條規(guī)則,如下修改一個任務(wù)(ThreadON)的代碼,將其優(yōu)先級提高到99,另外在循環(huán)中增加一個5ms的暫停時間。

      --------------------------------------------------------------------------------------------------------------

      DWORD WINAPI ThreadON( LPVOID lpParam ){

          //Set ThreadPriority

          CeSetThreadPriority(GetCurrentThread(), 99);

          Sleep(5); //Allowthe orther Thread to configure it's PRIO

          //FNFINITELOCKING LOOP

          while(1){

              //Set GPIOlogic high

              Gpio_SetLevel(hGpio, io1, ioHigh);

                    Sleep(5);

          }

          return 0;

      }

      --------------------------------------------------------------------------------------------------------------

      e). 運行修改后的程序,示波器輸出如下結(jié)果,每隔7ms左右有一個拉高的脈沖,表示每次當(dāng)高優(yōu)先級的任務(wù)(ThreadON)從5ms 暫停時間恢復(fù)后,都會中斷低優(yōu)先級任務(wù)的執(zhí)行,這樣完全符合第一條規(guī)則的描述。

        當(dāng)然,以上所有測試都是基于單核心系統(tǒng),從Windows Embedded Compact 7 開始,WinCE內(nèi)核提供了對多核心處理器的支持,同時也有一個新的屬性“affinity”來定義哪一個核心來執(zhí)行哪一個線程,所以如果在多核系統(tǒng)和WEC7上面運行上述例子,同時并未限定線程在同一個核心上面執(zhí)行,則結(jié)果會不同因為兩個線程會同時在不同核心上面運行。當(dāng)然,其實正常應(yīng)用情況下我們是不建議設(shè)置“affinity”參數(shù)的,因為這樣就無法使得內(nèi)核調(diào)度來自動安排線程在最先空閑的核心上面運行,達不到降低延遲提高系統(tǒng)性能的要求了。

        實時系統(tǒng)目前在包括工業(yè)自動化,機器人和醫(yī)療領(lǐng)域等嵌入式設(shè)備上面有廣泛的需求,因此了解WinCE的實時調(diào)度工作機制以及如何使用線程可以讓我們的應(yīng)用程序?qū)崟r穩(wěn)定的執(zhí)行,讓我們更高效可靠的利用WinCE搭建我們的實時系統(tǒng)!

      下一篇: PLC、DCS、FCS三大控

      上一篇: 索爾維全系列Solef?PV

      推薦產(chǎn)品

      更多
      主站蜘蛛池模板: 久久婷婷五月综合97色| 好吊色青青青国产综合在线观看| 伊人色综合久久天天五月婷| 涩涩色中文综合亚洲| 亚洲欧洲av综合色无码| 一本大道久久a久久综合| 久久99精品综合国产首页| 亚洲综合中文字幕无线码| 婷婷综合缴情亚洲狠狠尤物 | 亚洲av无码国产综合专区| 亚洲欧洲av综合色无码| 国产香蕉尹人综合在线| 一本久道久久综合狠狠躁| 国产在线五月综合婷婷| 色综合久久久久综合99| 激情五月婷婷综合网站| 一本一道久久a久久精品综合 | 天天综合天天看夜夜添狠狠玩| 亚州欧州一本综合天堂网| 狠狠色丁香婷婷综合潮喷| 精品综合久久久久久蜜月| 亚洲综合在线视频| 亚洲色欲久久久综合网| 女人和拘做受全程看视频日本综合a一区二区视频 | 国产AV综合影院| 丁香狠狠色婷婷久久综合 | 五月天激情综合网丁香婷婷| 久久婷婷午色综合夜啪 | 在线综合亚洲中文精品| 亚州欧州一本综合天堂网| 久久综合香蕉久久久久久久 | 一本综合久久国产二区| 狠狠色丁香婷婷综合久久片| 97se亚洲国产综合自在线| 亚洲综合校园春色| 色噜噜综合亚洲av中文无码| 久久一区二区精品综合| 色婷婷综合久久久久中文一区二区 | 欧洲亚洲综合一区二区三区| 丁香六月纪婷婷激情综合| 综合人妻久久一区二区精品|