基于代碼抽取時的移植說明
本文介紹以獲取MQTT上云
和OTA固件升級
能力為例,描述在Windows開發(fā)主機(jī)上的SDK移植過程。
背景信息
對于使用KEIL、IAR進(jìn)行設(shè)備開發(fā)的用戶,不能使用Make的方式編譯SDK。此時用戶可以配置需要的SDK功能,使用SDK提供的抽取工具將相應(yīng)的代碼抽取出來,然后將源文件添加到開發(fā)工具中的項目后進(jìn)行編譯。
對于使用Linux作為開發(fā)環(huán)境的用戶,也可以使用本方式將代碼抽取出來之后進(jìn)行交叉編譯。
設(shè)備端的整體開發(fā)過程如下所示。
SDK功能配置
在本示例主要介紹MQTT上云和OTA固件下載功能。
在SDK的根目錄雙擊config.bat
腳本運行,彈出如下功能選擇界面(相當(dāng)于Ubuntu16.04 64位主機(jī)上的make menuconfig
命令)。
按下空格鍵可以選中或者失效相關(guān)功能,使用鍵盤的上下鍵來在不同功能之間切換。
您可使用方向鍵將高亮光條移到選項上,再按鍵盤上的
h
按鍵,將出現(xiàn)幫助文本,對選項進(jìn)行詳細(xì)說明。
例如:
如果編譯環(huán)境有自帶標(biāo)準(zhǔn)頭文件
<stdint.h>
,請使能選項PLATFORM_HAS_STDINT
。如果目標(biāo)系統(tǒng)上運行有嵌入式操作系統(tǒng),請使能選項
PLATFORM_HAS_OS
。如果目標(biāo)系統(tǒng)上支持
malloc
和free
。的動態(tài)內(nèi)存管理能力,請使能選項PLATFORM_HAS_DYNMEM
。
在本例中,我們需要MQTT上云和OTA固件下載的功能,所以需要如下選擇:
FEATURE_MQTT_COMM_ENABLED
:對應(yīng)MQTT上云功能。FEATURE_OTA_ENABLED
:對應(yīng)OTA固件下載功能。
將光標(biāo)移動到窗口底部的<Exit>
上,在彈出的保存對話框中選擇<Yes>
存盤退出配置界面。
SDK代碼抽取
通過以上步驟,SDK根目錄下的make.settings
功能配置文件的內(nèi)容發(fā)生變化,對應(yīng)到用戶所選擇的功能,如下所示:
FEATURE_MQTT_COMM_ENABLED=y
FEATURE_MQTT_DEFAULT_IMPL=y
# FEATURE_MQTT_PRE_AUTH is not set
FEATURE_MQTT_DIRECT=y
...
FEATURE_OTA_ENABLED=y
其中對應(yīng)所選功能點的開關(guān)FEATURE_MQTT_COMM_ENABLED
和FEATURE_OTA_ENABLED
都已被設(shè)置為y
,表示已打開。
運行代碼抽取工具 extract.bat
,該腳本運行之后的界面如下所示:
抽取后的代碼說明
如同config.bat
腳本的輸出是make.settings
文件,extract.bat
腳本的輸入是make.settings
,輸出是output
文件。
單擊output
文件,查看其詳細(xì)內(nèi)容。output
目錄結(jié)構(gòu)如下:
output/
+-- eng
| +-- certs
| +-- dev_model
| +-- dev_sign
| +-- infra
| +-- mqtt
| +-- ota
| +-- wrappers
| +-- external_libs
+-- examples
其中output/eng
目錄就對應(yīng)SDK相關(guān)功能抽取出的代碼,output/example
對應(yīng)使用SDK中API接口的示例程序。
文件或目錄 | 說明 |
| 對應(yīng)SDK和支撐SDK的HAL接口。 |
| 內(nèi)容會隨著被選擇的功能而變化。 |
| 存放驗證阿里云IoT服務(wù)端的根證書,使能TLS傳輸時出現(xiàn)。 |
| 對應(yīng)當(dāng)前被選中的 |
| 對應(yīng)當(dāng)前被選中的 |
在本例中,eng
下面的目錄如下所示:
這些功能點的例子程序都在output/examples
文件中
對接HAL接口或者wrapper接口
SDK運行時對外界所需要的依賴都以HAL_XXX
或者wrapper_xxx
進(jìn)行定義,并放于文件output\eng\wrappers\wrapper.c
中,用戶需要對其中的函數(shù)進(jìn)行實現(xiàn)。
對每個HAL_XXX
接口都有詳細(xì)的注釋和文檔,您可參考SDK根目錄下的wrappers子目錄中的wrapper參考實現(xiàn)。
抽取出來的代碼使用Make進(jìn)行編譯
用戶也可能使用GNU Make對抽取出來的代碼進(jìn)行編譯,因此在抽取出來的目錄下仍然提供了一個示例的makefile
,make之后將會生成以下內(nèi)容:
二進(jìn)制文件 | 說明 | 產(chǎn)生方式 |
| SDK主庫文件,提供所有形如 | 從 |
| 支撐SDK的HAL庫,提供形如 | 從 |
| 功能點的例子程序。 | 從 |
使用C++編譯器編譯時錯誤的處理
C++編譯器在編譯的時候判斷比gcc判斷更加嚴(yán)格,如果編譯出錯,請進(jìn)行如下編譯。
增加 -fpermissive -w, 去掉 -ansi -Wdeclaration-after-statement
總結(jié)
圖中紅色文字表示用戶執(zhí)行動作,綠色文字表示用戶得到的產(chǎn)物,過程如下圖所示。
圖中左上角是移植過程的開始,到右下角是移植過程的結(jié)束,以獲得目標(biāo)設(shè)備架構(gòu)的二進(jìn)制庫libiot_sdk.a
和libiot_hal.a
為標(biāo)志。
整個SDK的抽取都已經(jīng)完畢,您可以將output/eng
下的所有目錄加入自己的工程中編譯和集成,并參考output/examples
下的例程開始調(diào)用SDK提供的API。