周首杰,李 灣,明 瑞,周 賢,明興祖,
(1.湖南汽車工程職業學院,湖南 株洲 412000;2.湖南工業大學機械工程學院,湖南 株洲412007;3.湖北文理學院機械工程學院,湖北 襄陽 441053)
嵌入式控制應用已深入到了每一種智能控制中,特別是隨著芯片性能的提高,嵌入式產品也越來越智能化,人性化[1]。嵌入式控制通常有順序結構、多任務等控制方式[2]。順序結構控制適用于簡單、沒有多任務同時執行控制的情況[3]。多任務控制能同時處理多個任務,高檔的嵌入式多任務系統有操作系統來做支撐,如手機就有安卓、蘋果等操作系統支撐,由操作系統來進行多任務管理。在工業控制中,趙俊囡等[4]研究和設計了一種基于XC2785 單片機和嵌入式實時操作系統的汽車運行參數記錄儀方案。采用嵌入式實時多任務操作系統可以提高系統效率、實時性及可靠性,但由于商業嵌入式實時多任務操作系統版權費高,特別是單片機嵌入式系統資源有限,對開發人員技術能力的要求較高,限制了嵌入式操作系統的應用[3,5]。
在工業產品控制中,還有一部分嵌入式系統是沒有操作系統來支撐的,其開發應用針對性和靈活性強。劉燚榮[2]、趙飛等[3]利用通用型嵌入式系統軟件框架,構建一個實時多任務控制機制,提供一套軟件定時器,實現了電力設備智能傳感器軟件快速開發。但這樣的多任務實時處理要由軟件設計工程師來完成多任務的管理,因此產生了相當大的難度[6]。本文在分析嵌入式控制中順序結構控制流程與特性的基礎上,根據小車多任務智能控制處理要求,提出了單片機多任務控制的方法與設計應用。
在嵌入式控制中,最簡單的就是順序結構,即一個任務接一個任務地完成,在完成了一個任務后再繼續完成另外一個任務。如圖1所示為智能小車行進路線圖,一輛智能小車,沿著粗實線往前走,要求在十字路口需自動往右拐彎。

圖1 智能小車行進路線
在圖1中,起始時刻給小車發出一個向前行駛的命令,由底層驅動機構執行小車前行,同時小車需不停檢測是否到了十字路口,小車主控CPU執行檢測任務。當檢測到了十字路口,小車主控CPU再向底層驅動機構發出停止命令,以完成該第1個任務。接著再準備第2個任務,向底層驅動機構發出右轉90°命令。第2個任務完成后,再進行第3個任務,即檢測右轉90°是否到位,如檢測右轉到位,第3個任務完成,接著是下一個任務,如此運行下去,直到整個任務執行完畢。小車前進右轉的順序結構程序流程如圖2所示。

圖2 小車前進右轉的順序結構程序流程
在順序結構程序控制的運行過程中,主控CPU發出前進命令,小車前進,同時主控CPU不停地等待檢測是否到達了十字路口。同理主控CPU發出右轉指令后,主控CPU也是在等待中檢測右轉到位信息。但由于是順序結構,上一個任務沒完成時,下一個任務是不能開啟的;只有在上一個任務完成后,下一個任務才會開始。
順序結構控制是按工作流程一個接一個往下順序執行。在圖1嵌入式控制中,由于小車按照相應的路線依次完成每一個任務,中間不會穿插別的任務,不能加入人為控制命令,也不需要由主控CPU來控制顯示其他信息等,采用順序結構可以很好地完成控制,小車能自動完成所有任務,因此順序結構適用于簡單、沒有多任務同時執行控制的情況[7]。
CPU的PC指針控制。程序的執行是由CPU中的PC指針來控制的,PC指針決定著程序的執行過程。CPU當前要執行某條命令是由PC指針來指向該命令語句的所在地址。在1片CPU中只有1個PC指針,在一時刻點CPU只能運行1條語句[8]。任務由多條語句組成,所以任務也只能是一個一個地完成,不可能同時運行2個及以上任務。當執行中斷時,也是CPU停止運行現在的任務,轉而由PC指針轉向中斷服務程序地址,執行PC指針所指的中斷服務任務[9]。因此一個時刻是只能運行一條語句,一段時間內只能完成一個任務。
隨著單片機運行速度的提升,單片機在嵌入式多任務智能控制中應用廣泛。例如單片機運行一條語句的速度可以用ns計,那么由幾十條甚至上千條語句所組成的一個完整的任務,單片機也只要幾個μs就可以完成[10]。如果沒有延時等待等過程,那么單片機運行完由多個任務所組成的系統也只要幾十ms,甚至更短的時間。ms級別的時間長度,實際應用中無法感知出來。實質上單片機執行任務還是有先后順序的,可以非??斓靥幚矶鄠€任務,能夠在極短時間檢測到輸入信息,并根據輸入信息來完成相關任務,這也體現了單片機的實時處理功能。嵌入式多任務單片機控制就是按該思路進行設計和應用。
在多任務執行過程中,單片機的運行速度關鍵。如果單片機的速度太慢,是無法做到多任務同時完成,實時處理的。現在的單片機運行速度都比較快,所以這一點在一般情況下不存在了。如果有單個的任務確實數據量很大,也可以選用更高級、速度更快的單片機;或者可以采用專用的大數據處理芯片來完成數據處理。設計人員在編程時要特別注意程序的運行速度,優化程序編寫。在完成一個任務時,如果編程者使用了大量的延時等待程序,讓CPU延時等待當前任務的完成,那么完成一個任務就需要較長時間,就不能感覺是同時處理多個任務;或者感覺到運行速度太慢,經常出現任務執行被卡住等現象,也可能造成有些任務根本無法完成[11]。因此,要合理設計延時等待程序的編寫。
單片機運行速度越快,任務完成的實時性也越好。每個任務的執行時間短,所有任務執行的時間也越短,人們感覺就是所有任務都是在同一時間段內同時完成。
每個任務的執行是要占用一定時間的。如果在每一輪程序運行循環中,每個任務都去執行一次,那是沒有必要的[12]。例如按鍵檢測任務,數碼管顯示任務等。按鍵可以快速按下去,再松開,整個過程可快到100 ms之內完成,但與CPU的運行速度相比是極慢的。所以按鍵檢測是可以用定時方式去檢測,例如在50 ms檢測1次就足夠了。數碼管顯示也是如此,由于人的視覺暫留,對每一張圖片是有100 ms時間保留在腦海中,也稱人類的視覺暫留功能,因此對數碼管可100 ms刷新1次;為防畫面閃爍,也可以是50 ms刷新1次。對如圖1中的小車行進是否到達十字交叉口的檢測,可以采用定時檢測的方式進行。由于小車的行駛速度較慢,可以是幾十ms檢測1次。
另外對于一些緊急的、重要的任務,還可采用優先等級的方式進行處理,比如按中斷服務程序中的優先等級制處理。
對于圖1的智能小車行進控制,小車在前進過程中,要求進行行進速度的顯示。采用2個數碼管來顯示小車的行進速度,設計的數碼管顯示小車速度電路原理如圖3所示。

