一、pcDuino簡介
pcDuino專門針對開源社區快速增長的需求,即希望有一個平臺可以運行完整的PC操作系統,容易使用的工具鏈和兼容流行的Arduino開放的生態系統,如Arduino shield和開源項目等。
pcDuino的硬件性能指標遠超樹莓派,性能穩定,做工精良。pcDuino迷你計算機的CPU採用1GHz ARM Cortex A8內核,DRAM爲1GB,板載存儲達到2GB Flash, 完全兼容Arduino接口。另外,pcDuino 可以從NAND或者從mini-SD卡(TF卡)啓動,在NAND Flash內有出廠預裝了ubuntu系統,您拿到手即可使用。
二、本文主要內容
pcDuino具有天然的編譯arduino程序優勢,但是開發程序必須使用pcDuino桌面版,也就是說必須要有顯示屏,對於遠程程序開發不方便。
於是想到,可不可以把arduino庫函數封裝好,然後就像正常寫C++代碼一樣寫arduino程序,然後用gcc編譯器鏈接好就可以了。博主經過一系列嘗試,實現了這樣的功能。
三、實現過程
1.找到 arduino 程序源碼
pcDuino的arduino IDE程序安裝在 /usr/share/arduino/ 目錄下,如下:
而arduino函數庫的源碼,在該級目錄下的 hardware/arduino/pcduino/cores/arduino/ 目錄下,如下:
2.編寫 Makefile
在 /usr/share/arduino/hardware/arduino/pcduino/cores/arduino 函數庫的源碼目錄下新建 Makefile 文件,可以使用以下程序:
sudo nano Makefile
以下爲文件內容:
INCLUDES = ../../variants/sunxi
PREFIX = /usr/local
COMPILE_OPTS = -I$(INCLUDES) -I. -g -Os -w -ffunction-sections -fdata-sections -MMD -DPCDUINO_IDE
C_FLAGS = $(COMPILE_OPTS) $(CPPFLAGS) $(CFLAGS) -Wl,--gc-sections
CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -fno-exceptions $(CPPFLAGS) $(CXXFLAGS)
all: libpcduino.a
.c.o:
gcc -c $(C_FLAGS) $<
.cpp.o:
g++ -c $(CPLUSPLUS_FLAGS) $<
GROUPSOCK_LIB_OBJS = platform.o Print.o Serial.o Stream.o \
Tone.o WInterrupts.o wiring.o wiring_analog.o wiring_digital.o \
wiring_pulse.o wiring_shift.o WMath.o WString.o
libpcduino.a : $(GROUPSOCK_LIB_OBJS)
ar -rcs $@ $(GROUPSOCK_LIB_OBJS)
clean:
rm -rf *.o *.d libpcduino.a
install: libpcduino.a
install -d $(PREFIX)/include/arduino $(PREFIX)/lib
install -m 644 *.h $(PREFIX)/include/arduino
install -m 644 $(INCLUDES)/*.h $(PREFIX)/include/arduino
install -m 644 libpcduino.a $(PREFIX)/lib
uninstall:
cd $(PREFIX)/include && rm -rf arduino
cd $(PREFIX)/lib && rm -f libpcduino.a
3.編譯、安裝
在arduino函數庫的源碼目錄下執行以下步驟:
#編譯函數庫
sudo make
#安裝程序
sudo make install
#清理編譯輸出文件
sudo make clean
#刪除Makefile文件
sudo rm Makefile
#複製main.cpp文件到用戶目錄,接下來會用到
sudo cp main.cpp ~/
#離開庫函數目錄
cd ~
四、測試
在用戶目錄下,新建test.cpp、Makefile兩個文件。以下爲Makefile內容:
INCLUDES =
PREFIX = /usr/local
COMPILE_OPTS = $(INCLUDES) -I$(PREFIX)/include/arduino -I. -g -Os -w \
-ffunction-sections -fdata-sections -MMD -DPCDUINO_IDE
C_FLAGS = $(COMPILE_OPTS) $(CPPFLAGS) $(CFLAGS) -Wl,--gc-sections
CPLUSPLUS_FLAGS = $(COMPILE_OPTS) -fno-exceptions $(CPPFLAGS) $(CXXFLAGS)
LINK_OPTS = -L$(PREFIX)/lib -L. $(LDFLAGS) -lpcduino
CONSOLE_LINK_OPTS = $(LINK_OPTS) -lm
NAME = test
all: $(NAME)
.c.o:
gcc -c $(C_FLAGS) $<
.cpp.o:
g++ -c $(CPLUSPLUS_FLAGS) $<
$(NAME) : main.o test.o
g++ -o $@ $^ $(CONSOLE_LINK_OPTS)
clean:
rm -rf *.o *.d $(NAME)
以下爲test.cpp內容,其實就是arduino例程中的Blink.ino:
#include <Arduino.h>
int led = 13;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}
執行以下命令,編譯執行:
make
./test
可以看到燈在閃爍: