先看一個沒有做任務調度的XY軸復位的程序A:
//XY軸復位
unsigned int XYReset(unsigned char reset)
{
static unsigned char operation = STEP1;
static unsigned int baseTime;
if(reset == TRUE)
{
operation = STEP1;
}
switch(operation){
case STEP1:
sm_run(SM101,3200); //步進電機SM101運動3200步
operation = STEP2;
break;
case STEP2:
if(sm_state[SM101]==SM_STOP)
{ //3200步運動完成
baseTime = systemTime; //開始延時
operation = STEP3;
}
break;
case STEP3:
if(Timer(baseTime,500)==TRUE)
{ //延時500ms完成
sm_run(SM102,3200); //步進電機SM102運動3200步
operation = STEP4;
}
break;
case STEP4:
if(IsSensorOn(X101))
{
sm_stop(SM102);
return TRUE;
}
else if(sm_state[SM102] == SM_STOP)
{
return -2; //動作報錯
}
break;
default:break;
}
return 0; //動作正在運行
}
下面增加任務調度的XY軸復位的程序B:
//XY軸復位
void XYReset()
{
switch(GetStep())
{
case STEP1:
sm_run(SM101,3200);
wait_sm_stop(SM101,STEP2);//任務切換,讓出當前的運行權限,直到SM101電機停止后切換回來
break;
case STEP2:
wait_time(500,STEP3);//任務切換 500ms后切換回來
break;
STEP3:
find_sensor(SM102,3200,X101,STEP4,STEP_ERROR);//任務切換,傳感器感應 電機停止后回來
break;
STEP4:
set_ation_ok(); //正確結束當前的動作任務,退出就緒隊列
break;
STEP_ERROR:
set_error("SM102電機丟步");//錯誤結束當前動作任務,退出就緒隊列
break;
}
}
程序A和程序B的共同點:
- 都有耗時操作:電機運動,等待傳感器狀態變化,延時等。
- 使用switch case做狀態轉換
- 都是非阻塞,沒有死等卡在當前的函數,系統其它函數也可以運行.
程序A程序B的不同點:
- 程序A的局部變量多,程序B要簡短,代碼行數只有程序A的56%
- 程序B的電機狀態 傳感器狀態 時間狀態都是系統管理查詢的,極大的提高了代碼的復用,因為一個項目一般都有幾十個動作動作函數.
- 程序B沒有if else都是函數調用,邏輯清晰,更接近自然表達.
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
傳感器
+關注
關注
2548文章
50740瀏覽量
752137 -
單片機
+關注
關注
6032文章
44525瀏覽量
633242 -
電機
+關注
關注
142文章
8940瀏覽量
145132 -
代碼
+關注
關注
30文章
4753瀏覽量
68367
發布評論請先 登錄
相關推薦
單片機工控板
,指示燈,計數器,撥碼開關)如果用PLC成本太高,即使時最入門的也不是太合算,而且還需要自備24V開關電源,對配線也是個難題,就有這個一個想法,可對單片機了解甚少,還望對如上所列給予指點1.能否實現2.開發這個通用的班子費用和周期3.有意向合作開發的mail至:leon51717@163.com
發表于 03-18 14:31
實用單片機工具應用程序合集免費下載
本文檔的主要內容詳細介紹的是超級單片機工具軟件應用程序合集免費下載包括了:51波特率計算應用程序,超級單片機工具軟件,單片機小精靈。
發表于 04-28 16:24
?33次下載
單片機工控實現任務執行管理
前面寫了switch case做任務調度的應用,這邊寫一下如何實現.像一般的RTOS一樣都有一個任務控制塊(TCB)列表來管理所有的任務,所以這里也需要一個結構體來管理動作任務,這里叫做ACB吧.
單片機工控事件
單片機工控通常有延時,電機狀態,傳感器狀態等通用耗時操作,業務程序查詢這些狀態,就會產生大量的冗余代碼,不簡潔.使用事件則是把這些通用操作丟給系統去處理,系統操作完成后,則運行業務程序的下一個Step.
51單片機工程模板創建方法
本教程將向大家介紹如何使用KEIL C51 軟件以及如何創建51 單片機工程。通過本教程的學習,讓大家創建屬于自己的51 單片機工程模板,為后面學習51 單片機編程做好鋪墊。
發表于 07-15 15:27
?4764次閱讀
評論