單片機(jī)的多任務(wù)思考_第1頁(yè)
單片機(jī)的多任務(wù)思考_第2頁(yè)
單片機(jī)的多任務(wù)思考_第3頁(yè)
單片機(jī)的多任務(wù)思考_第4頁(yè)
單片機(jī)的多任務(wù)思考_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

單片機(jī)的多任務(wù)處理思考對(duì)于單片機(jī)這樣一個(gè)非?;A(chǔ)的控制芯片,我們常常用于處理一些針對(duì)性比較強(qiáng)的任務(wù),任務(wù)的性質(zhì)比較簡(jiǎn)單,而且流程是按照順序執(zhí)行的,邏輯上非常直白。下面是單片機(jī)常見(jiàn)的順序執(zhí)行流程開(kāi)始開(kāi)始 執(zhí)行結(jié)果結(jié)果現(xiàn)實(shí)中的情況往往比這要復(fù)雜一些例如,顯示需要定時(shí)刷新,紅外接收器接受數(shù)據(jù)需要立即響應(yīng)并解碼,超聲波的數(shù)據(jù)需要立即分析,這些情況利用中斷端口的實(shí)時(shí)響應(yīng)特性解決,如果端口的數(shù)量比較多,而且要求響應(yīng)時(shí)間比較短,那么程序的結(jié)構(gòu)就不能按照正常的順序執(zhí)行來(lái)設(shè)計(jì)。此時(shí),單片機(jī)的多任務(wù)處理的要求就提出來(lái)了,電腦操作系統(tǒng)中有多線程和多任務(wù)處理的能力,根據(jù)他們的設(shè)計(jì)思路,我們是不是可以設(shè)計(jì)出一個(gè)符合單片機(jī)特性的多任務(wù)的程序結(jié)構(gòu)呢!而且對(duì)于這個(gè)多任務(wù)程序結(jié)構(gòu)中不能太依賴單片機(jī)的特殊資源,原因就是方便程序的移植。在計(jì)算機(jī)的編程中,一個(gè)基本的概念就是同時(shí)對(duì)多個(gè)任務(wù)進(jìn)行控制。許多程序設(shè)計(jì)都要求程序能夠停下手頭的工作,改為處理其他一些問(wèn)題,再返回主程序??梢酝ㄟ^(guò)多種途徑達(dá)到這個(gè)目的。單片機(jī)中是通過(guò)硬件級(jí)的中斷實(shí)現(xiàn)的。盡管這是一種有效的方法,但編出的程序很難移植,這樣就另外一個(gè)問(wèn)題,代價(jià)高昂?jiǎn)栴},如果所有的編程都需要從頭開(kāi)始編寫,盡管這個(gè)問(wèn)題在其他的項(xiàng)目中,也曾遇到過(guò),那么時(shí)間價(jià)值就浪費(fèi)掉了,所以多任務(wù)的一個(gè)基本要求就是不要太依賴硬件給予的特殊資源,其通用性的價(jià)值要體現(xiàn)出來(lái)。好了,現(xiàn)在我們來(lái)看,為了同步完成多項(xiàng)任務(wù),單片機(jī)的實(shí)際運(yùn)行效率就要提上來(lái),基礎(chǔ)單片機(jī)的運(yùn)行速度是1us,通過(guò)提高單片機(jī)的晶振頻率或者采用增強(qiáng)型的單片機(jī)其速度可以更快!而一個(gè)單片機(jī)的所有任務(wù)流程執(zhí)行下來(lái),如果需要5秒以上,那么對(duì)于單片機(jī)的來(lái)說(shuō)是難以接受的,其實(shí)我們仔細(xì)把任務(wù)的流程拋開(kāi)來(lái)看的化,我們會(huì)發(fā)現(xiàn),單片機(jī)的真正執(zhí)行指令的時(shí)間并不長(zhǎng),大部分的時(shí)間都在延時(shí)程序中中空運(yùn)轉(zhuǎn)。如果我們能把延時(shí)的程序,利用起來(lái),做里外一個(gè)工作,那么我們的系統(tǒng)就可以實(shí)現(xiàn)兩個(gè)任務(wù),每個(gè)任務(wù)的如果只需要簡(jiǎn)單的邏輯判斷,沒(méi)有非常耗時(shí)的浮點(diǎn)運(yùn)算(其實(shí)這也不是單片機(jī)的強(qiáng)項(xiàng))那么我是不是可以多執(zhí)行兩個(gè)任務(wù)或者N個(gè)任務(wù)。我就是我想到的簡(jiǎn)單的思路。任務(wù)一我們現(xiàn)在根據(jù)單片機(jī)的特點(diǎn),好好的排布一下。我們把任務(wù)的性質(zhì)劃分一下,如果任務(wù)之間是并列關(guān)系,我們可以稱之為弱相關(guān),如果任務(wù)之間是順序執(zhí)行關(guān)系,我們稱之為強(qiáng)相關(guān),即對(duì)應(yīng)電路的并聯(lián)和串聯(lián)關(guān)系。任務(wù)一任務(wù)二任務(wù)二1.1.串聯(lián)執(zhí)行任務(wù)二任務(wù)一任務(wù)二任務(wù)一2.2.并列關(guān)系每個(gè)任務(wù)都是有步驟的進(jìn)行,無(wú)非是步驟之間的多少不同而已!每個(gè)任務(wù)都劃分好相應(yīng)的時(shí)間片段,什么時(shí)候執(zhí)行,什么條件執(zhí)行,都有嚴(yán)格的規(guī)定,時(shí)間的計(jì)數(shù)交給定時(shí)器來(lái)完成。如何劃分步驟?1.第一點(diǎn)根據(jù)任務(wù)要求的響應(yīng)時(shí)間2.第二點(diǎn)根據(jù)周期執(zhí)行時(shí)間來(lái)確定 如果第一個(gè)任務(wù)完整的流程執(zhí)行時(shí)間在1.5ms,而另外一個(gè)任務(wù)針對(duì)外部條件的變化,系統(tǒng)要求在1ms內(nèi)做出響應(yīng),那么第一個(gè)任務(wù)的流程應(yīng)該分為兩個(gè)步驟完成,這樣劃分時(shí)間片段才能符合系統(tǒng)的時(shí)間響應(yīng)要求。超聲波數(shù)據(jù)分析和處理YNYN接受到紅外數(shù)據(jù)?接受到紅外數(shù)據(jù)?紅外數(shù)據(jù)分析和處理 如果是任務(wù)之間是并列的關(guān)系使用順序訪問(wèn)是否符合執(zhí)行條件。例如超聲波的數(shù)據(jù)處理和紅外數(shù)據(jù)的處理,兩者之間沒(méi)有直接的關(guān)聯(lián),我們稱之為若相關(guān),我們使用下面的流程來(lái)處理超聲波數(shù)據(jù)分析和處理YNYN接受到紅外數(shù)據(jù)?接受到紅外數(shù)據(jù)?紅外數(shù)據(jù)分析和處理如果任務(wù)之間是串聯(lián)的關(guān)系使用尋址方式,或者稱為任務(wù)調(diào)度器來(lái)進(jìn)行訪問(wèn)步驟調(diào)度指針步驟調(diào)度指針(地址)步驟5步驟4步驟步驟5步驟4步驟3步驟2步驟1下面貼一段代碼吧,項(xiàng)目中的一部分僅供參考簡(jiǎn)單說(shuō)明一下,用定時(shí)器做延時(shí)的技術(shù)參考,設(shè)置一個(gè)標(biāo)志位做索引,延時(shí)時(shí)間到了,滿足條件,步驟指針指向下一步!如果條件不滿足,把當(dāng)前指針壓入數(shù)組做成的偽堆棧,同時(shí)給與指針一個(gè)空向值,如果滿足條件,則把壓入堆棧的數(shù)值推送給指針。對(duì)于按鍵的延時(shí)檢測(cè),可能用到菜單的切換,每個(gè)菜單的界面需要做成一個(gè)任務(wù),需用時(shí)直接當(dāng)成任務(wù)對(duì)象調(diào)用即可。voidmain(void){ bitflag_work=0; bitflag_error_work=0; bitflag_error_pipe_jam=0; hard_ini(); serial_one_initial(); Pm_step=0; while(1) { // get_result_volt_value(); switch(Pm_step) { case0: if(!water_positionL&&!water_positionH)//高位 water_position_light=1; else water_position_light=0; flag_work=open_or_close();//開(kāi)機(jī)之后,關(guān)掉參數(shù)設(shè)置殘留的顯示和變量數(shù)據(jù)值 Pm_step=1; if(flag_work) { flag_error_work=0; //現(xiàn)在的問(wèn)題是加電之后,電流不進(jìn)行檢測(cè) key_back=0; key_shift=0; flag_setup=0; flag_time=0;//清掉按鍵設(shè)置的參數(shù) Pr_step=0; Pm_step=3; flag_current_enable=0; } break; case1: key_command();//此處放上按鍵操作,按鍵主要用于設(shè)置各部件的參數(shù) Pm_step=2; if(flag_setup||flag_time) Pm_step=0; break; case2: display_buffer[0]=0x50; display_buffer[1]=0x79; display_buffer[2]=0x5e; display_buffer[3]=0x66; Pm_step=0; break; case3: normal_work_ini(); //key_command1(); Pm_step=4; if(Pr_step==0xaa) { Pw_step=7; Pm_step=6; Pp_step=0; flag_pipe_fail=0;//為壓力檢測(cè)做準(zhǔn)備 flag_current_pump2_start=0; } break; case4: flag_work=open_or_close(); Pm_step=5; if(!flag_work) { Pm_step=0; //關(guān)機(jī)之后,要注意清掉正在運(yùn)行的事件 display_buffer[0]=0; display_buffer[1]=0; display_buffer[2]=0; display_buffer[3]=0; display_buffer[4]=0; display_buffer[5]=0; display_buffer[6]=0; display_buffer[7]=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_main_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; case5: get_result_volt_value(); if(!flag_error_work) flag_error_work=sys_detection_initial(); Pm_step=3; if(flag_error_work) Pm_step=4; break; case6: normal_work(); Pm_step=7; break; case7: //工作中的操作,要從錯(cuò)誤顯示里面進(jìn)行奪權(quán) key_command1(); //解決平時(shí)顯示溫度值,操作是電壓電流值 Pm_step=8; //出錯(cuò)誤時(shí),顯示錯(cuò)誤內(nèi)容 break; case8: flag_work=open_or_close(); Pm_step=9; if(!flag_work) { Pm_step=0; display_work_count=0; //關(guān)機(jī)之后,要注意清掉正在運(yùn)行的事件 display_buffer[0]=0; display_buffer[1]=0; display_buffer[2]=0; display_buffer[3]=0; display_buffer[4]=0; display_buffer[5]=0; display_buffer[6]=0; display_buffer[7]=0; flag_water_pump2_open_start=0; flag_water_pump2_open_end=0; flag_water_pump1_open_start=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; flag_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=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; case9: 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; case10: if(!flag_pipe_fail) { f

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論