新聞中心

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

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

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

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

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

        硬件平臺是s3c2440:

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

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

        調度的代碼參考《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個靜態任務,第一個任務做一個簡單的算術運算,第二個任務是一個流水燈,而第三個任務是利用蜂鳴器來產生旋律.

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


        上一頁 1 2 下一頁

        關鍵詞: ARM匯編任務調

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 凌海市| 盐边县| 巫山县| 甘南县| 沁源县| 宜兰县| 石家庄市| 绵阳市| 余庆县| 莫力| 彭阳县| 乌拉特中旗| 大田县| 齐齐哈尔市| 阿鲁科尔沁旗| 大竹县| 嘉祥县| 建湖县| 阿合奇县| 二手房| 宜川县| 仙游县| 五峰| 徐州市| 易门县| 泽州县| 云安县| 藁城市| 湛江市| 容城县| 卢湾区| 潮安县| 富平县| 满城县| 铜山县| 海伦市| 乌拉特前旗| 永泰县| 秭归县| 枣庄市| 东丰县|