日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

基于Make的交叉編譯示例

本文介紹基于Make的交叉編譯示例。如果您通過將SDK中的文件抽取出來的方式編譯SDK,則可以跳過本章。

本文以將SDK移植到arm-linux 平臺為例,演示一個完整的交叉編譯移植過程。

對于嵌入式硬件平臺,對編譯出目標平臺的libiot_sdk.a,需要如下步驟:

  1. tools/board/目錄下添加一個對應的配置文件,文件名規范為config.XXX.YYY,其中XXX部分就對應后面wrappers/os/XXX目錄的HAL層代碼。

  2. 在配置文件中,需要指定:

    • 交叉編譯器OVERRIDE_CC的路徑。

    • 交叉鏈接器OVERRIDE_LD的路徑。

    • 靜態庫壓縮器OVERRIDE_AR的路徑。

    • 編譯選項CONFIG_ENV_CFLAGS,用于C文件的編譯。

    • 鏈接選項CONFIG_ENV_LDFLAGS,用于可執行程序的鏈接。

  3. 編譯SDK,對可能出現的跨平臺問題進行修正,直到成功產生目標格式的libiot_sdk.a

  4. 您需要使用編譯方式,產生目標架構的libiot_hal.a

  5. 若目標平臺尚未被適配,則libiot_hal.a對應的源代碼在C Link SDK中并未包含,需要您自行實現HAL_*()接口。

下面以某款目前未官方適配的arm-linux目標平臺為例,演示如何編譯出該平臺上可用的libiot_sdk.a

安裝交叉編譯工具鏈

本示例以Ubuntu16.04開發環境為例。

$ sudo apt-get install -y gcc-arm-linux-gnueabihf
$ arm-linux-gnueabihf-gcc --version
arm-linux-gnueabihf-gcc (Ubuntu/Linaro 4.8.4-2ubuntu1~14.04.1) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   

添加配置文件

$ touch tools/board/config.arm-linux.demo
$ ls tools/board/
config.alios.mk3080  config.arm-linux.demo  config.ubuntu.x86       

編輯配置文件

編輯配置文件需要設置編譯選項和工具鏈,以及跳過編譯的目錄。

$ vim tools/board/config.arm-linux.demo
CONFIG_ENV_CFLAGS = \
    -D_PLATFORM_IS_LINUX_ \
    -Wall \
    -DNO_EXECUTABLES

CONFIG_ENV_LDFLAGS = \
    -lpthread -lrt

OVERRIDE_CC = arm-linux-gnueabihf-gcc
OVERRIDE_AR = arm-linux-gnueabihf-ar
OVERRIDE_LD = arm-linux-gnueabihf-ld

CONFIG_wrappers :=           
重要

CONFIG_wrappers :=表示跳過對wrappers目錄的編譯,以及-DNO_EXECUTABLES不要產生可執行程序。在編譯未被適配平臺的庫可以避免產生過多錯誤。

選擇配置文件

$ make reconfig

SELECT A CONFIGURATION:

1) config.alios.mk3080
2) config.arm-linux.demo
3) config.ubuntu.x86

#? 2

SELECTED CONFIGURATION:

VENDOR :   arm-linux

MODEL  :   demo
            

交叉編譯產生庫文件libiot_sdk.a

本步驟不編譯HAL,只是驗證配置文件中的交叉編譯參數是否正確,如果出現錯誤請對配置文件再次進行修改,直到編譯成功。

$ make

BUILDING WITH EXISTING CONFIGURATION:


VENDOR :   arm-linux

MODEL  :   demo


[CC] infra_timer.o                      <=  ...
[CC] infra_json_parser.o                <=  ...
[CC] infra_preauth.o                    <=  ...
            

獲取交叉編譯的產物,包括靜態庫和頭文件

$ ls -1 output/release/lib/
libiot_sdk.a
libiot_tls.a
            
  • libiot_sdk.a文件是編譯好的物聯網平臺SDK,已經是ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV)格式,也就是arm-linux格式的交叉編譯格式。

  • libiot_tls.a是一個裁剪過的加解密庫,您可以選擇使用,也可以選擇使用平臺自帶的加解密庫,以減小最終固件的尺寸。

$ ls -1 output/release/include/

dev_model_api.h
dev_sign_api.h
infra
mqtt_api.h
            

dev_sign_api.h是使用SDK中設備簽名功能需要包含的頭文件,類似mqtt_api.h是使用SDK中MQTT上云功能需要的,infra下的頭文件也請加入編譯搜索路徑。

開發未適配平臺的HAL層

