pcDuino-脫離arduino IDE,用gcc編譯arduino程序

一、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

 

    可以看到燈在閃爍:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章