單片機的多任務思考(共8頁)_第1頁
單片機的多任務思考(共8頁)_第2頁
單片機的多任務思考(共8頁)_第3頁
單片機的多任務思考(共8頁)_第4頁
單片機的多任務思考(共8頁)_第5頁
已閱讀5頁,還剩5頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、單片機的多任務處理思考(sko)對于單片機這樣一個非常基礎的控制芯片,我們常常用于處理一些針對性比較強的任務,任務的性質比較簡單,而且(r qi)流程是按照順序執行的,邏輯上非常直白。下面(xi mian)是單片機常見的順序執行流程開始執行結果現實中的情況往往比這要復雜一些例如,顯示需要定時刷新,紅外接收器接受數據需要立即響應并解碼,超聲波的數據需要立即分析,這些情況利用中斷端口的實時響應特性解決,如果端口的數量比較多,而且要求響應時間比較短,那么程序的結構就不能按照正常的順序執行來設計。此時,單片機的多任務處理的要求就提出來了,電腦操作系統中有多線程和多任務處理的能力,根據他們的設計思路,我

2、們是不是可以設計出一個符合單片機特性的多任務的程序結構呢!而且對于這個多任務程序結構中不能太依賴單片機的特殊資源,原因就是方便程序的移植。在計算機的編程中,一個基本的概念就是同時對多個任務進行控制。許多程序設計都要求程序能夠停下手頭的工作,改為處理其他一些問題,再返回主程序。可以通過多種途徑達到這個目的。單片機中是通過硬件級的中斷實現的。盡管這是一種有效的方法,但編出的程序很難移植,這樣就另外一個問題,代價高昂問題,如果所有的編程都需要從頭開始編寫,盡管這個問題在其他的項目中,也曾遇到過,那么時間價值就浪費掉了,所以多任務的一個基本要求就是不要太依賴硬件給予的特殊資源,其通用性的價值要體現出來

3、。好了,現在我們來看,為了同步完成多項任務,單片機的實際運行效率就要提上來,基礎單片機的運行速度是1us,通過提高單片機的晶振頻率或者采用增強型的單片機其速度可以更快!而一個單片機的所有任務流程執行下來,如果需要5秒以上,那么對于單片機的來說是難以接受的,其實我們仔細把任務的流程拋開來看的化,我們會發現,單片機的真正執行指令的時間并不長,大部分的時間都在延時程序中中空運轉。如果我們能把延時的程序,利用起來,做里外一個工作,那么我們的系統就可以實現兩個任務,每個任務的如果只需要簡單的邏輯判斷,沒有非常耗時的浮點運算(其實這也不是單片機的強項)那么我是不是可以多執行兩個任務或者N個任務。我就是我想

4、到的簡單的思路。任務一我們現在根據單片機的特點,好好的排布一下。我們把任務的性質劃分一下,如果任務之間是并列關系,我們可以稱之為弱相關,如果任務之間是順序執行關系,我們稱之為強相關,即對應電路的并聯和串聯關系。任務二1.串聯執行任務二任務一2.并列關系每個任務都是有步驟的進行(jnxng),無非是步驟之間的多少不同而已!每個任務都劃分好相應的時間片段,什么時候(sh hou)執行,什么條件執行,都有嚴格的規定(gudng),時間的計數交給定時器來完成。如何劃分步驟?1.第一點根據任務要求的響應時間2.第二點根據周期執行時間來確定如果第一個任務完整的流程執行時間在1.5ms,而另外一個任務針對外

5、部條件的變化,系統要求在1ms內做出響應,那么第一個任務的流程應該分為兩個步驟完成,這樣劃分時間片段才能符合系統的時間響應要求。超聲波數據分析和處理YNYN接受到紅外數據?接受到紅外數據?紅外數據分析和處理如果是任務之間是并列的關系使用順序訪問是否符合執行條件。例如超聲波的數據處理和紅外數據的處理,兩者之間沒有直接的關聯,我們稱之為若相關,我們使用下面的流程來處理如果任務之間是串聯的關系使用尋址方式,或者稱為任務調度器來進行訪問步驟調度指針(地址)步驟5步驟4步驟3步驟2步驟1下面(xi mian)貼一段代碼吧,項目(xingm)中的一部分僅供參考簡單說明一下,用定時器做延時的技術參考,設置一

6、個標志位做索引,延時時間到了,滿足條件,步驟指針指向下一步(y b)!如果條件不滿足,把當前指針壓入數組做成的偽堆棧,同時給與指針一個空向值,如果滿足條件,則把壓入堆棧的數值推送給指針。對于按鍵的延時檢測,可能用到菜單的切換,每個菜單的界面需要做成一個任務,需用時直接當成任務對象調用即可。void main(void)bit flag_work=0; bit flag_error_work=0;bit flag_error_pipe_jam=0;hard_ini();serial_one_initial();Pm_step=0;while(1)/get_result_volt_value();

