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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > GNU ARM匯編--(十四)GNU ARM匯編下做任務(wù)調(diào)度

          GNU ARM匯編--(十四)GNU ARM匯編下做任務(wù)調(diào)度

          作者: 時間:2016-11-26 來源:網(wǎng)絡(luò) 收藏
          以前工作中用過arm7,沒有MMU,也沒有用任何OS.現(xiàn)在回憶當(dāng)時的代碼結(jié)構(gòu),我覺得可以叫無限循環(huán)的有限狀態(tài)機(jī).arm7不跑OS,就相當(dāng)于單片機(jī),單片機(jī)跑的肯定是無限死循環(huán).有限狀態(tài)機(jī)是因為整個代碼要處理很多外部的事情,那就是大的循環(huán)里面來套小循環(huán),以輪詢的方式來檢查外界的變化,然后系統(tǒng)作出變化,系統(tǒng)在有限的狀態(tài)中切換.

          OS的一個標(biāo)識就是支持多任務(wù)的并發(fā).比方說linux,我們看起來是多個進(jìn)程在同時運(yùn)行,實際上還是cpu運(yùn)行一下這個進(jìn)程,再運(yùn)行一下其他進(jìn)程.這個就涉及到上下文切換以及進(jìn)程調(diào)度的算法.當(dāng)然我這里說的是單核的情況,如果是SMP的話,可能有些區(qū)別.暫時也沒研究linux下的進(jìn)程調(diào)度,但是通過自己寫個最簡單的任務(wù)調(diào)度可以理解任務(wù)調(diào)度是個什么回事.其實說到底任務(wù)調(diào)度就是那么回事.據(jù)說linux的最初版本,就是兩個任務(wù)在不停的打印AB...

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

          硬件平臺是s3c2440:

          利用RTC的Tick中斷,在中斷處理中進(jìn)行任務(wù)的調(diào)度,調(diào)度算法采用最簡單的輪循.

          其中核心就是中斷的寫法,PCB的建立和任務(wù)調(diào)度中任務(wù)堆棧的保存和恢復(fù):

          調(diào)度的代碼參考《ARM System Developers Guide》一書.

          給出scheduler.S的代碼:

          [cpp]view plaincopy
          1. kernelScheduler:
          2. /*
          3. @---------------------------------------------------
          4. @RoundRobinScheduler
          5. @---------------------------------------------------
          6. */
          7. CurrentTask:
          8. ldrr3,=PCB_CurrentTask
          9. ldrr0,[r3]
          10. ldrr1,=PCB_Table
          11. ldrr1,[r1,r0,LSL#2]
          12. ldrr2,=PCB_PtrCurrentTask
          13. strr1,[r2]
          14. /*
          15. @**PCB_PtrCurrentTask-updatedwiththenewaddress
          16. */
          17. NextTask:
          18. addr0,r0,#1
          19. cmpr0,#3
          20. moveqr0,#0
          21. strr0,[r3]
          22. ldrr1,=PCB_Table
          23. ldrr1,[r1,r0,LSL#2]
          24. ldrr0,=PCB_PtrNextTask
          25. strr1,[r0]
          26. /*
          27. @**PCB_PtrCurrentTask=currentPCB
          28. @**PCB_PtrNextTask=nextPCB
          29. @**PCB_CurrentTask=newTASK_ID
          30. @------------------------------------------------------
          31. @ContextSwitch
          32. @------------------------------------------------------
          33. */
          34. handler_contextswitch:
          35. ldmfdsp!,{r0-r12,r14}
          36. ldrr13,=PCB_PtrCurrentTask
          37. ldrr13,[r13]
          38. subr13,r13,#60
          39. stmiar13,{r0-r14}^
          40. mrsr0,SPSR
          41. stmdbr13,{r0,r14}
          42. ldrr13,=PCB_PtrNextTask
          43. ldrr13,[r13]
          44. subr13,r13,#60
          45. ldmdbr13,{r0,r14}
          46. msrspsr_cxsf,r0
          47. ldmiar13,{r0-r14}^
          48. ldrr13,=PCB_TopOfIRQStack
          49. ldrr13,[r13]
          50. movspc,r14
          51. .end

          一共寫了3個靜態(tài)任務(wù),第一個任務(wù)做一個簡單的算術(shù)運(yùn)算,第二個任務(wù)是一個流水燈,而第三個任務(wù)是利用蜂鳴器來產(chǎn)生旋律.

          僅貼出第三個任務(wù)的代碼:


          上一頁 1 2 下一頁

          關(guān)鍵詞: ARM匯編任務(wù)調(diào)

          評論


          技術(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); })();