2014年9月15日 星期一

我的飛行器 -- 編譯各類型 DEVO 遙控器的模擬器

本篇介紹如何編譯 Deviation source code,因為我並不需要自行修改遙控器的韌體,因此重點擺在如何自行編譯模擬器,以下將以編譯我的遙控器 DEVO 10為例,說明如何分別在(Ubuntu, Mac OSX) 這兩個作業系統編譯模擬器。

一、Ubuntu 14.04 TLS

1. 下載程式碼控管軟體 mercurial
$ sudo apt-get install mercurial
2. 下載程式碼
$ hg clone https://bitbucket.org/PhracturedBlue/deviation
3. 編譯程式
$ cd deviation/src
$ sudo apt-get install g++
$ sudo apt-get install libfltk1.3-dev
$ make TARGET=emu_devo10
4. 執行程式
$ ./emu_devo10.elf
模擬器畫面如下

5. 編譯其他版本遙控器模擬器
只要改變 TARGET 值重新編譯即可,例如需要編譯 DEVO 8 模擬器,便可輸入make TARGET=emu_devo8,其模擬器畫面如下

二、Mac OS X 10.9.4

1.  下載程式碼控管軟體 sourcetree (Mercurial client for Mac) 並進行安裝

2. 下載程式碼,輸入 https://bitbucket.org/PhracturedBlue/deviation,如下圖

3. 編譯執行檔
需先安裝 xcode command line tool
$ sudo port -v selfupdate
$ sudo xcode-select --install 
接著安裝 fltk
$ cd deviation/src
$ sudo port install fltk-devel
$ ../utils/buiild-osx.sh
註:FLTK(Fast Light Toolki,讀做「fulltick")是一個跨平台的C++GUI工具集,用在UNIX/Linux(X11)、微軟Windows和Mac OS X上。 
編譯執行檔
$ make TARGET=emu_devo10 LFLAGS="`fltk-config --ldflags`"

4. 錯誤處理
編譯時遇到了一些錯誤,主要原因是因為 gcc 與 clang compiler 所允許的語法不同所致,若能改用gcc compiler應該就沒問題了,針對 clang 的解決方式說明如下: 
a. builtin function conflict
a.1 錯誤訊息如下:
In file included from target/emu_devo8/channels.c:15:
./common.h:189:8: error: conflicting types for '__builtin___strlcpy_chk'
/usr/include/secure/_string.h:105:3: note: expanded from macro 'strlcpy'  __builtin___strlcpy_chk (dest, src, len, __darwin_obsz (dest))
  ^
./common.h:189:8: note: '__builtin___strlcpy_chk' is a builtin with type
      'unsigned long (char *, const char *, unsigned long, unsigned long)'
/usr/include/secure/_string.h:105:3: note: expanded from macro 'strlcpy'  __builtin___strlcpy_chk (dest, src, len, __darwin_obsz (dest))
  ^
1 error generated.
a.2 修改方式
修改 src/Makefile,CFLAGS 加入 -fno-builtin 
修改 /Users/liaokuohsun/deviation/src/common.h
#ifdef strlcpy
#undef strlcpy // use our own strlcpy()
size_t strlcpy(char* dst, const char* src, size_t bufsize);
#endif 
b. Clang 不支援 nested function,需改寫 nested function
_putc(), _putchw(), assign_int()
c. 改寫下列巨集  
  • OFFSET(s,v)   
  • OFFSETS(s,v)  
  • OFFSET_SRC(s,v)   
  • OFFSET_BUT(s,v)
  • OFFSET_COL(s,v) 
  • OFFSET_FON(s,v) 
d. 需要定義 FLTK_ABI_VERSION 
修改 /opt/local/include/FL/Enumerations.H,將下列這行程式碼的註解拿掉
//#define FLTK_ABI_VERSION 10303
e. 更改過後的檔案放在此處,列表如下,有需要可以自行下載比較。
src/Makefile  
src/common.h
src/std.h
src/config/display.c
src/config/model.c
src/target/common/stm32/printf.c
src/target/common/emu/fltk.h