<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 一個搶先式“裸奔“系統(tǒng)的設(shè)計

          一個搶先式“裸奔“系統(tǒng)的設(shè)計

          作者: 時間:2012-12-16 來源:網(wǎng)絡(luò) 收藏

          5 程序運(yùn)行流程
          程序初始化流程圖如圖1所示。

          本文引用地址:http://www.ex-cimer.com/article/148178.htm

          g.JPG


          首先,main()在完成硬件初始化Sys_init()后,調(diào)用I2c_svr()總線通信服務(wù)程序。
          I2c_svr()服務(wù)程序里,首先完成類似通用RTOS的任務(wù)現(xiàn)場保護(hù)的過程。再通過切換堆棧指針,完成了新任務(wù)堆棧的初始化過程。然后進(jìn)入I2C總線通信模塊主循環(huán)(類似創(chuàng)建任務(wù)的操作),再通過調(diào)用idelay(),將CPU的控制權(quán)交還給main()。奧妙就在于idelay()首先保存通信程序的寄存器現(xiàn)場(ACC和PSW),然后轉(zhuǎn)換到main()的堆??臻g,并恢復(fù)剛才被I2c_svr()保存的寄存器現(xiàn)場(ACC和PSW)。所以;i2c_svr()里的idelay()函數(shù)返回后將不執(zhí)行其下面的i2write(),而是執(zhí)行main()里的while(1)。
          i2write()又如何能得到執(zhí)行呢?它是通過定時中斷服務(wù)程序timer1()再次獲得CPU控制權(quán)的。如果在main()的執(zhí)行中發(fā)生timer1()中斷,因為timer1()里也進(jìn)行與idelay()類似的任務(wù)切換操作,這時候?qū)⑶袚Q到I2c_svr()的堆棧和寄存器(現(xiàn)場)。此時timer1()中斷返回時,不會返回到main()里,而是執(zhí)行i2write()。
          另外,函數(shù)i2write()內(nèi)部執(zhí)行中也會調(diào)用idelay(),在I2c_svr()中的每次調(diào)用idelay()都會將CPU控制權(quán)交給main()的切換。main()和I2c_svr()的切換關(guān)系如圖2所示。

          h.JPG


          當(dāng)然,timer1()并不總是引起任務(wù)的切換,通過判斷bi2csvr標(biāo)志可以避免(在不需要數(shù)據(jù)傳輸時)不必要的任務(wù)切換。另外,timer1()也可能進(jìn)行從I2c_svr()到main()的切換。所以即使I2c_svr()里很長時間沒有調(diào)用idelay(),也不會阻塞main()的執(zhí)行。
          切換現(xiàn)場一般基于80C51的RTOS,通常要保存所有的CPU寄存器(包括8個工作寄存器、ACC、PSW、B、DPTR等),而這里與它們不同,因為在筆者的通信服務(wù)模塊I2c_svr()中使用了另外的寄存器組,且未使用B和DPTR,因此不需要保存8個工作寄存器及B和DPTR,僅保存和恢復(fù)PSW和ACC這兩個寄存器就可以了,大大提高了切換效率。
          本系統(tǒng)里僅有兩個“任務(wù)”,即main()和I2c_svr(),也沒有固定優(yōu)先級,處于“等待”狀態(tài)任務(wù)的優(yōu)先級總比當(dāng)前運(yùn)行中的任務(wù)高,所以相當(dāng)于同優(yōu)先級時間片輪轉(zhuǎn)調(diào)度方式。但相對于RTOS,這里還缺少操作系統(tǒng)必須管理的與任務(wù)相關(guān)的狀態(tài)和數(shù)據(jù)結(jié)構(gòu),所以筆者還將其稱做“裸奔”系統(tǒng)。

          6 現(xiàn)場保護(hù)的補(bǔ)充說明
          任務(wù)切換中的寄存器現(xiàn)場保護(hù)代碼如下:
          i.JPG
          j.JPG
          上面是Keil C51對定時中斷服務(wù)函數(shù)timer1()編譯生成的LST文件。編譯器在中斷服務(wù)里自動生成壓棧和出棧寄存器的指令,所以在寫idelay()函數(shù)的寄存器現(xiàn)場切換的時候,必須完全遵守這個寄存器壓棧和出棧順序規(guī)則才能正常工作。

          結(jié)語
          通過學(xué)習(xí)和借鑒RTOS的CPU時間搶先調(diào)度和分配方法,可以將本系統(tǒng)中總線時序里許多很短的延時都交給主程序使用,最大程度利用CPU時間,實現(xiàn)主程序和通信服務(wù)程序的并行執(zhí)行,從而讓主程序和通信服務(wù)程序均達(dá)到系統(tǒng)要求的實時性能。
          本文為時間緊張的系統(tǒng)設(shè)計提供了一個新的解決思路。應(yīng)該有助于初學(xué)操作系統(tǒng)的讀者理解操作系統(tǒng)任務(wù)切換的工作機(jī)理。


          上一頁 1 2 3 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();