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

 

    可以看到灯在闪烁:

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页