compile assembly source in eclipseSDCC

Posted by: 邱小新 at 上午10:38 in

在 eclipseSDCC 內要編譯 c source 是完全沒問題的,但是要編譯 assembly source 卻產生一個小小的 bug,很多人都有在問解決方法,但原作者似乎沒有要修改的意願,還好有一個熱心的使用者提供一個解決方法,可以完美的解決。

在最原始的設定下,直接編譯 asm 會出現下列錯誤。

Building file: ../source/test.asm Invoking: SDCC Assembler as51 -o"source/test.rel" "../source/test.asm" C:\Temp\make34404.sh: command not found: as51 [1] make: *** [source/test.rel] Error 1

為什麼找不到 as51?那是因為 SDCC 的 assembly compiler 應該 asx8051 才對,換成 asx8051 後,再次編譯 asm 則出現下列錯誤。

Building file: ../source/test.asm Invoking: SDCC Assembler asx8051 -o"source/test.rel" "../source/test.asm" removing ASxxxx Assembler V01.70 + NoICE + SDCC mods + Flat24 Feb-1999 (Intel 8051) Usage: [-dqxjgalopsf][ -I<dir> ] file1 [file2 file3 ...] d decimal listing q octal listing x hex listing (default) j add line number and debug information to file g undefined symbols made global a all user symbols made global l create list output file1[LST] o create object output file1[REL] s create symbol output file1[SYM] c generate sdcdb debug information p disable listing pagination f flag relocatable references by ` in listing file ff flag relocatable references by mode in listing file -I<dir> Add the named directory to the include file search path. This option may be used more than once. Directories are searched in the order given. make: *** [source/test.rel] Error 1

為啥會錯呢?那是因為 -o 還沒有支援路徑功能,在那編譯,就在那產生 rel,不能更改路徑。最後使用 domning 所提供的 SDCCAsmWrapper 才得以正確的編譯成功。

Building file: ../source/test.asm Invoking: SDCC Assembler SDCCAsmWrapper -o"source/test.rel" "../source/test.asm" Wrapping SDCCAsmWrapper.EXE to > asx8051.exe -lo ../source/test.asm Finished building: ../source/test.asm

安裝 SDCCAsmWrapper

  1. 下載 SDCCAsmWrapper
  2. 解壓縮到 C:\Program Files\SDCC\bin。
  3. 修改 SDCC Assembler Command 為 SDCCAsmWrapper 即可。
  4. SDCCAsmWrapper 會去呼叫 asx8051 做編譯,再 copy rel 到 output 目錄。

SDCC 函數參數傳遞使用暫存器

Posted by: 邱小新 at 上午9:55 in

SDCC 函數回傳值

  1. SDCC 使用 DPL, DPH, B, ACC 來做回傳值的傳遞。
  2. 回傳 1 byte : 使用 DPL。
  3. 回傳 2 bytes: 使用 DPL(LSB) 及 DPH(MSB)。
  4. 回傳 3 bytes: 使用 DPL, DPH, B。
  5. 回傳 4 bytes: 使用 DPL, DPH, B, ACC。
  6. generic pointers 回傳 3 bytes,指針位置存在 DPL(LSB) 及 DPH(MSB),指針型態存在 B,0x00–xdata/far, 0x40–idata/near, 0x60–pdata, 0x80–code。

SDCC 函數參數值

  1. 第一參數: 使用 DPL, DPH, B, ACC 來傳遞,如同回傳值一般。
  2. 其餘參數: reentrant 函數使用 stack,一般函數使用 data/xdata,視記憶體模式而定。
  3. bit 參數都是使用 bit-addressable 位置的空間,不論 reentrant 或一般函數。

SDCC Bankswitching (code banking)

Posted by: 邱小新 at 下午5:23 in ,
範例下載, 使用 winbond w77e532, uart output "010hello test".

要做 SDCC code banking 真是有夠麻煩,找不到有人分享成功案例就算了,sdccman.pdf 竟然也只提到一頁而已,完全沒法子去了解如此實做。最後靠著不斷的試驗,總算完成這一件不可能的任務。

  1. 修改 C:\Program Files\SDCC\lib\src\mcs51\crtbank.asm 來達成 bankswitching 的函數。
  2. 重新建立 mcs51.lib,把修改好的 crtbank.asm 置換掉舊的 mcs51.lib。
  3. Project Properties → C/C++ Build → Settings → Tool Settings → SDCC Linker → Command 輸入 sdcc -Wl-r "-Wl-b BANK1=0x18000",千萬不要輸入 sdcc "-Wl-r -Wl-b BANK1=0x18000",為此我花了半天找問題,真是 ooxx。
  4. 建立一個 c source file,開頭輸入 #pragma codeseg BANK1。
  5. 建立一個函數 void test1(void) banked { ... },要記得加上 banked。
  6. 轉換 ihx 成 bin,makebin.exe < test.ihx > test.bin
  7. 產生出來的 bin,裏面有 common/bank0/bank1,但是在 bank1 裏沒有 common 存在,需要手動加進去,而且也要手動分開這個 bin,才方便 winbond isp writer 燒錄。
  8. 大功告成,真是幸苦啊,花了一天才完成。

to be continue.... 後面有空再來補一些說明及範例吧。

SDCC Bankswitching (code banking) part 2

rebuild mcs51.lib

Posted by: 邱小新 at 下午5:04 in

今天為了試驗 SDCC code banking,一直在試 crtbank.asm,怎麼弄都不行,最後想到直接置掉 mcs51.lib 看看。結果,當我下 sdcclib -m mcs51.lib,竟然回我一個錯誤訊息。

sdcclib -m mcs51.lib ERROR: File 'mcs51.lib' was not created with 'sdcclib'

最後,直接下 sdcclib -a mcs51.lib crtbank.rel,把檔案暴力加進去,結果....裏面檔案都不見了,只剩下 crtbank.rel

sdcclib -a mcs51.lib crtbank.rel sdcclib -m mcs51.lib crtbank.rel

當然這樣是不能用的啦,其它的 startup code 都不見了,根本無法編譯。所以又手動把 C:\Program Files\SDCC\lib\src\mcs51 下的 asm 全部編進 mcs51.lib。傻眼的是雖然可以加到 SDCC,但是搞出來的 hex 檔燒進去竟然動不了,真是怪了。

只好又去拜酷狗大神,歷經千幸萬苦,最後找到原始編譯 mcs51.lib 才解決了問題。原來我一直使用 asx8051 -ol 是不對的,應該下 asx8051 -plosgff 才對。而且 sdcclib 也不用加 -a 參數。

del mcs51.lib del *.rel asx8051 -plosgff crtbank.asm asx8051 -plosgff crtcall.asm asx8051 -plosgff crtclear.asm asx8051 -plosgff crtpagesfr.asm asx8051 -plosgff crtstart.asm asx8051 -plosgff crtxclear.asm asx8051 -plosgff crtxinit.asm asx8051 -plosgff crtxstack.asm sdcclib mcs51.lib crtbank.rel sdcclib mcs51.lib crtcall.rel sdcclib mcs51.lib crtclear.rel sdcclib mcs51.lib crtpagesfr.rel sdcclib mcs51.lib crtstart.rel sdcclib mcs51.lib crtxclear.rel sdcclib mcs51.lib crtxinit.rel sdcclib mcs51.lib crtxstack.rel copy /Y "C:\Program Files\SDCC\lib\src\mcs51\mcs51.lib" "C:\Program Files\SDCC\lib\small"

W77E352 雜記

Posted by: 邱小新 at 下午4:35 in

從今天開始又要開始玩 8051 了,在公司裏被丟來丟去,如浮萍一般飄泊不定,真是可憐啊。
BTW 有人要挖角嗎?歡迎來電喔。

  1. W77E352 內含二個 serial port,port 0 可以使用 timer 1/2 做 baudreate generator,而 port 1 只能使用 timer1。所以只要設定好 T2CON,port0 就會使用 timer2;如果只有設定 timer1 則 port 0/1 就會共用 timer1。
  2. W77E352 有 1K 的 On-chip SRAM,使用 xdata(MOVX) 來存取,位置在 0x0000~0x03FF。使用前需把 PMR 的 DME0 開啟,就是 PMR |= 1。
  3. to be continue....