Arduino Library 製作方式
常會聽到人說 Arduino 不能包成 library, 必須開放 source code.
雖然我個人是傾向 open source, 但也尊重別人包成 library,
就像早期 GNU GPL license 是要求要完全 open source , 但後來衍生很多 license,
如 Apache license, 是可以架構在這上面, 並採取不開放的方式.
這樣能有更多願意加入這 ecosystem 一起發展.
不確定 Arduino 本身 Library 到底可不可以只包 .a 不開放 source ,
所以走了一個取巧的路, 做了以下這個實驗.
以 Ameba 開發板為例, (其他 Arduino 板子也可用相似方式 )
可以更新個人實驗版到 1.0.8 版, 更新方式可參考 :
http://njiot.blogspot.tw/2015/12/arduino-ameba-sdk-personal-release.html
C:\Users\<人名>\AppData\Local\Arduino15\packages\njiot\hardware\ameba\1.0.8
在此目錄底下的 system 造了一個 libtest 來做實驗.
假如我們有一個 function
int mysum(int a, int b);
要包成 library
1. 編成 .a library file, 並放到 variant/arduino_ameba 下
編譯方式. 我寫好了一個 Makefile , 在 system/libtest/build_gcc 下
編譯前請安裝 cygwin 以及相關檔案. 在這目錄下打 "make clean; make"
會在 variants\arduino_ameba 下產生一個 libtest.a
libtest.c :
#include "libtest.h" | |
int mysum(int a, int b) | |
{ | |
return a+b; | |
} |
libtest.h :
#ifndef __LIBTEST_H__ | |
#define __LIBTEST_H__ | |
#ifdef __cplusplus | |
extern "C" { | |
#endif | |
extern int mysum(int a, int b); | |
#ifdef __cplusplus | |
} | |
#endif | |
#endif // __LIBTEST_H__ |
2. 編輯 platform.txt 檔
可以留意幾個設定
(1) include 要成功
#include "libtest.h"
變數設定, 最主要要把 "-I<libtest.h 的所在目錄> 設定到 gcc 參數中
compiler.ameba.libpath2 = {build.system.path}/libtest
compiler.ameba.c.include6= "-I{compiler.ameba.libpath2}/include"
compiler.c.extra_flags= {compiler.ameba.c.include1} {compiler.ameba.c.include2} {compiler.ameba.c.include3} {compiler.ameba.c.include4} {compiler.ameba.c.include5} {compiler.ameba.c.include6}
compiler.cpp.extra_flags= {compiler.ameba.c.include1} {compiler.ameba.c.include2} {compiler.ameba.c.include3} {compiler.ameba.c.include4} {compiler.ameba.c.include5} {compiler.ameba.c.include6}
recipe.c.o.pattern="{compiler.path}{compiler.c.cmd}" {compiler.c.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.c.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}" | |
## Compile c++ files | |
recipe.cpp.o.pattern="{compiler.path}{compiler.cpp.cmd}" {compiler.cpp.flags} -mcpu={build.mcu} -DF_CPU={build.f_cpu} -DARDUINO={runtime.ide.version} -DARDUINO_{build.board} -DARDUINO_ARCH_{build.arch} {compiler.cpp.extra_flags} {build.extra_flags} {includes} "{source_file}" -o "{object_file}" | |
(2) linker 要成功
recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} "-L{build.variant.path}/linker_scripts/gcc" "-T{build.variant.path}/{build.ldscript}" "-Wl,-Map={build.path}/{build.project_name}.map" {compiler.c.elf.extra_flags} -o "{build.path}/target.axf" "-L{build.path}" -Wl,--start-group {object_files} {sys_obj_files} -Wl,--end-group "{build.path}/{archive_file}" "{build.variant.path}/{build.variant_system_lib}" "{build.variant.path}/librtos.a" "{build.variant.path}/libtest.a" -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys
3. 範例程式 :
https://github.com/neojou/arduino-ameba/blob/master/example/TestMySum/TestMySum.ino
4. 執行結果
留言
張貼留言