Swapping Nibbles in Keil C51

今天寫程式的時候,有個地方需要 swap 某個 byte 的兩個 nibbles。其實 8051 原本就有一個 instruction 專門做這件事。若是直接寫組語的話,只要 3 行就搞定了:

    MOV     A,tmp       ; 先將原本的值搬進 accumulator
    SWAP    A           ; swap nibbles
    MOV     tmp,A       ; 先將原本的值搬進 accumulator

問題我是用 C 在寫 code 的,所以我就開始研究是不是有辦法讓 Keil C 幫我產生這樣的 code。

首先,我們用標準的 C 的作法來做:

    tmp = (tmp >> 4) | (tmp << 4);

Keil C 產生出來的組語程式如下:

    MOV     A,tmp
    SWAP    A
    ANL     A,#0F0H
    MOV     R7,A
    MOV     A,tmp
    SWAP    A
    ANL     A,#0FH
    ORL     A,R7
    MOV     tmp,A

這樣翻出來的組語程式雖然看起來很長,不過我們還是可以看出 Keil C 厲害的地方:雖然我們寫的程式碼是「向左/向右 shift 4 個 bits」,但翻出來的並沒有「連續 shift 4 次」這樣的過程(8051 的 shift 一次只能 shift 1 個 bit,所以要 shift 多個 bits 就得用迴圈來跑),而是很聰明地利用 SWAP,分別取得 high/low nibble,再重新組合成 完成的 byte。

這樣的結果讓我蠻興奮的,因為這表示 Keil C 會去看 bit operation 的位數,適時地使用處理 nibble 的指令。也就是說,我有機會找到一種寫法,讓 Keil C 翻出直接 SWAP 的組語程式。

但接下來我就卡住了,因為我找不到更好的寫法去表達 “swap nibble” 這樣的想法。

後來,我在 Keil 的文件中找到一系列 intrinsic routines。很不幸地,裡面還是沒有 swap;但卻_crol_()_cror_() 這樣的 rotate 函式。於是我試著這樣寫:

    tmp = _crol_(tmp,4);

結果翻出來的組語如下:

    MOV     R7,tmp
    MOV     R0,#04H
    MOV     A,R7
    INC     R0
    SJMP    ?C0081
?C0080:
    RL      A
?C0081:
    DJNZ    R0,?C0080
    MOV     tmp,A

結果令人失望:變得更糟了!沒有直接用 SWAP 就算了,還利用迴圈的方式來處理。看樣子這個方法也行不通。

剩下一個方法:寫 inline assembly。但 Keil C 的 inline assembly 實在很難用:只要用了這個功能,該 .C 檔就不能直接編譯成 .OBJ 檔,而必須先產生出組語程式,再另外去組譯這個檔案。很麻煩。站在專案維護的角度來看,代價太高了,所以我放棄這樣的做法。

到頭來,我還是採用一開始的那種做法,畢竟在可維護性、執行速度、code size 等各方面,都算是平衡的做法。只是不能用到 8051 提供的功能,心中還是有些遺憾….

PS: 在 這個討論串中,也有人提到用 intrisic routine 的做法,而且說 Keil C 會幫忙做最佳化;不過我實驗的結果並不是這樣。

2007 最後回顧 + 囍訊

轉眼間,2007 年就要過去了。在這一年裡,這個 blog 的活動幾近停擺。尤其是後半年,幾乎是一個月只有一篇文章。追究其原因,主要還是因為人懶;另外,私事太多,東忙西忙的結果,腦袋變得像是漿糊一樣。常常真的有什麼話想說,坐在電腦前面半晌,就是打不出什麼鳥來。(我稱之為「思想上的便祕」 XD)

最近到底在忙什麼呢?

其一是工作。最近離開了待了快五年的崗位,準備在新曆年後到新公司報到。我想工作量應該現在更多,會比現在更忙,算是給自己的一個挑戰吧!只希望也能得到相對應的回報……*grin*

另一件事情嘛……所謂沒圖沒真像:

DSC_0482s.jpg

對!沒錯!我要結婚啦!!! XDDDDD

