2011年1月1日 星期六

再次移植uCOS-II Win32 porting

這次目標是公司的嵌入式作業系統。
它是很奇怪的系統。主要會長成這個樣子是歷史因素。
全程式原始檔大小約20MB。除去工作展示用的資料,原始程式碼也有10MB以上。
發展維護時間可以查到的有15年,但Bee認為超過20年。
因為使用的技術都是20年前的。
從原先的沒有作業系統的核心程式,採用狀態機控制系統。
到移植現代作業系統,程式都存在。
形成半狀態機半作業系統程式混合型。程式碼還夾雜從前狀態機於DOS上模擬的痕跡。
但後面無人再發動於DOS下模擬的程式,所以程式是壞的。
而編譯器用的是公司已經消失的68K compiler。
故只要離開公司,程式碼是無法編譯的。
原系統在組合語言的成份好像還很大。但後期有被大量用C改寫。除了作業系統核心外。

Bee接下程式已超過4年,仍無法弄清楚程式的運作。
主因是沒有軟體除錯器。因為作業系統會干擾Debugger運行。
但在這次的移植工作中,開始打開一扇門。利用Windows來看整套程式的運行。

在此還是感謝直屬主管願意讓我花一個月的時間去做這件工作。
因為在投資者的角度來看這種沒有產出產品的工作是沒有價值的。
其實這件事Bee已偷偷做了數個月的程式碼整理工作。
除去了程式碼約200個compiler warning。
實際在移植時又發現了200多個Warning,也是一一想辦法去除。

Warning以這幾類居多
1.型別不合
  compiler有部分會提示。部分的意思是,在放入Windows後,數目又大了三倍。
2.未用到的區域變數
  歷任維護者除錯用的。因為compiler完全不理會,所以此垃圾數量龐大。
3.沒有初始值就使用
  因為初始值會佔用ROM,故90%以上的變數都是這樣寫。
4.有路徑沒有回傳值
  就是使用switch case完全沒有default項。
  還有函式應有回傳值,在眾多的if-else之中就一個有return但沒有值。
  最常發生在走全為else的路徑,就直接走到函式最後一行。
  Compiler沒提示,所以無人發現。
這些Warning花了數個月。

建造Windows下的Project也是一件辛苦的工作。
約有150個C檔案以及150個H檔案。
C檔案有不同結構模式,所以有數個main()。
這次針對的是有130個C檔案的狀況。因為有許多同名函式,光是main()就有數個。
所以建造project的檔案不能錯,不能多,更不能少。
這一個月中,為了建立成exe檔就花了二週多。Warning多到不知何時才能完成。

建好exe檔,才是第一關,再來是執行時的不合法存取,被Windows踢出來。
有CPU的設定,Flash ROM的存取,FPGA I/O存取,這些都是。
就使用條件巨集切換,不是跳過就是導向另一個自己寫的I/O函式。
因為Bee先將FPGA I/O先用一塊記憶體先模擬。至少可以讓Debugger可以動。

main()終於可以跑完,第一關結束。OS模擬,才開始。
這是要參考uCOS,Windows以及嵌入式作業系統各作業函式的功能進行比對。
才能決定如何將這三者做融合。
終於這個星期做出來了。
現在同一套檔案可以直接編譯成Windows及目標系統的目的檔。
不過目前仍因為I/O是用記憶體模擬,要模擬到像機器,仍有好一段路。

2 則留言:

  1. 賈老師的真老公2011年1月2日 上午10:51

    如果針對您所修改的部分,除非您自個兒能在這家公司裡"永續經營"?
    或是要真的有個人把這些修改歷程與所有的工程記錄文件化...
    否則,對以後系統維護者來說:您也只不過是那個15 ,20 年來的其中一位歷史包袱而已?
    以後,還是對於這樣子的工程內容還是來來去去的修修改改,縫縫補補的~
    對主其事者來說:他當然願意讓您花幾個月的時間讓您去熟悉...
    因為您要彌補幾十年的包袱,但真的系統規劃與系統維護,真的只是這樣子的移除
    Complier Warning 嗎?...難道這些工作之前系統承接者本身沒有思考過?
    難道他們會視而不見嗎?---- 我想這不是系統承接者或是一位工程師接到這樣子
    的工作就匆匆忙忙的急著上機去處理這樣子的系統問題。
    這是以我從您的工作描述所得到的心得。
    (PS:或許,您是剛剛初接這樣子的工作,所以您認為您會有一個工程歷練的經驗,
    您願意嘗試努力...但對於以後系統承接與維護者,他會最感謝的是怎樣的一個
    工程環境交接?難道只是一份程式原始碼而已嗎?!而沒有任何隻字片語?)
     
    [版主回覆01/02/2011 12:53:39]果然一針見血,命中公司問題核心所在:交接問題。
    我的公司沒有在這點上面下功夫。我的上任維護者只有和我交接如何編譯,剩下自己看原始碼。不過我不是最糟的,有位助理工程師要去當兵,早三個月提交接,下一任來的時間是他去當兵後一星期,然後就看工作亂在那裏。這個不提了。
    公司軟體最難的是嵌入式軟體,主因是沒有好的工具。Compiler舊,也沒有除錯器。讓機器可以動就是工作重點。Warning是高級工程師的問題,一般工程師是這樣說的。
    而我要做模擬器其實也是在解決我的問題,因為公司沒錢,現在機器常拿不到。剛接時還有專用機,因財政緊縮要入庫賣掉。造成我要在沒有機器的狀況下寫程式。
    而我要解決沒有機器也能改程式的方法。這個大概是我的主管的打算。因為另一組人況狀更嚴重,要出貨才有機器可以改。
    所以這項技術是有背景下逼出來的。不過總經理是聽不懂,變成只有我和上司之間的打算,所以我的上司要去編出我的績效才能做。不過我也只能做一個多月,又要回去維護了。

    回覆刪除
  2. [版主回覆01/02/2011 16:14:04]我猜得出你是誰

    回覆刪除