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

當使用 board manager 時, 相關程式會安裝在 :

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. 執行結果




留言

熱門文章