單片機工控通常有延時,電機狀態,傳感器狀態等通用耗時操作,業務程序查詢這些狀態,就會產生大量的冗余代碼,不簡潔.使用事件則是把這些通用操作丟給系統去處理,系統操作完成后,則運行業務程序的下一個Step.
** 延時不使用事件**
switch(step)
{
case STEP1:
baseTime = systemTime;
step= STEP2;
break;
case STEP2:
if(systemTime>(baseTime+500))
{
..
}
break;
}
延時使用事件:
switch(step)
{
case STEP1:
WaitTime(500,STEP2); //向系統請求延時500ms,讓出程序運行權限,500ms后運行到STEP2
break;
case STEP2:
break;
}
不使用事件查詢傳感器狀態
switch(step)
{
case STEP1:
if(IsSensorOn(X01))
{
StopSM(SM101);
}
break;
}
使用事件的查詢傳感器狀態
switch(step)
{
case STEP1:
//向系統請求查詢傳感器X101,傳感器感應后跳到STEP2
WaitSensorOn(X101,STEP2);
break;
}
不使用事件的電機運動
switch(step)
{
case STEP1:
RunSM(SM101,2000); //SM101運行2000步
step = STEP2;
break;
case STEP2:
if(IsSMStop(SM101))
{
}
}
使用事件的電機運動
switch(step)
{
case STEP1:
RunSM(SM101,2000);
//請求系統查詢電機狀態
WaitSM(SM101,STEP2);
break;
}
沒有使用事件的找傳感器的電機運動
switch(step)
{
case STEP1:
RunSM(SM101,2000);
step = STEP2;
break;
case STEP2:
if(IsSensorOn(X101))
{
StopSM(SM101);
return 1;
}
else if(IsSMStop(SM101))
{
return -1;
}
}
使用事件的找傳感器電機運動
switch(step)
{
case STEP1:
//電機運動2000步,請求傳感器狀態 電機事件
FindSensor(SM101,2000,X101,STEP2,STEP_ERROR);
break;
case STEP2:
SetActionOk();
break;
case STEP_ERROR:
SetError("SM101電機丟步-SM101/X101");
break;
}
從上面的案例可以看出使用事件的程序幾乎沒有if else 程序更加口語化.事件實現的基本原理為:
- 把事件的參數(事件類型,延時時間,電機編號,電機步數,傳感器編號)壓入任務棧,下一步驟也就是PC指針也壓入任務棧。
- 讓出業務程序的運行權限到系統的通用事件運行,實現方式運行的函數指針指向事件處理的函數
- 事件處理程序查詢相應的狀態變化
- 運行權限重新切回業務程序,運行函數指針指向業務函數指針,Step出棧.
//切換到事件處理函數
CurrentAction->ActionCallback = CurrentAction->EventCallback;
//系統循環
while(CurrentAction!=NULL)
{
CurrentAction->ActionCallback();
DelFinishAction();
CurrentAction = CurrentAction->NextAction;
}
//切回業務App
ThisAction->nStep = nStep;
ThisAction->ActionCallback = ThisAction->AppCallBack
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
傳感器
+關注
關注
2553文章
51402瀏覽量
756615 -
單片機
+關注
關注
6043文章
44621瀏覽量
638575 -
代碼
+關注
關注
30文章
4827瀏覽量
69055 -
step
+關注
關注
0文章
42瀏覽量
20526
發布評論請先 登錄
相關推薦
![](https://file.elecfans.com/web2/M00/5A/DE/pYYBAGLqjEmAEEeyAAdh3hvMdJ4062.jpg)
單片機工控板
,指示燈,計數器,撥碼開關)如果用PLC成本太高,即使時最入門的也不是太合算,而且還需要自備24V開關電源,對配線也是個難題,就有這個一個想法,可對單片機了解甚少,還望對如上所列給予指點1.能否實現2.開發這個通用的班子費用和周期3.有意向合作開發的mail至:leon51717@163.com
發表于 03-18 14:31
實用單片機工具應用程序合集免費下載
本文檔的主要內容詳細介紹的是超級單片機工具軟件應用程序合集免費下載包括了:51波特率計算應用程序,超級單片機工具軟件,單片機小精靈。
發表于 04-28 16:24
?33次下載
![實用<b class='flag-5'>單片機工</b>具應用程序合集免費下載](https://file.elecfans.com/web1/M00/90/3B/o4YBAFzFaPiANUFUAABoJFdfF24403.png)
單片機工控實現任務執行管理
前面寫了switch case做任務調度的應用,這邊寫一下如何實現.像一般的RTOS一樣都有一個任務控制塊(TCB)列表來管理所有的任務,所以這里也需要一個結構體來管理動作任務,這里叫做ACB吧.
51單片機工程模板創建方法
本教程將向大家介紹如何使用KEIL C51 軟件以及如何創建51 單片機工程。通過本教程的學習,讓大家創建屬于自己的51 單片機工程模板,為后面學習51 單片機編程做好鋪墊。
發表于 07-15 15:27
?4991次閱讀
![51<b class='flag-5'>單片機工</b>程模板創建方法](https://file1.elecfans.com/web2/M00/8C/D0/wKgaomSySk-AFaCdAAGXF1Qc5cs211.jpg)
評論