女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

單片機(jī)工控實(shí)現(xiàn)任務(wù)執(zhí)行管理

汽車(chē)電子技術(shù) ? 來(lái)源:工控碼農(nóng) ? 作者:工控碼農(nóng) ? 2023-02-07 09:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

前面寫(xiě)了switch case做任務(wù)調(diào)度的應(yīng)用,這邊寫(xiě)一下如何實(shí)現(xiàn).像一般的RTOS一樣都有一個(gè)任務(wù)控制塊(TCB)列表來(lái)管理所有的任務(wù),所以這里也需要一個(gè)結(jié)構(gòu)體來(lái)管理動(dòng)作任務(wù),這里叫做ACB吧.

動(dòng)作任務(wù)管理結(jié)構(gòu)體

這個(gè)結(jié)構(gòu)體用來(lái)記錄當(dāng)前動(dòng)作任務(wù)的當(dāng)前步驟,函數(shù)地址,事件處理函數(shù)的函數(shù)地址,動(dòng)作名稱(chēng),運(yùn)行時(shí)間等.

typedef struct _ACB
{
  uint8_t nStep;          // 分支動(dòng)作步驟 
  uint8_t nChildID;       //子動(dòng)作ID
  uint32_t nDelay;          // 延時(shí)
  uint32_t nStartTime;  
  uint32_t nUsedTime;
  uint32_t nStatus;          //當(dāng)前狀態(tài)
  
  ActionEvent EventQueue[4];    //動(dòng)作事件隊(duì)列
  uint8_t nEventCnt;            //事件數(shù)量和個(gè)數(shù)
  
  void (*AppCallBack)();        //業(yè)務(wù)動(dòng)作函數(shù)指針
  void (*EventCallback)();      //事件處理函數(shù)指針
  void (*ActionCallback)();     //當(dāng)前運(yùn)行的函數(shù)指針 
  
  char ActionParam[10];          //動(dòng)作參數(shù)
  //17
  char* pActionName;             //動(dòng)作名稱(chēng)
  char* pErrorInfo;              //錯(cuò)誤信息
  //8
  struct _ACB* next;             //上一個(gè)控制塊 便于刪除添加到就緒隊(duì)列
  struct _ACB* prev;             //下一個(gè)控制塊 便于添加刪除到就緒隊(duì)列
} ACB;

動(dòng)作任務(wù)創(chuàng)建

//將OpApp業(yè)務(wù)函數(shù)指針和ACB結(jié)構(gòu)體綁定
void AddAction(int nID,void (*OpApp)(),const char* pActionName)
{
  if(nID<90)
  {
    mOS.ActionPool[nID].AppCallBack = OpApp;
    mOS.ActionPool[nID].EventCallback = EventAction;
    mOS.ActionPool[nID].ActionCallback = OpApp;
    mOS.ActionPool[nID].nStatus = 0xff;
    mOS.ActionPool[nID].nEventCnt = 0;
    mOS.ActionPool[nID].nUsedTime = 0;
    mOS.ActionPool[nID].nStartTime = 0;
    mOS.ActionPool[nID].pActionName = (char*)pActionName;
  }
}

動(dòng)作任務(wù)執(zhí)行

1.動(dòng)作結(jié)構(gòu)體初始化,添加到就緒隊(duì)列

//根據(jù)ID啟動(dòng)動(dòng)作任務(wù)
int8_t StartAction(uint8_t ActionId)
{
  if(ActionId>90)
  {
    return false;  
  }
  ACB* pAction = &mOS.ActionPool[ActionId];
  pAction->ActionStartTime =   mOS.SystemTime;
  
  pAction->nStep = STEP1;
  pAction->nEventCnt = 0;
  pAction->nUsedTime = 0;
  pAction->nChildID = 0;
  pAction->EventCallback = EventAction;
  pAction->ActionCallback = pAction->AppCallBack;//先指向業(yè)務(wù)函數(shù)指針  
  AddReadyActionToTail(pAction);    //把當(dāng)前的控制塊添加到就緒隊(duì)列
  return true;
}
//將要運(yùn)行的動(dòng)作添加到就緒運(yùn)行隊(duì)列
void AddReadyActionToTail(ACB * pAction)
{
  pAction->nStaus = 0;
  pAction->next = NULL;
  pAction->prev = mOS.tail;  //

  if(mOS.head==NULL)
  {
    mOS.head = pAction;
  }

  if(mOS.tail!=NULL) //當(dāng)就緒鏈表沒(méi)有動(dòng)作時(shí) tail為空 
  {
    mOS.tail->next = pAction;
  }


  mOS.tail = pAction;  //移動(dòng)尾部指針
}

2.就緒隊(duì)列遍歷

inline void AppLoop()
{
  mOS.current = mOS.head;

    while(mOS.current!=NULL)
    {
      mOS.current->ActionCallback();
      DelFinishAction();  //需要把完成的任務(wù)從就緒隊(duì)列刪除
      mOS.current = mOS.current->next;
    }  
  }

  //動(dòng)作完成后,并計(jì)算動(dòng)作使用時(shí)間,從鏈表刪除
inline void DelFinishAction()
{
  if(mOS.current->nStatus==0)  //動(dòng)作任務(wù)正在運(yùn)行
  {  
    return ;
  }
  //統(tǒng)計(jì)任務(wù)耗時(shí)    
   mOS.current->nUsedTime = mOS.SystemTime - mOS.CurrentAction->nStartTime;   //當(dāng)前時(shí)間減去開(kāi)始時(shí)間
   if(mOS.head==mOS.tail)  //只有一個(gè)元素 
   {
      mOS.head= NULL;
      mOS.tail = NULL;
      return ;
    }

  if(mOS.current==mOS.head)  //頭部刪除,需要將頭部指針往后移動(dòng)
  {
    mOS.head = mOS.current->next;
    return ;
  }

  if(mOS.current==mOS.tail)  //尾部刪除,需要將尾部指針往前移動(dòng)
  {
    mOS.tail = mOS.current->prev;
    mOS.tail->next = NULL;
    return ;
  }
//中間刪除
   mOS.current->prev->next = mOS.current->next;  
   mOS.current->next->prev = mOS.current->prev;
}
聲明:本文內(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)投訴
  • Switch
    +關(guān)注

    關(guān)注

    1

    文章

    537

    瀏覽量

    59604
  • RTOS
    +關(guān)注

    關(guān)注

    24

    文章

    849

    瀏覽量

    121106
  • 結(jié)構(gòu)體
    +關(guān)注

    關(guān)注

    1

    文章

    130

    瀏覽量

    11106
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32單片機(jī)裸機(jī):實(shí)現(xiàn)任務(wù)設(shè)計(jì)實(shí)現(xiàn)

    單片機(jī)開(kāi)發(fā)過(guò)程中,隨著任務(wù)的增多,完全等待一個(gè)任務(wù)完成后,再去執(zhí)行下一個(gè)任務(wù)的弊端越發(fā)明顯。
    的頭像 發(fā)表于 11-21 15:02 ?6417次閱讀
    STM32<b class='flag-5'>單片機(jī)</b>裸機(jī):<b class='flag-5'>實(shí)現(xiàn)</b>多<b class='flag-5'>任務(wù)</b>設(shè)計(jì)<b class='flag-5'>實(shí)現(xiàn)</b>

    基于51單片機(jī)的帶語(yǔ)音播報(bào)的溫度檢測(cè)儀的設(shè)計(jì)與實(shí)現(xiàn)任務(wù)書(shū)

    基于51單片機(jī)的帶語(yǔ)音播報(bào)的溫度檢測(cè)儀的設(shè)計(jì)與實(shí)現(xiàn)任務(wù)書(shū)
    發(fā)表于 08-17 15:26

    單片機(jī)工程師是程序員嗎

    程師做的工作就是程序開(kāi)發(fā),使用C語(yǔ)言來(lái)驅(qū)動(dòng)單片機(jī)的硬件資源,以及完成一個(gè)邏輯任務(wù),實(shí)現(xiàn)一定的功能的過(guò)程。但是單片機(jī)工程師又不是嚴(yán)格意義上的程序員,因?yàn)槌绦騿T是純粹在電腦上寫(xiě)代碼的一個(gè)職
    發(fā)表于 11-09 09:14

    如何使用makefile管理嵌入式單片機(jī)工程?

    如何使用makefile管理嵌入式單片機(jī)工程?
    發(fā)表于 11-30 06:04

    如何用VxWorks的信號(hào)量機(jī)制實(shí)現(xiàn)任務(wù)同步

    如何用VxWorks的信號(hào)量機(jī)制實(shí)現(xiàn)任務(wù)同步
    發(fā)表于 03-29 12:25 ?16次下載

    超齊全單片機(jī)工具集

    超齊全單片機(jī)工具集單片機(jī)工
    發(fā)表于 11-03 16:49 ?155次下載

    51單片機(jī)任務(wù)機(jī)制的實(shí)現(xiàn)策略研究

    從操作系統(tǒng)實(shí)現(xiàn)任務(wù)機(jī)制的原理入手,分析了51單片機(jī)實(shí)現(xiàn)任務(wù)機(jī)制的基本條件,論述了5l單片機(jī)
    發(fā)表于 09-19 17:26 ?159次下載
    51<b class='flag-5'>單片機(jī)</b>多<b class='flag-5'>任務(wù)</b>機(jī)制的<b class='flag-5'>實(shí)現(xiàn)</b>策略研究

    8051單片機(jī)工作原理介紹

    8051單片機(jī)工作原理 8051單片機(jī)工作原理
    發(fā)表于 10-28 11:19 ?43次下載

    單片機(jī)初學(xué)者邁向單片機(jī)工程師

    單片機(jī)初學(xué)者邁向單片機(jī)工程師從單片機(jī)初學(xué)者邁向單片機(jī)工程師
    發(fā)表于 01-15 16:33 ?45次下載

    單片機(jī)工具大全

    收藏的單片機(jī)工具,分享出來(lái)
    發(fā)表于 02-15 23:04 ?21次下載

    51單片機(jī)任務(wù)操作系統(tǒng)的原理與實(shí)現(xiàn)

    51單片機(jī)任務(wù)操作系統(tǒng)的原理與實(shí)現(xiàn),在51單片機(jī)上模擬操作系統(tǒng)
    發(fā)表于 02-28 15:09 ?16次下載

    單片機(jī)的主程序是如何執(zhí)行

    我們從單片機(jī)的工作原理可以看出單片機(jī)執(zhí)行程序來(lái)完成我們所要求的任務(wù)的,在單片機(jī)中有很多子程序,單片機(jī)
    的頭像 發(fā)表于 10-30 17:28 ?1.1w次閱讀
    <b class='flag-5'>單片機(jī)</b>的主程序是如何<b class='flag-5'>執(zhí)行</b>的

    多個(gè)任務(wù)時(shí),如何保證單片機(jī)工作效率及每個(gè)任務(wù)完成的及時(shí)性?資料下載

    電子發(fā)燒友網(wǎng)為你提供多個(gè)任務(wù)時(shí),如何保證單片機(jī)工作效率及每個(gè)任務(wù)完成的及時(shí)性?資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師
    發(fā)表于 04-12 08:41 ?3次下載
    多個(gè)<b class='flag-5'>任務(wù)</b>時(shí),如何保證<b class='flag-5'>單片機(jī)工</b>作效率及每個(gè)<b class='flag-5'>任務(wù)</b>完成的及時(shí)性?資料下載

    單片機(jī)工程師是程序員嗎?真實(shí)的月薪到底有多少?

    程師做的工作就是程序開(kāi)發(fā),使用C語(yǔ)言來(lái)驅(qū)動(dòng)單片機(jī)的硬件資源,以及完成一個(gè)邏輯任務(wù),實(shí)現(xiàn)一定的功能的過(guò)程。但是單片機(jī)工程師又不是嚴(yán)格意義上的程序員,因?yàn)槌绦騿T是純粹在電腦上寫(xiě)代碼的一個(gè)職
    發(fā)表于 11-04 17:36 ?16次下載
    <b class='flag-5'>單片機(jī)工</b>程師是程序員嗎?真實(shí)的月薪到底有多少?

    單片機(jī)工控事件

    單片機(jī)工控通常有延時(shí),電機(jī)狀態(tài),傳感器狀態(tài)等通用耗時(shí)操作,業(yè)務(wù)程序查詢這些狀態(tài),就會(huì)產(chǎn)生大量的冗余代碼,不簡(jiǎn)潔.使用事件則是把這些通用操作丟給系統(tǒng)去處理,系統(tǒng)操作完成后,則運(yùn)行業(yè)務(wù)程序的下一個(gè)Step.
    的頭像 發(fā)表于 02-07 09:40 ?1156次閱讀