全部产品
云市场

基于代码抽取时的移植说明

更新时间:2019-06-04 09:55:16

对于使用KEIL、IAR进行设备开发的用户来说,不能使用make的方式编译SDK。此时用户可以配置需要的SDK功能,使用SDK提供的抽取工具将相应的代码抽取出来,然后将源文件添加到开发工具中的项目后进行编译; 对于使用Linux作为开发环境的用户,也可以使用本方式将代码抽取出来之后进行交叉编译。

本文将以获取 MQTT上云OTA固件升级 能力为例, 描述在 Windows 开发主机上的SDK移植过程

过程说明

设备端的整体开发过程如下所示

以下是详细步骤讲解

SDK功能配置

SDK中有各种功能模块, 用户需要决定需要使用哪些功能, 在本例中假设用户需要”MQTT上云”和”OTA固件下载”的功能


在SDK的根目录双击 config.bat 脚本运行, 弹出如下的功能选择界面(相当于Ubuntu16.04 64位主机上的 make menuconfig 命令)

  • 按下空格键可以选中或者失效某个功能, 使用小键盘的上下键来在不同功能之间切换
  • 如果想知道每个选项的具体含义, 先用方向键将高亮光条移到那个选项上, 再按键盘上的”h”按键, 将出现帮助文本, 对选项进行详细说明

比如:

  • 如果编译环境有自带标准头文件, 请使能选项 PLATFORM_HAS_STDINT
  • 如果目标系统上运行有嵌入式操作系统, 请使能选项 PLATFORM_HAS_OS
  • 如果目标系统上支持 mallocfree 这样的动态内存管理能力, 请使能选项 PLATFORM_HAS_DYNMEM

在本例中, 我们需要”MQTT上云”和”OTA固件下载”的功能, 所以需要选中

  • FEATURE_MQTT_COMM_ENABLED: 对应”MQTT上云”功能
  • FEATURE_OTA_ENABLED: 对应”OTA固件下载”功能

然后将光标移动到窗口底部的 <Exit> 上, 在随后弹出的保存对话框中选 <Yes> 存盘退出配置界面

SDK代码抽取

经过上面的步骤, SDK根目录下的 make.settings 功能配置文件的内容就会发生变化, 对应到用户所选择的功能,如下所示:

  1. FEATURE_MQTT_COMM_ENABLED=y
  2. FEATURE_MQTT_DEFAULT_IMPL=y
  3. # FEATURE_MQTT_PRE_AUTH is not set
  4. FEATURE_MQTT_DIRECT=y
  5. ...
  6. FEATURE_OTA_ENABLED=y

可以注意到其中对应所选功能点的开关 FEATURE_MQTT_COMM_ENABLEDFEATURE_OTA_ENABLED 都已被设置为 y, 表示打开了

接下来运行代码抽取工具 extract.bat, 该脚本运行之后的界面如下所示:

抽取后的代码说明

如同 config.bat 脚本的输出是 make.settings 文件, extract.bat 脚本的输入是 make.settings, 输出是 output 文件夹

点击进去, 观察它的内容。output目录结构如下

  1. output/
  2. +-- eng
  3. | +-- certs
  4. | +-- dev_model
  5. | +-- dev_sign
  6. | +-- infra
  7. | +-- mqtt
  8. | +-- ota
  9. | +-- wrappers
  10. | +-- external_libs
  11. +-- examples

其中 output/eng 目录就对应的是SDK相关功能抽取出来的代码, output/example对应使用SDK中API接口的例子程序

文件或目录 说明
output/eng 对应SDK和支撑SDK的HAL接口
output/eng/infra 不对应到某个具体的功能点, 表示”基础”, 但是内容的多少会随着被选择的功能点多少而变化
output/eng/certs 不对应到某个具体的功能点, 存放着验证阿里云IoT服务端的根证书, 使能TLS传输时出现
output/eng/xxx 对应当前被选中的 xxx 功能的实现源码, 其中 output/eng/xxx/xxx_api.h 列出了这个功能的API
output/example/xxx 对应当前被选中的 xxx 功能的例子程序, 演示了如何用这个功能的API编写业务逻辑

在本例中, eng下面的目录如下所示:

这些功能点的例子程序都在 output/examples 文件夹

对接HAL接口或者wrapper接口

SDK运行时对外界所需要的依赖都以 HAL_XXX或者 wrapper_xxx进行定义,并放于文件output\eng\wrappers\wrapper.c中,用户需要对其中的函数进行实现。

对每个 HAL_XXX 接口都有详细的注释和文档, 用户可以参考SDK根目录下的wrappers子目录中的wrapper参考实现。

其它

抽取出来的代码使用make进行编译

用户也可能使用 GNU Make对抽取出来的代码进行编译, 因此在抽取出来的目录下仍然提供了一个示例的makefile, make之后将会生成以下内容:

二进制文件 说明 产生方式
libiot_sdk.a SDK主库文件, 提供所有形如 IOT_XXX 的用户API output/eng 下除了 output/wrapper/* 的目录产生
libiot_hal.a 支撑SDK的HAL库, 提供形如 HAL_XXX 的底层接口 output/eng/wrappers 下源文件产生, 其中 output/eng/wrappers/wrapper.c 需要用户填写
xxx-example 功能点的例子程序 output/examples/xxx 下源文件产生, 需要通过 output 目录下运行 make prog 命令编译

使用C++编译器编译时错误的处理

C++编译器在编译的时候判断比gcc判断更加严格,如果编译的时候出错,请编译时:

  1. 增加 -fpermissive -w, 去掉 -ansi -Wdeclaration-after-statement

总结

以图中红色文字表示用户执行的动作, 用绿色文字表示用户得到的产物, 则这个过程可用下图表示为

图中左上角是移植过程的开始, 到右下角是移植过程的结束, 以获得目标设备架构的二进制库 libiot_sdk.a 和 libiot_hal.a 为标志

到此为止整个SDK的抽取都已经讲解完毕, 您可以将 output/eng 下的所有目录加入自己的工程中编译和集成, 并参考 output/examples 下的例程开始调用SDK提供的API了