新聞中心

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

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

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

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

本文引用地址:http://www.2s4d.com/article/201611/321717.htm

硬件平臺是s3c2440:

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

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

調(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)任務,第一個任務做一個簡單的算術運算,第二個任務是一個流水燈,而第三個任務是利用蜂鳴器來產(chǎn)生旋律.

僅貼出第三個任務的代碼:


上一頁 1 2 下一頁

評論


技術專區(qū)

關閉