雖然婚期是在明年三月,但因為我們幾乎整個婚禮準備都是自助式的(自己找禮服、自己找攝影師拍婚紗,之後還要自己找做囍帖、做相本的……),從兩、三個月前開始,我們倆(其實應該是我們兩家人)就一直在為了結婚的事情忙上忙下,甚至偶爾還會因為意見不合而有些小爭執。但我從來不後悔做了這個決定。我相信我們現在遇到的問題,是為了能讓我們未來更親密、更美好。

Amy 我愛妳。我們要一輩子走下去。

最後附上一段影片,是我們到巴哈姆特站聚活動中拍婚紗時,接受電視台訪問的新聞畫面:

祝大家有情人終成眷屬! 🙂

Programming an 8-bit CPU in 21st Centry

我從來沒有想過,我會因為有人浪費了 10 bytes 的記憶體空間而捉狂,也不知道自己會為了省下 0.1K 的 code size 而放下身段在 C 裡使用 goto….
寫了四年多了 ODD firmware,我第一次覺得我在做 embedded system。
真要說要怪誰,就怪之前的 chip/solution vendor 太奢侈了吧!誰叫他們在光碟機的控制晶片中塞了一顆 32-bit 的 MIPS CPU,32-bit 的 address lines(所以 addressing space 可以到 4GB),還有一套功能強大的 compiler,以及嚴謹到嚇死人的 firmware structure…..雖然偶爾也會遇到 code size 或是 efficiency 的問題,但至少寫起程式來不會綁手綁腳的。
但正是因為他們太奢侈,價格也壓不下來,讓我們不得不換用比較廉價的 solution。但代價就是:CPU 從 32-bit MIPS 變成 8-bit 的 8051;addressing space 變成 64K(所以會遇上 bank switching 的問題);DRAM access 必須透過 DSP 的 registers,所以一般程式內的變數只能使用 256 + 4096 bytes 的空間;處理 32-bit 的變數時,assembler 還會呼叫 library 去處理,所以為了效率,不是太複雜的 double word 運算最好手動拆成四個 bytes 來處理;原本的 source code 打扮得像是要去選美一樣,現在變成一隻只求會捉老鼠的貓……..
當然好處也是沒有。正因為它原始,正因為它低階,才能讓我更清楚地去了解最低層動作的每一個細節,讓我驗證以前所學到的知識(雖然這不是現在該做的事),激發我的動力,讓我更仔細地去思考在處理 embedded system 時該思考、解決的問題。
反正,總之,工作還是得做。就當作是成長的機會吧!(不然還能怎麼辦咧?) 🙂

計畫….or 變化?

唔……讓我想想看整件事情到底是怎麼演變的?
9/6 (Wed): 通知我 9/17~9/23 要到廣州出差。
9/8 (Fri): 因蘇州有狀況,要我 9/10 出差至蘇州,9/17 轉飛廣州,9/23 回。
9/14 (Thu): 蘇州狀況未解除,因此廣州行取消,仍是 9/23 回。
9/20 (Thu): 蘇州狀況仍危急,除加派人手外,我回程的時間改為 10/1。
9/25 (Mon): 因 10/1 後仍有收尾工作,回程時間改至 10/5。
10/2 (Mon): 因為有些東西必須拿回台灣,回程時間提前至 10/3。
一趟三個多禮拜的出差,行程改了 6 次,每一次都需要改機票和住宿。甚至,最後一次的變動是大陸十一黃金週內決定的,我還得自己打電話到租車公司安排送機——因為蘇州這兒的祕書助理、HR 部門的人都放假去了,一切都得自己安排(就連租車公司的電話都是打 114 查號台問到的)。
這麼不確定的行程造成了很多人的困擾,包括公司助理、到機場接我的父親大人、得花個把小時坐巴士和我碰面的 J 老師,以及幫我抱不平的 Honey….
但身為龐大財團機器中的小囉嘍,我也只能無奈地接受這一切….
我代替敝社向各位致上十二萬分的歉意。 m(-_-)m

That’s What PL’s Are For

