在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            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)機.arm7不跑OS,就相當(dāng)于單片機,單片機跑的肯定是無限死循環(huán).有限狀態(tài)機是因為整個代碼要處理很多外部的事情,那就是大的循環(huán)里面來套小循環(huán),以輪詢的方式來檢查外界的變化,然后系統(tǒng)作出變化,系統(tǒng)在有限的狀態(tài)中切換.

            OS的一個標(biāo)識就是支持多任務(wù)的并發(fā).比方說linux,我們看起來是多個進(jìn)程在同時運行,實際上還是cpu運行一下這個進(jì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.biyoush.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ù)運算,第二個任務(wù)是一個流水燈,而第三個任務(wù)是利用蜂鳴器來產(chǎn)生旋律.

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


            上一頁 1 2 下一頁

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

            評論


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

            關(guān)閉