音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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ī)
請(qǐng)問如何實(shí)現(xiàn)多任務(wù)?
在dspic中想并行2個(gè)任務(wù),請(qǐng)問該如何用C實(shí)現(xiàn),
最簡單的結(jié)構(gòu)是什么樣的。謝謝了

2樓: >>參與討論
jiaxun
請(qǐng)問如何實(shí)現(xiàn)多任務(wù)?
我以前寫過一段時(shí)間程序,但不是單片機(jī),當(dāng)時(shí)是中斷,單片機(jī)也可以,而且和計(jì)算機(jī)程序一樣可以設(shè)置中斷優(yōu)先級(jí),但具體如何沒寫過,關(guān)注此貼.

3樓: >>參與討論
eeproom
關(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
聽起來很復(fù)雜啊
我以前只在68000上用ADA做過多任務(wù),很方便,
但現(xiàn)在在dspic上用C不知道有沒有類似的多任務(wù)結(jié)構(gòu),要是沒有的話還真麻煩

5樓: >>參與討論
fineamy
好象有這幾個(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
贊成用消息隊(duì)列的方式

對(duì)DSPIC的結(jié)構(gòu)其實(shí)還沒有吃透,但是個(gè)人認(rèn)為用消息隊(duì)列要簡單些,只需要開個(gè)任務(wù)棧就可以了。

另外,樓主需要并行執(zhí)行的兩個(gè)任務(wù)對(duì)時(shí)間的要求不知道是怎么樣的。

7樓: >>參與討論
aerol
一個(gè)任務(wù)與PC通訊接收命令,另一個(gè)與其他設(shè)備無線通訊
能講講消息隊(duì)列的結(jié)構(gòu)長得什么樣嗎

8樓: >>參與討論
ketp
-
隊(duì)列都不懂,還談啥多任務(wù),2件破事用超級(jí)循環(huán)加中斷得了

9樓: >>參與討論
aerol
不懂才學(xué)啊
目前只有兩個(gè)任務(wù),以后還會(huì)有任務(wù)加進(jìn)來的

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
請(qǐng)問_XBSS(N),_YBSS(N)中的N到底是什么用?
發(fā)現(xiàn)PICC致命錯(cuò)誤
哎,雖然說晚了,還是給大家提個(gè)醒,MPLAB711的ICE控制有問題
請(qǐng)問martin:628與628A的差別
使用stimulus要注意
免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)