PL 就像是膠水,要把分散在各個 function team 的 engineers 緊緊地連繫在一起。尤其是在以 function team 編組的架構下,想辦法讓這些 engineer 感覺起來像是在同一個 project team 裡。
所以,PL 這罐膠水得要夠強才行。
而現在的我,就好像是 3M Post-It 上那「有點粘,又不會太粘」的半調子膠一樣,沒有足夠的力量把整個 project team 綁在一起,只是不時地去煩 engineer,讓 engineer 感到很煩而已。
半調子膠有半調子膠的用處,就好像 Post-It 一樣;然而,在需要三秒膠的場合使用半調子膠,只會讓大家都痛苦罷了。

站務簡報,以及近況

搞了幾個星期,一直搞不出滿意的結果。
最後,在這個星期天,換了一條 RAM,然後(一氣之下)灌了 FreeBSD 6.0 (i386, of course)。
目前的進度,如各位所看到的,Web 以及 OK 了。
Blog 部份,只缺留言還沒搞定。(需要 SCode)
但是,BBS 仍舊多多少少有些問題:
舊版的 BBS 程式在修改了幾個檔案之後 compile ok,乍看之下也沒有大問題,可是瀏覽文章的時候一片漆黑,什麼都看不到;
新版的 compile 沒有問題,但,也許是資料檔案的問題,還是會出現之前登錄後沒多久就斷線的問題。
目前的想法是:修改舊版的程式…..因為看起來這邊的問題比較好解決。

Continue reading  

近況

好一陣子沒上來貼文章了。
為什麼?因為忙。
不要小看了這個「忙」。
上一篇文章是在蘇州出差的時候貼的。
原本一個星期的出差,被延長到兩個星期。
然後,回到台灣後,等著我的是另一個無間地獄。
如果知道自己為何而忙、為了什麼目標而忙,那叫做「充實」;
但如果連自己都不知道為何而忙,但事情又源源不絕地落在身上,那叫做「渾渾噩噩」。
很累。
真的很累。
不管是身體還是心理。
最近又看到一些好朋友相繼轉換人生跑道,
讓我開始認真地思考到底接下來的路要怎麼走。
……嗯,再讓我想想吧!

Micro Management

部門老闆前一陣子對我們說過:「現在是微利 (micro-profit) 時代,所以我們也必須要施行 micro-management!」我能理解老闆所說的 “micro-management” 是什麼意思——反正就是 cost down 嘛!既然是 “micro”,就是要「錙銖必較」。所以什麼「下班時間要關電腦」、「休息時間燈要全部關掉」,甚至是「會議室內只有三個人以下時,燈只能開一半」這樣的規定,也就不那麼令人感到意外了。笑一笑,也就算了。

不過,今天,我才知道什麼是 micro-management 的真諦……

Continue reading  

[蘇州遊記] 英雄來自四面八方?

這幾天在工廠,主要是和我這個 project 的 PE 和 PCC 在一起。
(PE 和 PCC 是兩個職稱,是什麼的縮寫並不重要)PCC 的普通話口音蠻重的,所以昨天在聊天的時候我隨口問他是哪裡人。

「我東北人!….我們家原本住在山東,在解放前我爺爺到了東北,所以我們就成了東北人!」唔,東北人到蘇州工作啊!有點遠哩….

又順口問了 PCC,他是陝西人

這一聊聊出興趣了,他們兩個開始點那些 PE 是打哪兒來。的確是有江蘇人,也有人從河北來….但後面這些就越聽越嚇人了:

山東甘肅黑龍江(!)、內蒙(!!)、海南島(!!!)、貴州(!!!!)….連新疆人都不缺!

真是精采啊!

聊到後來他們打趣道:「也許 PE Lab 湊一湊就可以湊齊了!」

想想,從中、南部離家到台北工作….和他們相比,真是稱不上「離鄉背井」啊! XD

新工作….

唔….接下了某個產品的 Project Leader。
這個 PL 呢,根據前人的經驗來看,是個事多、責任重但地位和薪水沒有增加的任務性職務。名稱看起來蠻稱頭的,但事實上是個人人避之惟恐不及的工作。
唉,接下來兩、三個月會很忙了……:~~