色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

汽車電子技術(shù) ? 來源:工控碼農(nóng) ? 作者:工控碼農(nóng) ? 2023-02-07 09:37 ? 次閱讀

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

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

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

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

動作任務(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;
  }
}

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

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

//根據(jù)ID啟動動作任務(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)前的控制塊添加到就緒隊列
  return true;
}
//將要運行的動作添加到就緒運行隊列
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)就緒鏈表沒有動作時 tail為空 
  {
    mOS.tail->next = pAction;
  }


  mOS.tail = pAction;  //移動尾部指針
}

2.就緒隊列遍歷

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

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

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

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

  if(mOS.current==mOS.tail)  //尾部刪除,需要將尾部指針往前移動
  {
    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)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Switch
    +關(guān)注

    關(guān)注

    1

    文章

    533

    瀏覽量

    58222
  • RTOS
    +關(guān)注

    關(guān)注

    22

    文章

    811

    瀏覽量

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

    關(guān)注

    1

    文章

    130

    瀏覽量

    10840
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    基于51單片機的帶語音播報的溫度檢測儀的設(shè)計與實現(xiàn)任務(wù)

    基于51單片機的帶語音播報的溫度檢測儀的設(shè)計與實現(xiàn)任務(wù)
    發(fā)表于 08-17 15:26

    單片機工程師是程序員嗎

    程師做的工作就是程序開發(fā),使用C語言來驅(qū)動單片機的硬件資源,以及完成一個邏輯任務(wù)實現(xiàn)一定的功能的過程。但是單片機工程師又不是嚴(yán)格意義上的程序員,因為程序員是純粹在電腦上寫代碼的一個職
    發(fā)表于 11-09 09:14

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

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

    如何用VxWorks的信號量機制實現(xiàn)任務(wù)同步

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

    超齊全單片機工具集

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

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

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

    8051單片機工作原理介紹

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

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

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

    單片機工具大全

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

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

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

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

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

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

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

    單片機工程師是程序員嗎?真實的月薪到底有多少?

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

    單片機工控事件

    單片機工控通常有延時,電機狀態(tài),傳感器狀態(tài)等通用耗時操作,業(yè)務(wù)程序查詢這些狀態(tài),就會產(chǎn)生大量的冗余代碼,不簡潔.使用事件則是把這些通用操作丟給系統(tǒng)去處理,系統(tǒng)操作完成后,則運行業(yè)務(wù)程序的下一個Step.
    的頭像 發(fā)表于 02-07 09:40 ?884次閱讀
    主站蜘蛛池模板: 九九热久久只有精品2| 我和妽妽在厨房里的激情区二区| 亚洲国产综合久久精品| 99热久久视频只有精品6国产| 果冻传媒在线完整免费播放| 日韩精品无码久久一区二区三| 真实处破女全过程完免费观看| 国产伦子沙发午休系列资源曝光| 欧美肥婆性生活| 影音先锋电影资源av| 国产呦精品一区二区三区下载| 人妻插B视频一区二区三区| 中文字幕无码他人妻味| 国内免费视频成人精品| 色综合a在线| 把内衣脱了把奶露出来| 久就热视频精品免费99| 亚洲精品视频免费看| 国产成人久久精品激情| 欧美三级aaa| 99re8久久热在线视频| 久久无码人妻中文国产| 亚洲熟妇无码乱子AV电影| 国产精品亚洲欧美| 色精品极品国产在线视频| CHINESE老阿姨免费视频| 毛片在线网址| 中文天堂www资源| 久久精品国产在热亚洲| 亚洲男人天堂2018av| 狠狠插影院| 亚洲高清无在码在线电影| 国产超碰人人爱被IOS解锁| 琪琪午夜福利免费院| a视频免费在线| 女仆翻身大作战| BL文高H强交| 欧美最猛12teevideos| 99久久免费精品| 欧美黑人巨大xxxxx| a久久99精品久久久久久蜜芽|