一、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 [email protected] $(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 [email protected] $^ $(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
可以看到燈在閃爍: