openwrt 阿里iot link kit sdk Make交叉编译 mt7688

如官方文档所示,结合我自己的编译环境 做修改

交叉编译到嵌入式硬件平台

对于嵌入式硬件平台的情况, 对编译出目标平台的libiot_sdk.a, 需要经历如下几个步骤:

  • 在tools/board/目录下添加一个对应的配置文件, 文件名规范为config.XXX.YYY, 其中XXX部分就对应后面wrappers/os/XXX目录的HAL层代码

  • 在配置文件中, 至少要指定:

    • 交叉编译器 OVERRIDE_CC 的路径

    • 交叉链接器 OVERRIDE_LD 的路径

    • 静态库压缩器 OVERRIDE_AR 的路径

    • 编译选项 CONFIG_ENV_CFLAGS, 用于C文件的编译

    • 链接选项 CONFIG_ENV_LDFLAGS, 用于可执行程序的链接

  • 尝试编译SDK, 对可能出现的跨平台问题进行修正, 直到成功产生目标格式的libiot_sdk.a

  • 最后, 您需要以任何您喜欢的编译方式, 产生目标架构的libiot_hal.a

  • 若目标平台尚未被适配, 则libiot_hal.a对应的源代码在C-SDK中并未包含, 需要您自行实现HAL_*()接口

 

下面以某款目前未官方适配的 arm-linux 目标平台为例, 演示如何编译出该平台上可用的libiot_sdk.a

新建一个文件名为config.mipsel-linux.mt76

 

c-sdk-v3.0.1/tools/board$ ls

config.alios.esp8266  config.alios.mk3080  config.mipsel-linux.mt76  config.ubuntu.x86

 

vi config.mipsel-linux.mt76

 

#####################################################################

CONFIG_ENV_CFLAGS = \

    -D_PLATFORM_IS_LINUX_ \

    -Wall


CONFIG_ENV_LDFLAGS = \

    -lpthread -lrt


OVERRIDE_CC = mipsel-openwrt-linux-gcc

OVERRIDE_AR = mipsel-openwrt-linux-ar

OVERRIDE_LD = mipsel-openwrt-linux-ld


 CONFIG_wrappers :=

##################################################################

 

其中内容mipsel-openwrt-linux-gcc是openwrt交叉编译的编译器,使用之前 必须提前配置好,如果不了解请看我相关博文

 

注意, 上面的最后1行

如果写成   

CONFIG_wrappers :=

表示跳过对 wrappers 目录的编译,

如果加入#,把他屏蔽如

# CONFIG_wrappers :=

表示需要对 wrappers 目录的编译。

 

以及 -DNO_EXECUTABLES 表示不要产生可执行程序。

在编译未被适配平台的库时在最初是必要的, 这样可以避免产生过多的错误。

 

选择配置文件

river@pc:~/lepu/c-sdk-v3.0.1$ make reconfig

SELECT A CONFIGURATION:


1) config.alios.esp8266      3) config.mipsel-linux.mt76

2) config.alios.mk3080       4) config.ubuntu.x86

#? 3


SELECTED CONFIGURATION:


VENDOR :   mipsel-linux

MODEL  :   mt76



CONFIGURE .............................. [certs]

CONFIGURE .............................. [external_libs/mbedtls]

CONFIGURE .............................. [external_libs/nghttp2]

CONFIGURE .............................. [src/atm]

CONFIGURE .............................. [src/coap]

CONFIGURE .............................. [src/dev_bind]

CONFIGURE .............................. [src/dev_model]

CONFIGURE .............................. [src/dev_reset]

CONFIGURE .............................. [src/dev_sign]

CONFIGURE .............................. [src/dynamic_register]

CONFIGURE .............................. [src/http]

CONFIGURE .............................. [src/http2]

CONFIGURE .............................. [src/infra]

CONFIGURE .............................. [src/mqtt]

CONFIGURE .............................. [src/ota]

CONFIGURE .............................. [src/wifi_provision]

CONFIGURE .............................. [wrappers]


BUILDING WITH EXISTING CONFIGURATION:


VENDOR :   mipsel-linux

MODEL  :   mt76


Components:


. wrappers                                          

. external_libs/nghttp2                                          

. external_libs/mbedtls                                          

. certs                                             

. src/dev_bind                                          

. src/ota                                           

. src/dynamic_register                                          

. src/http2                                          

. src/dev_reset                                          

. src/dev_sign                                          

. src/wifi_provision                                          

. src/mqtt                                          

. src/coap                                          

. src/infra                                          

. src/http                                          

. src/atm                                           

. src/dev_model                                          


