|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
請(qǐng)問如何實(shí)現(xiàn)多任務(wù)? |
| 作者:aerol 欄目:單片機(jī) |
在dspic中想并行2個(gè)任務(wù),請(qǐng)問該如何用C實(shí)現(xiàn), 最簡單的結(jié)構(gòu)是什么樣的。謝謝了 |
| 2樓: | >>參與討論 |
| 作者: jiaxun 于 2005/9/9 18:54:00 發(fā)布:
請(qǐng)問如何實(shí)現(xiàn)多任務(wù)? 我以前寫過一段時(shí)間程序,但不是單片機(jī),當(dāng)時(shí)是中斷,單片機(jī)也可以,而且和計(jì)算機(jī)程序一樣可以設(shè)置中斷優(yōu)先級(jí),但具體如何沒寫過,關(guān)注此貼. |
|
| 3樓: | >>參與討論 |
| 作者: eeproom 于 2005/9/9 19:08:00 發(fā)布:
關(guān)注 我實(shí)現(xiàn)了兩個(gè)步進(jìn)電機(jī)在20khz同步運(yùn)行,用的是pic18f872@6MHZ&PLL.使用的中斷方式,現(xiàn)在要用dspic6010實(shí)現(xiàn)兩個(gè)伺服電機(jī)同步,還想使用ucos,就沒撤了。如果不用os,但程序變得十分復(fù)雜,這幾天彷徨著。 如果你的任務(wù)能夠預(yù)計(jì),可以先計(jì)算出同步任務(wù)的驅(qū)動(dòng)列表,再驅(qū)動(dòng)。 |
|
| 4樓: | >>參與討論 |
| 作者: aerol 于 2005/9/9 19:48:00 發(fā)布:
聽起來很復(fù)雜啊 我以前只在68000上用ADA做過多任務(wù),很方便, 但現(xiàn)在在dspic上用C不知道有沒有類似的多任務(wù)結(jié)構(gòu),要是沒有的話還真麻煩 |
|
| 5樓: | >>參與討論 |
| 作者: fineamy 于 2005/9/10 14:14:00 發(fā)布:
好象有這幾個(gè)方法 方案: 1. 時(shí)間片輪回,每個(gè)任務(wù)分一個(gè)時(shí)間片,調(diào)度時(shí)到達(dá)該任務(wù)的時(shí)間片即開始運(yùn)行該任務(wù),達(dá)到并行的目的,這種方案缺點(diǎn)是任務(wù)響應(yīng)的實(shí)時(shí)性與時(shí)間片的大小關(guān)系很大,時(shí)間片大,任務(wù)多時(shí),一些任務(wù)可能會(huì)得不到及時(shí)的響應(yīng).但實(shí)現(xiàn)容易. 2. 任務(wù)間使用信號(hào)量或者消息隊(duì)列或者消息等機(jī)制通訊的發(fā)式,這種發(fā)式建立了任務(wù)間的通訊機(jī)制,一但有任務(wù)滿足了執(zhí)行條件,立刻開使執(zhí)行,實(shí)時(shí)性較好. 3. 任務(wù)間中斷的方式,一旦有中斷進(jìn)行,即刻進(jìn)入一個(gè)任務(wù),實(shí)時(shí)性較高. 實(shí)現(xiàn): 1.任務(wù)的運(yùn)行:每個(gè)任務(wù)即是一個(gè)死循環(huán),該任務(wù)一直運(yùn)行直到有其他任務(wù)到達(dá)運(yùn)行時(shí)間或滿足運(yùn)行條件. 2.任務(wù)的切換:其他任務(wù)到達(dá)運(yùn)行時(shí)間或滿足了運(yùn)行條件,就需要切換到其它任務(wù)中,稱作任務(wù)切換.相反,在其它任務(wù)運(yùn)行中,如果又有任務(wù)滿足執(zhí)行條件,即刻任務(wù)切換. 3.任務(wù)切換的實(shí)現(xiàn): 在此我們先假定任務(wù)間沒有通訊,沒有時(shí)間片的輪回,沒有中斷,一個(gè)任務(wù)僅僅是我們普通的一個(gè)死循環(huán)的函數(shù). 類似于這樣的函數(shù)任務(wù)A:VOID TASK(VOID* P){FOR(;;){...}} 任務(wù)B:VOID TASK(VOID* P){FOR(;;){...}} 在這個(gè)假定下,我們?cè)O(shè)想有兩個(gè)任務(wù)A,B.當(dāng)前正在A中,由于A為死循環(huán),正如我們想象的,它將無止境的運(yùn)行下去,看來這樣任務(wù)B是沒指望得到機(jī)會(huì)運(yùn)行了,怎么辦呢,讓我們一部一部將任務(wù)機(jī)制建立起來吧: A)讓任務(wù)B得到運(yùn)行:我們想到一個(gè)軟中斷可以使一段程序得到運(yùn)行,我們?cè)囋囁?以INTEL80X86CPU為例,一條INT N指令即可以將CPU的控制權(quán)交給中斷象量在4*N地址的程序段,現(xiàn)在我們要做的就是將任務(wù)B程序起始地址放在4*N處,然后在任務(wù)A中假如INT N指令, 現(xiàn)在任務(wù)A變成了這樣VOID TASK(VOID* P){FOR(;;){...;INT N}} 任務(wù)B仍然為: VOID TASK(VOID* P){FOR(;;){...}} B)讓任務(wù)A得到運(yùn)行:現(xiàn)在就實(shí)現(xiàn)了我們的目的,任務(wù)A可以切換到任務(wù)B了,我們終于邁出了一步,編譯,連接,運(yùn)行我們驚奇的發(fā)現(xiàn)當(dāng)任務(wù)A運(yùn)行到INT N時(shí),果然開始了任務(wù)B的運(yùn)行,這樣就實(shí)現(xiàn)了A到B的切換,可是隨之而來我們發(fā)現(xiàn)任務(wù)B原來還是一個(gè)死循環(huán),它無止境的運(yùn)行以至于任務(wù)A被"餓死了",仔細(xì)一看原來是我們忘了也給任務(wù)B一個(gè)INT N了,好,仿照任務(wù)A,我們做類似的處理,這樣他們就變成了下面這樣: 現(xiàn)在任務(wù)A變成了這樣VOID TASK(VOID* P){FOR(;;){...;INT N}} 任務(wù)B仍然為: VOID TASK(VOID* P){FOR(;;){...;INT M}} 編譯,聯(lián)結(jié),運(yùn)行,看看運(yùn)行情況,這個(gè)時(shí)候兩個(gè)任務(wù)果然每次到切換點(diǎn)INT X時(shí)開使互相切換, 到這時(shí),我們已經(jīng)實(shí)現(xiàn)了最簡單的多任務(wù),但是這種方法大家已經(jīng)看到,每個(gè)任務(wù)有一個(gè)中斷號(hào),即N!=M,似乎不是很好,那么下面我們讓它們相等,即試著用一個(gè)中斷號(hào)實(shí)現(xiàn)多任務(wù)的切換. C)任務(wù)內(nèi)容的保存:我們可以想象的到,要使用同一個(gè)中斷號(hào),那么任務(wù)切換前必須預(yù)先將要切換到的任務(wù)的執(zhí)行地址裝入4*N處(以使用中斷號(hào)N為例),怎么實(shí)現(xiàn)呢,當(dāng)然有很多方法,其中比較好的一個(gè)方法就是每個(gè)任務(wù)對(duì)應(yīng)一個(gè)存儲(chǔ)區(qū)(任務(wù)STACK),該任務(wù)的起始地址都有保存于其中(這種方案當(dāng)然不是僅僅為了保存任務(wù)地址而設(shè)),任務(wù)切換前,先訪問該任務(wù)的任務(wù)STACK,取出該任務(wù)執(zhí)行地址裝入4*N處,然后執(zhí)行任務(wù)切換,這樣就達(dá)到了使用一個(gè)中斷號(hào)的效果. 現(xiàn)在任務(wù)A變成了這樣VOID TASK(VOID* P){FOR(;;){...;安裝N;INT N}} 任務(wù)B仍然為: VOID TASK(VOID* P){FOR(;;){...;安裝N;INT N}} 至此,我們已經(jīng)構(gòu)筑了多任務(wù)實(shí)現(xiàn)的一個(gè)機(jī)制, 最后,我們回到前面提到的三個(gè)多任務(wù)實(shí)現(xiàn)的方案: 1.時(shí)間片的實(shí)現(xiàn):其實(shí)就照上面的方法已經(jīng)是最簡單的時(shí)間片實(shí)現(xiàn)了,較復(fù)雜的實(shí)現(xiàn)要結(jié)合任務(wù)通訊機(jī)制來實(shí)現(xiàn). 2.所謂的信號(hào)量(semaphore)其實(shí)就是一個(gè)標(biāo)志位FLAG,消息(MESSAGE)機(jī)制其實(shí)就是一個(gè)指針,消息隊(duì)列(MESSAGE QU是多個(gè)消息組成的一個(gè)隊(duì)列機(jī)制,拿最簡單的信號(hào)量來說,最簡單的通訊機(jī)制你可以這樣: 現(xiàn)在任務(wù)A變成了這樣VOID TASK(VOID* P){FOR(;;){IF(CONDITION )SET FLAG;...;IF(FLAG){安裝N;INT N}}} 任務(wù)B仍然為: VOID TASK(VOID* P){FOR(;;){...IF(CONDITION) SET FLAG;...;IF(FLAG){安裝N;INT N}} 不過,真正的任務(wù)通訊沒有這樣做的,關(guān)于任務(wù)通訊的知識(shí)請(qǐng)看有關(guān)文章, 3.任務(wù)間中斷的方式,就是任務(wù)中產(chǎn)生中段,標(biāo)志某個(gè)事件發(fā)生或條件滿足,然后滿足該條件的任務(wù)得到執(zhí)行.值得注意的是中斷代碼應(yīng)該盡量短小精悍,占時(shí)少. 最基本的多任務(wù)就是這樣的,更加專業(yè)的可以學(xué)習(xí)RTOS.會(huì)有更多收獲. 以上僅是個(gè)人理解,如有不妥之處,還請(qǐng)各位指教. |
|
| 6樓: | >>參與討論 |
| 作者: rad.zhu 于 2005/9/12 9:22:00 發(fā)布:
贊成用消息隊(duì)列的方式 對(duì)DSPIC的結(jié)構(gòu)其實(shí)還沒有吃透,但是個(gè)人認(rèn)為用消息隊(duì)列要簡單些,只需要開個(gè)任務(wù)棧就可以了。 另外,樓主需要并行執(zhí)行的兩個(gè)任務(wù)對(duì)時(shí)間的要求不知道是怎么樣的。 |
|
| 7樓: | >>參與討論 |
| 作者: aerol 于 2005/9/12 16:24:00 發(fā)布:
一個(gè)任務(wù)與PC通訊接收命令,另一個(gè)與其他設(shè)備無線通訊 能講講消息隊(duì)列的結(jié)構(gòu)長得什么樣嗎 |
|
| 8樓: | >>參與討論 |
| 作者: ketp 于 2005/9/12 16:43:00 發(fā)布:
- 隊(duì)列都不懂,還談啥多任務(wù),2件破事用超級(jí)循環(huán)加中斷得了 |
|
| 9樓: | >>參與討論 |
| 作者: aerol 于 2005/9/12 17:17:00 發(fā)布:
不懂才學(xué)啊 目前只有兩個(gè)任務(wù),以后還會(huì)有任務(wù)加進(jìn)來的 |
|
|
|
| 免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |