<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      深入解析:STM32FreeRtos入門(mén)(四)——任務(wù)狀態(tài)和調(diào)度


      前言

      前面講述了任務(wù)創(chuàng)建和任務(wù)刪除
      但是系統(tǒng)還缺少了最主要的任務(wù)調(diào)度,狀態(tài),優(yōu)先級(jí)等。這章講優(yōu)先級(jí)


      提示:以下是本篇文章正文內(nèi)容,下面案例可供參考

      一、任務(wù)狀態(tài)

      示例:pandas 是基于NumPy 的一種工具,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。
      舉例:打游戲

      創(chuàng)建:打開(kāi),運(yùn)行游戲

      Running:進(jìn)入對(duì)局,正在進(jìn)行游玩的對(duì)局
      Ready:匹配中,等待進(jìn)入對(duì)局/掉線(xiàn)了等待重連。
      Blocked:服務(wù)器維護(hù),暫時(shí)玩不了。等待服務(wù)器恢復(fù)才能繼續(xù)游玩
      所以,Blocked下一狀態(tài)是Ready
      Suspended:玩不下去游戲,上廁所,打電話(huà),睡著了等等。但是后臺(tái)還掛著?;謴?fù)了繼續(xù)玩。同上,下一狀態(tài)是Ready
      Deleted:關(guān)閉游戲

      在這里插入圖片描述
      示例代碼

      void StartDefaultTask(void *argument)
      {
      /* USER CODE BEGIN StartDefaultTask */
      /* Infinite loop */
      uint8_t dev, data;
      int len;
      int status;
      TaskHandle_t xSoundTaskHandle = NULL;
      BaseType_t ret;
      LCD_Init();
      LCD_Clear();
      IRReceiver_Init();
      LCD_PrintString(0,0,"Waiting music");
      while (1)
      {
      /* 讀取紅外遙控器,創(chuàng)建播放任務(wù)或者刪除播放任務(wù) */
      if(0==IRReceiver_Read(&dev,&data))
      {
      if(data==0xa8)
      {
      extern void PlayMusic(void *params);
      if(xSoundTaskHandle==NULL)
      {
      LCD_ClearLine(0,0);
      LCD_PrintString(0,0,"Create music");
      ret = xTaskCreate(PlayMusic, "SoundTask", 128, NULL, osPriorityNormal, &xSoundTaskHandle);
      status=1;
      }
      else
      {
      if(status)
      {
      /*暫停或恢復(fù)*/
      LCD_ClearLine(0,0);
      LCD_PrintString(0,0,"Suspend music");
      vTaskSuspend(xSoundTaskHandle);
      PassiveBuzzer_Control(0);
      status=0;
      }
      else
      {
      LCD_ClearLine(0,0);
      LCD_PrintString(0,0,"Resume music");
      vTaskResume(xSoundTaskHandle);
      status=1;
      }
      }
      }
      else if(data==0xa2)
      {
      if(xSoundTaskHandle!=NULL)
      {
      LCD_ClearLine(0,0);
      LCD_PrintString(0,0,"Delete music");
      vTaskDelete(xSoundTaskHandle);
      PassiveBuzzer_Control(0);
      xSoundTaskHandle=NULL;
      }
      }
      }
      }
      /* USER CODE END StartDefaultTask */
      }

      二、任務(wù)調(diào)度

      調(diào)度,肯定就是任務(wù)之間的切換,包括延時(shí)等
      FreeRTOS 是基于優(yōu)先級(jí)的搶占式調(diào)度器,核心原則是:始終運(yùn)行就緒態(tài)中優(yōu)先級(jí)最高的任務(wù)。

      1. 調(diào)度策略
        搶占式調(diào)度:高優(yōu)先級(jí)任務(wù)就緒時(shí),會(huì)立即搶占低優(yōu)先級(jí)任務(wù)的處理器資源(低優(yōu)先級(jí)任務(wù)被暫停,進(jìn)入就緒態(tài))。
        時(shí)間片調(diào)度(同優(yōu)先級(jí)任務(wù)):若多個(gè)任務(wù)優(yōu)先級(jí)相同且均為就緒態(tài),調(diào)度器會(huì)按時(shí)間片(由 configTICK_RATE_HZ 定義的系統(tǒng)節(jié)拍周期)輪流調(diào)度它們,實(shí)現(xiàn) “并發(fā)” 效果。
      2. 調(diào)度觸發(fā)時(shí)機(jī)
        系統(tǒng)節(jié)拍中斷:由定時(shí)器產(chǎn)生的周期性中斷(SysTick),是最常見(jiàn)的調(diào)度觸發(fā)點(diǎn)(如任務(wù)延時(shí)到期、時(shí)間片輪轉(zhuǎn))。
        任務(wù)狀態(tài)變化:如高優(yōu)先級(jí)任務(wù)從阻塞態(tài)轉(zhuǎn)為就緒態(tài)、任務(wù)主動(dòng)調(diào)用 taskYIELD() 放棄處理器等。
        中斷服務(wù)程序(ISR):ISR 中釋放資源(如信號(hào)量)可能導(dǎo)致高優(yōu)先級(jí)任務(wù)就緒,此時(shí)需調(diào)用 portYIELD_FROM_ISR() 觸發(fā)調(diào)度。

      1.函數(shù)說(shuō)明

      代碼如下(示例):

      1. 任務(wù)創(chuàng)建與刪除
        xTaskCreate() 創(chuàng)建一個(gè)新的任務(wù)并將其添加到就緒列表(動(dòng)態(tài)內(nèi)存分配,依賴(lài) configSUPPORT_DYNAMIC_ALLOCATION 配置)。參數(shù)包括任務(wù)函數(shù)、任務(wù)名、棧大小、參數(shù)、優(yōu)先級(jí)、任務(wù)句柄(輸出)。
        xTaskCreateStatic() 靜態(tài)創(chuàng)建任務(wù)(需手動(dòng)指定棧和任務(wù)控制塊內(nèi)存,不依賴(lài)動(dòng)態(tài)內(nèi)存,依賴(lài) configSUPPORT_STATIC_ALLOCATION)。
        vTaskDelete() 刪除指定任務(wù),被刪除的任務(wù)將從就緒 / 阻塞 / 掛起列表中移除,其資源(若動(dòng)態(tài)分配)會(huì)在空閑任務(wù)中釋放。
      2. 任務(wù)阻塞與延時(shí)
        vTaskDelay() 讓當(dāng)前任務(wù)進(jìn)入阻塞狀態(tài)一段指定時(shí)間(以系統(tǒng)節(jié)拍 tick 為單位),時(shí)間到后自動(dòng)進(jìn)入就緒態(tài)。注意:延時(shí)是 “相對(duì)時(shí)間”,從調(diào)用時(shí)刻開(kāi)始計(jì)算。
        vTaskDelayUntil() 讓任務(wù)按照 “絕對(duì)時(shí)間” 周期性阻塞(適合需要固定周期執(zhí)行的任務(wù)),確保任務(wù)執(zhí)行間隔穩(wěn)定,不受調(diào)度延遲影響。
        xTaskAbortDelay() 強(qiáng)制喚醒一個(gè)因 vTaskDelay()、vTaskDelayUntil() 或阻塞在信號(hào)量 / 隊(duì)列等上的任務(wù),使其立即進(jìn)入就緒態(tài)。
      3. 任務(wù)優(yōu)先級(jí)管理
        vTaskPrioritySet() 動(dòng)態(tài)修改指定任務(wù)的優(yōu)先級(jí)。
        uxTaskPriorityGet() 獲取指定任務(wù)的當(dāng)前優(yōu)先級(jí)。
        vTaskPriorityInherit() / vTaskPriorityDisinherit() 用于互斥鎖(xSemaphoreCreateMutex())的優(yōu)先級(jí)繼承機(jī)制,防止優(yōu)先級(jí)反轉(zhuǎn)(自動(dòng)提升低優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí))。
      4. 任務(wù)掛起 / 恢復(fù)的擴(kuò)展
        vTaskSuspendAll() 掛起所有任務(wù)(包括調(diào)度器),僅允許當(dāng)前任務(wù)運(yùn)行,直到調(diào)用 xTaskResumeAll() 恢復(fù)。注意:此函數(shù)不掛起中斷,且期間不能調(diào)用可能引起上下文切換的函數(shù)(如 vTaskDelay())。
        xTaskResumeAll() 恢復(fù)被 vTaskSuspendAll() 掛起的所有任務(wù)和調(diào)度器,返回值指示恢復(fù)期間是否有任務(wù)需要運(yùn)行(pdTRUE 表示需要上下文切換)。
        xTaskResumeFromISR() 在中斷服務(wù)程序(ISR)中恢復(fù)被掛起的任務(wù),返回值為 pdTRUE 時(shí)需觸發(fā)上下文切換(通過(guò) portYIELD_FROM_ISR())。
      5. 任務(wù)狀態(tài)查詢(xún)
        eTaskGetState() 獲取指定任務(wù)的當(dāng)前狀態(tài)(如運(yùn)行、就緒、阻塞、掛起等,返回 eTaskState 枚舉值)。
        uxTaskGetNumberOfTasks() 獲取當(dāng)前系統(tǒng)中存在的任務(wù)總數(shù)(包括所有狀態(tài)的任務(wù))。
        vTaskList() 生成任務(wù)狀態(tài)列表字符串(包含任務(wù)名、狀態(tài)、優(yōu)先級(jí)、棧剩余空間等信息),需配置 configUSE_TRACE_FACILITY 為 1。
      6. 調(diào)度器控制
        vTaskStartScheduler() 啟動(dòng) FreeRTOS 調(diào)度器,開(kāi)始任務(wù)調(diào)度(通常在 main() 中初始化所有任務(wù)后調(diào)用)。
        vTaskEndScheduler() 停止調(diào)度器并釋放所有資源(僅部分平臺(tái)支持,如 x86,嵌入式平臺(tái)較少使用)。
      7. 任務(wù)切換觸發(fā)
        taskYIELD() 強(qiáng)制當(dāng)前任務(wù)放棄 CPU 使用權(quán),觸發(fā)一次上下文切換(讓就緒態(tài)中最高優(yōu)先級(jí)的任務(wù)運(yùn)行)。
        portYIELD_FROM_ISR() 在中斷服務(wù)程序中觸發(fā)上下文切換(需配合 xTaskResumeFromISR() 等函數(shù)的返回值使用)。

      這些函數(shù)共同構(gòu)成了 FreeRTOS 的任務(wù)調(diào)度機(jī)制,使用時(shí)需結(jié)合具體場(chǎng)景(如是否在中斷中、是否需要?jiǎng)討B(tài)內(nèi)存、任務(wù)優(yōu)先級(jí)設(shè)計(jì)等),并確保配置項(xiàng)(FreeRTOSConfig.h)與函數(shù)功能匹配。

      2.任務(wù)調(diào)度

      前面講了,刪除任務(wù)必須自殺或者他殺;

      void Led_Test(void)
      {
      int i;
      Led_Init();
      for(i=0;i<10;i++)
      {
      Led_Control(LED_GREEN, 1);
      mdelay(500);
      Led_Control(LED_GREEN, 0);
      mdelay(500);
      }
      vTaskDelete(NULL);//不自殺或者他殺,系統(tǒng)崩潰
      }

      任務(wù)他殺后,“收尸”(釋放TCB,回收棧)工作由執(zhí)行他殺任務(wù)清除。自殺后,由空閑任務(wù)進(jìn)行“收尸”(釋放TCB,回收棧), 若一直沒(méi)有空閑任務(wù)進(jìn)行“收尸”,則棧被使用完,系統(tǒng)崩潰
      編程習(xí)慣可以盡量避免這種情況;
      1,事件驅(qū)動(dòng)
      2,延時(shí)函數(shù)不要用死循環(huán)

      void Led_Test(void)
      {
      int i;
      Led_Init();
      for(i=0;i<10;i++)
      {
      Led_Control(LED_GREEN, 1);
      //mdelay(500);
      vTaskDelay(500);
      Led_Control(LED_GREEN, 0);
      //mdelay(500);
      vTaskDelay(500);
      }
      vTaskDelete(NULL);//不自殺或者他殺,系統(tǒng)崩潰
      }

      自殺后,由空閑任務(wù)進(jìn)行“收尸”(釋放TCB,回收棧)
      在這里插入圖片描述
      調(diào)度器函數(shù)中會(huì)自己創(chuàng)建空閑任務(wù)

      3.延時(shí)函數(shù)區(qū)別

      vTaskDelay()讓當(dāng)前任務(wù)從就緒態(tài)進(jìn)入阻塞狀態(tài)一段指定時(shí)間
      使用此函數(shù),系統(tǒng)任務(wù)切換延時(shí)時(shí)間近乎于指定時(shí)間
      vTaskDelayUntil()讓任務(wù)按照 “絕對(duì)時(shí)間” 周期性阻塞,確保任務(wù)執(zhí)行間隔穩(wěn)定,不受調(diào)度延遲影響。
      vTaskDelayUntil(&PreTime,500);
      系統(tǒng)任務(wù)切換時(shí)間間隔不確定,為了前面的if部分,使延時(shí)總體為500ms

      void LcdPrintTask(void *params)
      {
      struct TaskPrintInfo *pInfo = params;
      uint32_t cnt = 0;
      int len;
      BaseType_t PreTime;
      uint64_t t1,t2;
      PreTime=xTaskGetTickCount();
      while (1)
      {
      /* 打印信息 */
      if (g_LCDCanUse)
      {
      g_LCDCanUse = 0;
      len = LCD_PrintString(pInfo->x, pInfo->y, pInfo->name);
      len += LCD_PrintString(len, pInfo->y, ":");
      LCD_PrintSignedVal(len, pInfo->y, cnt++);
      g_LCDCanUse = 1;
      mdelay(cnt & 0x3);
      }
      t1=system_get_ns();
      //vTaskDelay(500);
      vTaskDelayUntil(&PreTime,500);
      t2=system_get_ns();
      LCD_ClearLine(pInfo->x, pInfo->y+2);
      LCD_PrintSignedVal(pInfo->x, pInfo->y+2,t2-t1);
      }
      }

      總結(jié)

      FreeRTOS 通過(guò)優(yōu)先級(jí)搶占和時(shí)間片調(diào)度實(shí)現(xiàn)高效的任務(wù)管理,任務(wù)狀態(tài)的切換由事件(如延時(shí)、信號(hào)量)和調(diào)度器共同控制。理解這些機(jī)制是使用 FreeRTOS 進(jìn)行多任務(wù)編程的基礎(chǔ)。
      FreeRTOS 是基于優(yōu)先級(jí)的搶占式調(diào)度器,核心原則是:始終運(yùn)行就緒態(tài)中優(yōu)先級(jí)最高的任務(wù)。

      posted @ 2025-11-04 20:34  yxysuanfa  閱讀(9)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲精品国产免费av| 人妻系列中文字幕精品| 夜鲁鲁鲁夜夜综合视频| 久热这里有精品免费视频| 激情综合网址| 伦伦影院午夜理论片| 欧美成人www免费全部网站| 亚洲欧美精品aaaaaa片| 免费特黄夫妻生活片| 亚洲午夜精品久久久久久抢| 国产乱人激情H在线观看| 鄯善县| 国产免费网站看v片元遮挡| 日韩乱码人妻无码中文字幕视频 | 元江| 日本激情久久精品人妻热| 开心激情站一区二区三区| 国产成人精品2021欧美日韩| 精品无码国产一区二区三区av| 日韩加勒比一本无码精品| 梅州市| 日本中文字幕有码在线视频| 91亚洲国产三上悠亚在线播放| 在线 国产 欧美 专区| 日韩精品专区在线影院重磅| 狠狠躁日日躁夜夜躁欧美老妇| 亚洲an日韩专区在线| 日韩av第一页在线播放| 亚洲欧洲一区二区三区久久| 国产亚洲色婷婷久久99精品| 国产成人一区二区免av| 91精品国产一二三产区| 丁香婷婷综合激情五月色| 亚洲天堂激情av在线| 亚洲人亚洲人成电影网站色| 人妻系列无码专区免费| 亚洲另类在线制服丝袜国产| 亚洲欧美日韩成人综合一区 | 国产乱弄免费视频观看| 久久精品国产亚洲夜色AV网站| 中文字幕av中文字无码亚|