TuyaOS 编译框架说明

设备嵌入式开发产品技术讨论,包括TuyaOS、SDK、TuyaWind IDE及其他开发者工具等话题


Post Reply
yingtao_33
Posts: 209

适用范围
    联网单品, 网关, IPC

TuyaOS 编译特点

  • TuyaOS基于统一的目录结构提供统一的编译工具,支持完整的编译、打包、文档输出。

  • TuyaOS 统一了不同的开发框架和产品开发包的编译和打包过程。

  • 对开发者而言,TuyaOS 提供了统一的编译入口和开发形式。

TuyaOS基础目录结构
.
├── apps
├── application_components
├── application_driver
├── build
├── build_app.sh
├── CHANGELOG.md
├── docs
├── include
├── libs
├── LICENSE
├── Makefile
├── prepare_app.sh
├── README.md
├── scripts
└── vendor

TuyaOS 目录结构说明.png

TuyaOS 编译应用的命令
sh build_app.sh apps/tuyaos_demo_quickstart tuyaos_demo_quickstart 1.0.0
build_app.sh 参数:
$1 – 应用工程路径,如:apps/tuyaos_demo_quickstart
$2 – 应用工程名,如: tuyaos_demo_quickstart
$3 – 版本号,格式 XX.XX.XX,如: 1.0.0
$4 – 用户指令 (可选),如:clean

Tuya Wind IDE 提供一键编译功能
选择apps 目录下的应用文件夹,点击右键选择 Build Project,输入版本号即可执行编译动作。

TuyaOS 编译体系
基于xmake 体系

TuyaOS 编译脚本调用流程

  • RTOS

    RTOS 编译流程.png
  • Linux

    Linux 编译流程.png

TuyaOS local.mk
TuyaOS 使用 local.mk 来描述编译内容。

  • 存在路径
    目前编译涉及到的local.mk 主要存在以下路径:
    apps/xxx:应用工程
    application.components/xxx:每个应用组件
    application.driver/xxx:每个驱动组件
    vendor/xxx/tuyaos/tuyaos_adapter:tkl适配层

  • 符号集
    local.mk采用NDK Android.mk 的语法,是它的语法子集。
    目前支持的符号如下表所示:

    local.mk 符号集.png
  • 基础模板
    local.mk定义了每个组件/应用的编译头文件、源文件、生成物名称。

    local脚本模板.png

TuyaOS 编译步骤

  1. 将放在不同位置的,用于不同用途的源码,生成库文件。
  2. 将生成的库文件存储到 ./libs/ 目录下。
  3. 将所有的库链接成可执行文件
  4. 通过开发环境中的工具打包成固件包。

TuyaOS 编译内容和产物

编译内容和产物.png

TuyaOS 链接
链接内容基本可以固定,如果.a文件不存在,则提供空的.a文件,可以保证链接脚本的一致性。TuyaOS框架下需要链接的库,固定保存在./libs目录下。

  • 可链接库

    • xx(产品名).a,产品入口,包含了main、tuya_app_main

    • tuyaapp_componets.a,应用组件,不存在则为空包

    • tuyaapp_drivers.a,应用驱动,不存在则为空包

    • tuyaos/ipc/gw/cc/subdev.a,TuyaOS 基线库

    • tuyaos_adapter.a,适配层

  • 链接
    TuyaOS编译框架不影响原厂内容(开发环境)的编译,可以使用原厂提供的编译机制,在链接的时候加入TuyaOS的库即可。

    Code: Select all

    -l$(APP_BIN_NAME) -ltuyaapp_components -ltuyaapp_drivers -ltuyaos -ltuyaos_adapter

TuyaOS 固件包

  • 输出位置
    apps/xxx(应用)/output/xx.xx.xx(版本)/

  • 关键固件

    • QIO后缀固件,又叫生产固件。该固件还包含了应用区固件和射频校准固件,可用于生产时做模组射频参数校准。所以该固件最大。

    • UA后缀的固件是用来上传到后台的用户区固件,如果使用涂鸦云模组工具烧录时,上位机软件拉的就是该固件。

    • UG后缀固件是用来上传到后台的升级区固件,模组进行OTA 的时候,模组拉取的固件就是该固件。

FAQ
Q:调用原厂的接口或者包含原厂的头文件会出现编译报错?
A:修改对应的local.mk,在local.mk中添加原厂文件的路径。
例:在增加bk原厂的一些文件路径

Code: Select all

# 模块源代码
LOCAL_SRC_FILES := $(shell find $(LOCAL_PATH)/src -name "*.c" -o -name "*.cpp" -o -name "*.cc")

# 模块内部CFLAGS:仅供本组件使用
LOCAL_CFLAGS += -I$(ROOT_DIR)/vendor/bk7231n/bk7231n_os/beken378/func/user_driver
LOCAL_CFLAGS += -I$(ROOT_DIR)/vendor/bk7231n/bk7231n_os/beken378/driver/include
LOCAL_CFLAGS += -I$(ROOT_DIR)/vendor/bk7231n/bk7231n_os/beken378/common
LOCAL_CFLAGS += -I$(ROOT_DIR)/vendor/bk7231n/bk7231n_os/beken378/app/config
LOCAL_CFLAGS += -I$(ROOT_DIR)/vendor/bk7231n/bk7231n_os/beken378/driver/common
LOCAL_CFLAGS += -I$(ROOT_DIR)/vendor/bk7231n/bk7231n_os/beken378/os/include
LOCAL_CFLAGS += -I$(ROOT_DIR)/vendor/bk7231n/bk7231n_os/beken378/os/FreeRTOSv9.0.0

Q:开发者新增的源文件如何加入编译?
A:新增源文件放到apps/xxx/src目录下,编译系统会自动查找,加入到编译体系中进行编译。
apps/xxx/下面有个local.mk 文件会通过shell脚本自动遍历 apps/xxx/src/ 下所有的源文件,并添加到 LOCAL_SRC_FILES 变量中进行编译,生成xxx.a 库,最后进行连接。

always on the road
Posts: 20

Re: TuyaOS 编译框架说明

太详细了,谢谢楼主分享

zihao
Posts: 7

Re: TuyaOS 编译框架说明

Post Reply