ucos-ii是一種十分優秀實時作業系統,其在nasa的認證通過直接說明了其優秀及穩健的效能,同時由於其完全open,所以受到廣大開源愛好者的喜愛。ucos-ii簡單明瞭,同時絕大部分**都採用ansi c編寫(除了與cpu相關**外),所以學習起來十分容易,是嵌入式學習乃至作業系統學習最好的入門os之一。
我主要想講一下自己最近移植ucos-ii的心得,因為最近也在學習作業系統,所以這段日子對於ucos-ii的學習的確也讓我對於作業系統有了乙個實際深刻的認識。
ucos-ii移植其實十分簡單。對於乙個處理器,需要做的工作只有:修改三個檔案――os_cpu_c.c、os_cpu.h、os_cpu_a.asm(asm檔案根據編譯器不同而又有一些不同)。
用另一種方式說,需要做的工作就是修改五個函式:
1、os_cpu_c.c:ostaskstkinit;
2、os_cpu_a.asm:osstarthighrdy、osctxsw、osintctxsw、ostickisr;
ostaskstkinit函式是針對cpu壓棧的函式,需要模仿出cpu初始化後的暫存器狀況。也使需要修改的唯一乙個c語言函式。其他的都是彙編函式。
如果我們可以從ucos-ii官方**上找到相同cpu或是相似的同一家族的cpu移植**,那麼我們的移植工作將會簡單得多。因為至少我們可以只用了解這個處理器的內部結構,而不用細緻的了解其彙編指令等很多繁瑣而沒有意義的事情(有的處理器你可能一輩子不再用它,了解得太細緻只是在浪費時間)。
譬如,此次我要做的是將ucos-ii移植到瑞薩m16c/62a上,而官方**上只有其62p的移植**,於是乎我就將二者的datasheet在cpu的暫存器、中斷部分仔細比對,發現二者區別很小。最大的區別恐怕就在cpu內部暫存器中的intbl和pc暫存器二者順序相反吧,這只要在相關部分注意就可以了,所以很容易就搞定了cpu相關**部分。
總結一下移植中浪費我時間的幾個小錯誤吧,這完全是個人粗心導致的失誤:
1、在os_cpu.h檔案中需要用巨集定義將os_task_sw指向osctxsw函式,而我開始像以前一樣直接將osctxsw函式與0號軟終端鏈結起來,結果發現函式呼叫不成功。後來直接用巨集定義將os_task_sw define為osctxsw函式,初步除錯通過,即驗證osctxsw函式正確,但是到後來呼叫任務的時候卻發現任務切換不正常,不得不重新將函式與中斷結合起來,當然就不能還是0號中斷了,而是改為乙個比較保險的軟終端,這個問題糾結了很長時間。
2、在看書的時候不仔細直接導致我犯了乙個大錯誤。起初以為task只要是能夠達到功能的死迴圈即可。所以每個task函式都是while(1)或者for(;;;),但是我沒有注意到一點就是每個task裡面都應該有ostimedly()函式,否則將導致任務之間不能跳轉。所以最初的實驗現象是永遠只有乙個任務在執行,但是任務不能切換……
3、未注意到版本之間的區別。我們知道在新版本的ucos-ii中,新增了乙個檔案os_tmr.c,主要是在timer上面做了很大的調整,但是我沒有注意到這一點,仍舊按照老版本的方法除錯,導致函式呼叫讓我完全不知所措。最後注意到os的源**的不同,仔細閱讀源**之後知道了其用法,其實如果不需要timer太強大的功能,只要在os_cfg.h檔案中將os_tmr_en設定為0即可。這在習慣老版本除錯方法的同學而言是很好的方法。
SQL一點心得
sql語句將所有 stock 表裡的 縮寫 led甲 替換改寫成 led刷 update dbo stock set 縮寫 replace 縮寫 led甲 led刷 where 縮寫 like led甲 go字首 update mytable set myfield replace myfield,...
Cell myCell一點心得
ctor initializer形如 cell cell mvalue 0 mstring ctor initializer,能在建立資料成員的同時賦初值 1.const方法的工作原理是將方法內用到的資料成員都標記為const引用。因此試圖修改資料成員時,編譯器報錯。2.用explicit關鍵字標記...
openjudge 一點心得
031 校門外的樹 總時間限制 1000ms 記憶體限制 65536kb 描述某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸0的位置,另一端在l的位置 數軸上的每個整數點,即0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來...