7、switch(Pm_step)case 0:if(!water_positionL&!water_positionH)/高位water_position_light=1;elsewater_position_light=0;flag_work=open_or_close();/開機之后,關掉參數設置殘留的顯示和變量數據值Pm_step=1; if(flag_work)flag_error_work=0; /現在的問題(wnt)是加電之后,電流不進行檢測key_back=0;key_shift=0;flag_setup=0;flag_time=0;/清掉按鍵(n jin)設置的參數Pr_step

8、=0;Pm_step=3;flag_current_enable=0;break;case 1:key_command();/此處放上按鍵操作,按鍵主要用于設置各部件(bjin)的參數Pm_step=2;if(flag_setup|flag_time)Pm_step=0;break;case 2:display_buffer0=0 x50;display_buffer1=0 x79;display_buffer2=0 x5e;display_buffer3=0 x66;Pm_step=0;break;case 3:normal_work_ini();/key_command1();Pm_ste

9、p=4;if(Pr_step=0 xaa)Pw_step=7;Pm_step=6;Pp_step=0;flag_pipe_fail=0;/為壓力檢測做準備flag_current_pump2_start=0;break;case 4:flag_work=open_or_close();Pm_step=5;if(!flag_work)Pm_step=0; /關機之后(zhhu),要注意清掉正在運行的事件display_buffer0=0;display_buffer1=0;display_buffer2=0;display_buffer3=0;display_buffer4=0;display_

10、buffer5=0;display_buffer6=0;display_buffer7=0;flag_draught_open_start=0;flag_draught_open_end=0;flag_draught_close_start=0;flag_draught_close_end=0;flag_fire_open_start=0;flag_fire_open_end=0;flag_fire_close_start=0;flag_fire_close_end=0;flag_main_valve_open_start=0;flag_main_valve_open_end=0;flag_m

11、ain_valve_close_start=0;flag_main_valve_close_end=0;flag_fire_fail_start=0;flag_fire_fail_end=0;fail_count=0;temp_draught_open=0;temp_draught_close=0;temp_fire_open=0;temp_fire_close=0;temp_main_valve_open=0;temp_main_valve_close=0;temp_fire_fail=0;flag_current_pump2_start=0;break;case 5:get_result_

12、volt_value();if(!flag_error_work)flag_error_work=sys_detection_initial();Pm_step=3;if(flag_error_work)Pm_step=4;break;case 6:normal_work();Pm_step=7;break;case 7: /工作中的操作,要從錯誤(cuw)顯示里面進行奪權key_command1(); /解決平時(pngsh)顯示溫度值,操作是電壓電流值Pm_step=8; /出錯誤時,顯示(xinsh)錯誤內容break;case 8:flag_work=open_or_close();P

13、m_step=9;if(!flag_work)Pm_step=0;display_work_count=0; /關機之后,要注意清掉正在運行的事件display_buffer0=0;display_buffer1=0;display_buffer2=0;display_buffer3=0;display_buffer4=0;display_buffer5=0;display_buffer6=0;display_buffer7=0;flag_water_pump2_open_start=0;flag_water_pump2_open_end=0;flag_water_pump1_open_sta

14、rt=0;flag_water_pump1_open_end=0;flag_subordination_valve_open_start=0;flag_subordination_valve_open_end=0;temp_water_pump2_open=0;temp_water_pump2_close=0;temp_water_pump1_open=0;temp_water_pump1_close=0;temp_subordination_valve_open=0;temp_subordination_valve_close=0;Pp_step=0;pipe_fail_count=0;fl

15、ag_pipe_water_pump1_open_start=0;flag_pipe_water_pump1_open_end=0;flag_pipe_water_pump1_close_start=0;flag_pipe_water_pump1_close_end=0;flag_pipe_water_pump2_open_start=0;flag_pipe_water_pump2_open_end=0;flag_pipe_water_pump2_close_start=0;flag_pipe_water_pump2_close_end=0;temp_pipe_water_pump1_open

16、=0;temp_pipe_water_pump1_close=0;temp_pipe_water_pump2_open=0;temp_pipe_water_pump2_close=0;flag_current_pump2_start=0;break;case 9:get_result_volt_value();if(!flag_error_work)flag_error_work=sys_detection_work();Pm_step=10;if(flag_error_work)Pm_step=8;break;case 10:if(!flag_pipe_fail)flag_error_pipe_jam=pipe_jam_detection();if(flag_error_pipe_jam)Pm_step=8;/如果有壓力錯誤那么立即轉入等待待機和檢測(jin c)的工作部分elsePm_step=6;/如果途中(t zhn)壓力錯誤消失,進入正常工作狀態elsePm_step=8;/錯誤(cuw)不可挽回的時候,只能

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論