<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

本文引用地址:http://dyxdggzs.com/article/201611/321717.htm

硬件平臺是s3c2440:

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

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

調度的代碼參考《ARM System Developers Guide》一書(shū).

給出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

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

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


上一頁(yè) 1 2 下一頁(yè)

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

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>