圖3 數碼管顯示小車速度電路原理
從圖3中可以看出,2個數碼管是不可能同時顯示的,一次只能有一個數碼管點亮,須以很快的速度來對每個數碼管進行刷新,即2個數碼管顯示對應的2個任務要快速執行。同時,主控CPU還要不停地檢測小車是否到達十字路口,這又是另一個任務。主控CPU還有可能要接收通過WIFI組件發送過來的信息;同時也還要檢測按鍵等,所以此控制就有多個任務要求同時運行。
采用定時中斷來進行定時,可將定時器1設置成1 ms中斷1次,這樣就定了一個時間標準。如果要定時50 ms,那么就設置一個計數變量,在定時器中斷服務程序中進行計數,當計數50次后就是定時達到50 ms,設計的定時器中斷服務程序流程如圖4所示。

圖4 定時器中斷服務程序流程
在主程序中執行各任務,由于有了定時器定時,所以各任務就可在規定時間下分時執行。設計的多任務控制主程序流程如圖5所示。

圖5 多任務控制主程序流程
從圖5可以看到:每個任務的執行在主程序中不是每一次循環都執行,而是要等到相應的時間到了,輪到實施該任務時才執行;任務的執行按其性質不同,可根據經驗或者現場情況進行時間分配,有些任務可以執行次數少,而有些任務必須執行次數多,例如檢測是否到十字路口的程序,是每10 ms就運行1次,而顯示程序為了視覺舒服,需加快數碼管刷新速度,每30 ms刷新1個數碼管,而按鍵檢測程序在每50 ms檢測1次,使其程序少運行,以加快單片機的運行速度;對于特別重要的任務,或者是運行時間特別短的任務,也可以直接采取優先等級中斷服務程序的處理方式進行執行。
根據圖1的智能小車行進路線以及標志物,要求競賽小車在接到啟動命令后,須完全在自動模式下完成所有進程,設計的嵌入式單片機智能控制系統由STM32F103主控芯片和驅動芯片以及電機組成驅動系統,由安裝于小車前邊的傳感器和另一片STM32F103芯片組成路面檢測系統向主STM32F103發送信息。通過試驗得到該系統主要性能參數為:主頻設置為72 MHz,一條單周期指令運行時間為1/72 μs;完成一個到達十字交叉口的檢測任務信息,根據波特率設置成11 520,通信設置成9位二進制每幀,致使檢測一條信息不到0.1 ms,發送一個轉彎命令也不到0.1 ms;顯示任務時間更短,完成1個數碼管顯示只需要1 μs以內。該系統測試中,按鍵發出啟動命令,完成小車行進、在點檢測、轉彎命令等進程,并完成雙數碼管分段分時顯示行進速度任務。
在嵌入式的單片機智能控制中,通常有順序結構控制和多任務控制等方式,均需由單片機PC指針來控制程序每一個語句命令的執行,以及每一個任務的完成。順序結構控制下,通過分析其程序流程、控制特性,得出適用于控制簡單、沒有多任務同時執行控制的情況。根據多任務控制的需要,為實現感覺和視覺、實時性等應用問題,通過單片機運行速度對多任務控制的影響分析、多任務管理等研究,結合智能控制設計應用,采用運行速度高的單片機主程序進行合理的任務與等級安排、時間控制和優化編制延時等待程序,運用適合的定時檢測方式,以及優先等級制中斷服務程序處理,解決了智能小車嵌入式智能控制應用中多任務同時運行、實時執行的技術問題。