river@pc:~/lepu/c-sdk-v3.0.1$

交叉编译产生库文件libiot_sdk.a

 

river@pc:~/lepu/c-sdk-v3.0.1$ make

BUILDING WITH EXISTING CONFIGURATION:

 

VENDOR :   mipsel-linux

MODEL  :   mt76

 

[CC] infra_timer.o                      <=  ...

[CC] infra_preauth.o                    <=  ...

[CC] infra_json_parser.o                <=  ...

[CC] infra_net.o                        <=  ...

获取交叉编译的产物, 包括静态库和头文件

river@pc:~/lepu/c-sdk-v3.0.1$ ls -1  output/release/lib/

libiot_hal.a

libiot_sdk.a

libiot_tls.a

 

开发未适配平台的HAL层

对于实现平台抽象层接口 HAL_XXX_YYY() 的库 libiot_hal.a, 不限制其编译和产生的方式

但是如果你愿意的话, 当然仍然可以借助物联网套件设备端C-SDK的编译系统来开发和产生它

复制一份HAL层实现代码

注: 在 wrappers/os 下需要创建一个与 tools/board/confg.XXX.YYY 中的 XXX 一样的目录用于存放HAL实现

由于目标平台为mipsel-linux,因此可以复制Ubuntu下面的HAL实现,下面是操作示例:

  • $ cd wrappers/os/

  • $ ls

  • freertos nos nucleus ubuntu

  • wrappers/os$ cp -rf ubuntu mipsel-linux

  • wrappers/os$ rm -f mipsel-linux/HAL_UART_linux.c

  • wrappers/os$ ls

  • mipsel-linux freertos nos nucleus ubuntu

river@pc:~/lepu/c-sdk-v3.0.1$ tree -A wrappers/os/mipsel-linux/

wrappers/os/mipsel-linux/

+-- HAL_AWSS_linux.c

+-- HAL_Crypt_Linux.c

+-- HAL_FS_Linux.c

+-- HAL_KV_linux.c

+-- HAL_OS_linux.c

+-- HAL_TCP_linux.c

+-- HAL_UDP_linux.c

 

打开之前被关闭的编译开关

  • $ vi tools/board/config.mipsel-linux.mt76

  •  

CONFIG_ENV_CFLAGS = \

    -D_PLATFORM_IS_LINUX_ \

    -Wall


CONFIG_ENV_LDFLAGS = \

    -lpthread -lrt


OVERRIDE_CC = mipsel-openwrt-linux-gcc

OVERRIDE_AR = mipsel-openwrt-linux-ar

OVERRIDE_LD = mipsel-openwrt-linux-ld


#CONFIG_wrappers :=

可以看到在 -DNO_EXECUTABLES 开关从 CONFIG_ENV_CFLAGS 中去掉了, 例子可执行程序进入了编译范围

 

重新载入配置文件, 交叉编译可执行程序

  1. $ make reconfig

  2. $ make

  3.  

如果有如下的编译输出, 则代表 mqtt-example 等一系列样例程序已经被成功的编译出来, 它们存放在 output/release/bin 目录下

dev-sign-example  linkkit-example-solo  mqtt-example  ota-example-mqtt


river@pc:~/lepu/c-sdk-v3.0.1$ file output/release/bin/*

output/release/bin/dev-sign-example:     ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1, dynamically linked, interpreter /lib/ld-, not stripped

output/release/bin/linkkit-example-solo: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1, dynamically linked, interpreter /lib/ld-, not stripped

output/release/bin/mqtt-example:         ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1, dynamically linked, interpreter /lib/ld-, not stripped

output/release/bin/ota-example-mqtt:     ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1, dynamically linked, interpreter /lib/ld-, not stripped

可以用file命令验证, 这些可执行程序确实是交叉编译到mipsel-linux架构上的

 

尝试运行样例程序

接下来, 您就可以把样例程序例如mqtt-example, 用SCP, TFTP或者其它方式, 拷贝下载到您的目标开发板上运行调试了

  • 如果一切顺利, 样例程序和同样例程在 Ubuntu 上运行效果相同, 则证明 wrappers/os/mipsel-linux 部分的HAL层代码工作正常

  • 如果样例程序运行起来, 和同样例程在 Ubuntu 上运行效果不同, 则需要再重点修改调试HAL实现

  • 也就是指 wrappers/os/mipsel-linux 目录的HAL层代码, 因为这些代码是我们从 Ubuntu 主机部分复制的, 完全可能并不适合 mipsel-linux

如此反复直到确保 libiot_hal.a 的开发没问题为止

 

 

你可能感兴趣的:(物联网,openwrt)