對于實現平臺抽象層接口HAL_XXX_YYY()的庫libiot_hal.a,不限制其編譯和產生的方式。

您也可以借助物聯網平臺設備端C Link SDK的編譯系統來開發和產生。

復制一份HAL層實現代碼

wrappers/os下需要創建一個與tools/board/config.XXX.YYY中的XXX一樣的目錄用于存放HAL實現。

由于目標平臺為arm-linux,因此可以復制Ubuntu下面的HAL實現,下面是操作示例:

$ cd wrappers/os/

$ ls
freertos  nos  nucleus  ubuntu

wrappers/os$ cp -rf ubuntu arm-linux

wrappers/os$ rm -f arm-linux/HAL_UART_linux.c

wrappers/os$ ls
arm-linux freertos  nos  nucleus  ubuntu

wrappers/os$ tree -A arm-linux/
arm-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
            

打開之前被關閉的編譯開關

$ vim tools/board/config.arm-linux.demo

CONFIG_ENV_CFLAGS = \
    -D_PLATFORM_IS_LINUX_ \
    -Wall\
    -DNO_EXECUTABLES

CONFIG_ENV_LDFLAGS = \
    -lpthread -lrt

OVERRIDE_CC = arm-linux-gnueabihf-gcc
OVERRIDE_AR = arm-linux-gnueabihf-ar
OVERRIDE_LD = arm-linux-gnueabihf-ld

# CONFIG_wrappers :=
          

CONFIG_wrappers :=前添加了#符號,表示這一行已被注釋,wrappers將會進入編譯過程。

嘗試交叉編譯被復制的HAL層代碼

$ make reconfig

SELECT A CONFIGURATION:

1) config.alios.mk3080
2) config.arm-linux.demo
3) config.ubuntu.x86

#? 2

SELECTED CONFIGURATION:

VENDOR :   arm-linux
MODEL  :   demo

...


$ make
            

wrappers/os/arm-linux/*.c編譯成功,產生arm-linux格式的libiot_hal.a

交叉編譯樣例程序

  • 有了libiot_hal.alibiot_tls.a,以及libiot_sdk.a,可以嘗試交叉編譯樣例的可執行程序,并在目標嵌入式硬件開發板上運行。

  • 去掉config.arm-linux.demo里面的-DNO_EXECUTABLES開關,使*/examples/目錄下的樣例源碼被編譯出來。

  • 刪掉-DNO_EXECUTABLES開關時,將上面一行-Wall后面的''符號也刪掉。

修改后的config.arm-linux.demo內容如下所示。


$ vi tools/board/config.arm-linux.demo

CONFIG_ENV_CFLAGS = \
    -D_PLATFORM_IS_LINUX_ \
    -Wall

CONFIG_ENV_LDFLAGS = \
    -lpthread -lrt

OVERRIDE_CC = arm-linux-gnueabihf-gcc
OVERRIDE_AR = arm-linux-gnueabihf-ar
OVERRIDE_LD = arm-linux-gnueabihf-ld

# CONFIG_wrappers :=
            

-DNO_EXECUTABLES開關從CONFIG_ENV_CFLAGS中已去掉,示例可執行程序進入了編譯范圍。

重新載入配置文件,交叉編譯可執行程序

$ make reconfig

$ make            

如果有如下編譯輸出,則表示mqtt-example等一系列示例程序已被成功編譯,并存放在output/release/bin目錄下。

[LD] dev-sign-example                   <=  ...
[LD] mqtt-example                       <=  ...
[LD] linkkit-example-solo               <=  ...

$ cd output/release/bin/

$ ls
dev-sign-example  linkkit-example-solo  mqtt-example

$ file *

dev-sign-example:     ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked ...

linkkit-example-solo: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked ...

mqtt-example:         ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked ...
            

可以用file命令驗證可執行程序是否交叉編譯到arm-linux架構中。

運行示例程序

您可以把示例程序例如mqtt-example,用SCPTFTP或者其它方式,拷貝下載到您的目標開發板上運行調試。

  • 如果樣例程序和同樣例程在Ubuntu上運行效果相同,則證明wrappers/os/arm-linux部分的HAL層代碼工作正常。

  • 如果樣例程序運行起來,和同樣例程在 Ubuntu上運行效果不同,則需要再重點修改調試HAL實現。

  • 也就是指wrappers/os/arm-linux目錄的HAL層代碼,因為這些代碼是從Ubuntu主機部分復制的,完全可能并不適合arm-linux

如此反復直到確保libiot_hal.a的開發沒問題為止。