新聞中心

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

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

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

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

本文引用地址:http://butianyuan.cn/article/201611/321717.htm

硬件平臺(tái)是s3c2440:

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

其中核心就是中斷的寫法,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個(gè)靜態(tài)任務(wù),第一個(gè)任務(wù)做一個(gè)簡(jiǎn)單的算術(shù)運(yùn)算,第二個(gè)任務(wù)是一個(gè)流水燈,而第三個(gè)任務(wù)是利用蜂鳴器來(lái)產(chǎn)生旋律.

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


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

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

評(píng)論


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

關(guān)閉