發生異常,系統就死機
5.對TIMER的實現,首先確定時間片,為了讓系統更穩定,而且我們不需要實時功能,盡可能讓時間片設置長一點,比如我們讓一個任務運行20個時鐘滴答數,然后應根據系統頻率來確定每個系統滴答所占用的毫秒,這里使用5毫秒讓系統定時器中斷一次,那么就需要寫時鐘寄存器,具體參閱芯片資料,計算下來,一個任務最大可能連續運行100毫秒,注意:我們的操作系統不支持內核搶占,同時只支持兩級中斷優先級,就是只有時鐘中斷的優先級高一點,其它的優先級都低一級,但是在中斷處理一節中卻屏掉了這個功能因為一進入中斷處理,就禁止中斷,所以不管其它中斷優先級有多高都沒有用的,這樣做優點是簡單了,但不好之處顯而易見,特別在相關中斷處理函數如果進入了死循環,那么整個系統就死了,而且時間片也變得不準確了,反正都不用實時,也不需要實時鐘支持嘛至于中斷優先級設置請參閱芯片資料
6.進程調度的實現,也就是do_timer函數(時鐘中斷處理函數),有一個全局變量指針,指向的就是當前任務結構數組(或者鏈表),當時鐘中斷時,就進入此函數中,首先判斷任務結構體中的時間片是否用完,如未用完,就減一,然后退出中斷,讓CPU繼續運行當前的任結構,若用完了時間片,就重置時間片,并重新尋找任何結構數組中的下一個等待
運行的任務,若找到了,就切換至新的任務,至于如何切換,請見下一頁描述,如果未找到就切換到IDLE任務(類似于Linux,呵呵,所有的處理就是模仿Linux,由于本人水平太差,所就不能自創一招),注意:為了簡單,所以沒有實現任務優先級,也未實現任務休眠等,也就是說只要靜態地決定了有十個任務,這十個任務就按先后順序一個一個執行而且每個任務都不允許結束,就是說在每個進程中的最后一句代碼都必須用死循環,不然的話系統就跑飛了),還有一點,進程不支持信號,沒有休眠與喚醒操作,這個CPU就是不停地在運行,呵呵,反正CPU又不是人,所以不需要人權的哈!!!這種調度是不是簡單得不能再簡單了?????!!!!
7.串口不使用中斷,這就是最大可能的降低難度,串口使用論詢的方式來實現讀寫(當然是阻塞的方式了哦,而且只有寫,不允許讀,因為讀的時候需要涉及到采用中斷方式,因為輪詢方式有個不好的地方,那就是正在讀的時候,這里有可能當前進程的時間片用完了,系統切換到另一個進程,這里你在PC機的串口輸入的數據就丟棄了,唉,又是為了簡單嘛)
8.最后一步就是MIAN函數的最后一部分,將本進程當作IDLE進程(相當于修改任務結構數組中的數據),開啟中斷,將當前進程加入一段死循環,以免它退出去。
9.編譯你的BOOTLOADER,KERNEL,并燒寫至FLASH,反復調試
10.至此將你的at91rm9200(或者是其它相類似的芯片)的串口接上PC機,打開超級終端,打開板子電源,說不定你的操作系統就打印出了"hello,world"了!!!一個最簡單的操作系統就出來了
文章來源于領測軟件測試網 http://www.kjueaiud.com/