(1)從1開始寫一個操作系統

第一章

前言

偶然間使用到了RTX51-tiny做一些東西,它是keil自帶的51操作系統,以小巧佔用資源少著稱,這裏不細談它是如何實現的,反正是一個真正的基於時間片的多任務系統。

往往我們在使用單片機做一些東西的時候都比較喜歡前後臺的框架,這個方法好處就是整體邏輯簡單,就是按循序執行,然後處理中斷。缺點就是編程時無法使用任務的思想來劃分功能,只能按照邏輯來實現功能,而且對於複雜功能就有點捉襟見肘了。好在使用單片機實現的任務一般都不會太過複雜,這也是單片機上沒有推廣操作系統的一個原因,還有一個原因就是單片機本身的資源十分有限。

但是這毫不影響我們對操作系統的好奇和使用熱情。當我使用RTX51編程的時候,那種面向任務的設計思想能夠使我更好的劃分功能實現的邏輯。

突然就冒出了一個想法。。。。。。

操作系統是怎麼實現的?我想自己寫一個試試。

其實在早先看過ucos和rt-thread的一些源碼,對於操作系統的實現基本都有了解,但是那些都是在至少是arm上實現的,雖然ucos有人移植到了51上,但是也只有基本功能,而且效率不高。Arm對於51來說簡直就是一個質的飛躍,從資源上就已經沒有了可比性,在ram上使用操作系統也是理所當然的事情。但是在之前學習其他的操作系統時,即使是看了源碼也只是知其然,而不知其所以然。所以沒有真真正正的自己親手寫一個,學習的知識只能算作紙上談兵。

接下來我打算這正的練練兵,我會一點一點的實現一個比較完整的操作系統,同時把自己的代碼和心得寫下來,留給需要它的初學者一個敲門磚。

爲什麼我的文章說從1開始呢?不是從0呢?因爲我打算把更多的精力放到軟件層面上是如何實現一個操作系統的,但是軟件就必有硬件平臺的支持,我並不打算在硬件上多費口舌,所以需要初讀此文的同學自備硬件相關知識,包括後面所使用的芯片的寄存器知識,這些就是需要自備的“0”。

目標

在開始學習之前需要一個目標,就是我們最後要實現一個什麼樣子的系統,最次要實現哪些功能。

  1. 首先我們需要一個支持時間片和優先級的搶佔式實時系統
  2. 我們需要系統支持動態內存,作爲一個系統如果不能提供內存管理,這個系統是不完整的
  3. 我們需要這個系統支持任務間通訊,至少要支持信號量,最好能夠支持消息隊列和共享內存,並且最好能提供一種廣播方式
  4. 最好能夠提供一個友好的shell工具,這個我在之前已經寫過一個,這裏可以做一個移植的工作,練練手

好了,目標我們制定完成之後就是選擇硬件平臺的過程,由於這個是以學習爲目的,所以我們需要選擇一個簡單,易懂,大衆化的cpu來作爲教學平臺,同時還要考慮資源儘可能的多。

我手頭剛好有一個STC15W56S4的板子,也是之前做小東西時留下的,這個cpu是8051的內核增強型,有着與8051兼容的寄存器,會51基本就會這個,而且有4k ram和56k rom,對於我們編寫操作系統也有好處。而且STC還提供了外設的庫,我們可以直接拿來作爲bsp使用。

軟件首選就是keil了,我使用的是keil5,之後的代碼,不管是仿真還是編譯都是在keil5的環境下進行。

我們也需要一些好的文章來幫助我們擴展思路。下面幾個是我這次學習的主要參考

《構建屬於自己的AVR操作系統》——黃建昌

《一起來學RTT系列連載教程》——RTT論壇

《嵌入式實時操作系統μCOS-II原理及應用》——任哲

《ucos教學》——盧友亮

《自己動手寫嵌入式操作系統》——藍楓葉

還有網上許許多多的文章,等講到相關內容的時候我們在列出

好了,下一章我們開始進行操作系統的正式實踐學習。

在以下的講解中我會盡量全部使用c語言實現,主要是爲了方便理解,其實我們爲了提高效率往往使用匯編來編寫任務切換部分的代碼。

如果你是跟着我一章一章進行學習的話可能會發現在後面章節中前面的代碼有變更,這是因爲我也是一點一點邊寫代碼邊寫文檔,所以導致在後面寫代碼時發現前面的bug,做了修正。但是可以保證每章的代碼都能正常運行。

等我的章節全部完成後我會上傳一份源碼,同時也會在git上同步更新

先放上git地址:https://github.com/RTplay/RT-OSforSTC15W

完整代碼壓縮包在這裏:https://download.csdn.net/download/andylauren/11800701

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章