You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mindspore/mindspore/lite/micro/example/mnist_x86/README.md

6.2 KiB

Arm Cortex-M编译部署

Linux Cortex-M IOT C/C++ 全流程 模型编译 模型代码生成 模型部署 推理应用 初级 中级 高级

Arm Cortex-M编译部署

本教程以在STM32F746单板上编译部署生成模型代码为例演示了codegen编译模型在Cortex-M平台的使用。更多关于Arm Cortex-M的详情可参见其官网

STM32F746编译依赖

模型推理代码的编译部署需要在windows上安装Jlink、STM32CubeMXgcc-arm-none-ebai等工具来进行交叉编译。

STM32F746构建与运行

首先使用codegen编译LeNet模型生成对应的STM32F46推理代码。具体命令如下

./codegen --codePath=. --modelPath=LeNet.ms --moduleName=LeNet --target=ARM32M

代码工程说明

├── LeNet
└── operator_library
算子静态库目录说明

在编译此工程之前需要预先获取Cortex-M 平台对应的算子库。

预置算子静态库的目录如下:

├── operator_library    # 对应平台算子库目录
    ├── include         # 对应平台算子库头文件目录
    └── lib             # 对应平台算子库静态库目录

生成代码工程目录如下:

├── LeNet               # 生成代码的根目录
    ├── benchmark       # 生成代码的benchmark目录
    ├── include         # 模型推理代码对外暴露头文件目录
    └── src             # 模型推理代码目录

代码工程编译

环境测试

安装好交叉编译所需环境后需要在windows环境中依次将其加入到环境变量中

gcc -v               # 查看GCC版本
arm-none-eabi-gdb -v # 查看交叉编译环境
jlink -v             # 查看jlink版本
make -v              # 查看make版本

以上的命令均有成功返回值时表明环境准备ok可以继续进入下一步否则先安装上述环境

生成STM32F746单板初始化代码(详情示例代码)
  1. 启动 STM32CubeMX新建project选择单板STM32F746IG

  2. 成功以后,选择Makefile generator code

  3. 在生成的工程目录下打开cmd,执行make,测试初始代码是否成功编译。

    # make成功结果
    arm-none-eabi-size build/test_stm32f746.elf
       text    data     bss     dec     hex filename
       3660      20    1572    5252    1484 build/test_stm32f746.elf
    arm-none-eabi-objcopy -O ihex build/test_stm32f746.elf build/test_stm32f746.hex
    arm-none-eabi-objcopy -O binary -S build/test_stm32f746.elf build/test_stm32f746.bin
    
编译生成模型静态库
  1. 拷贝mindspore团队提供的cortex-m7的算子静态库以及对应头文件到STM32CubeMX生成的工程目录中。

  2. 拷贝codegen生成模型推理代码到 STM32CubeMX生成的代码工程目录中

    ├── .mxproject
    └── build             # 工程编译目录最终的elf文件存在于此
    └── Core
    └── Drivers
    └── LeNet             # codegen生成的cortex-m7 模型推理代码
    └── Makefile          # 组织工程makefile文件需要用户自己修改组织lenet && operator_library到工程目录中
    └── operator_library  # mindspore团队提供的对应平台算子库
    └── startup_stm32f746xx.s
    └── STM32F746IGKx_FLASH.ld
    └── test_stm32f746.ioc
    
  3. 修改makefile文件组织算子静态库以及模型推理代码

    # C includes
    C_INCLUDES =  \
    -ICore/Inc \
    -IDrivers/STM32F7xx_HAL_Driver/Inc \
    -IDrivers/STM32F7xx_HAL_Driver/Inc/Legacy \
    -IDrivers/CMSIS/Device/ST/STM32F7xx/Include \
    -Ioperator_library/include \                # 新增,指定算子库头文件目录
    -ILeNet/include \                           # 新增,指定模型推理代码头文件
    -ILeNet/src                                 # 新增,指定模型推理代码头文件
    # libraries
    LIBS = -lc -lm -lnosys -lops                # 修改导入mindspore团队提供算子库
    LIBDIR = -Ioperator_library/lib/arm32m      # 新增,指定算子库所在路径
    
  4. 在工程目录的Core/Src的main.c编写模型调用代码具体代码新增如下

  5. 在工程跟目中目录使用管理员权限打开cmd 执行 make进行编译

    make
    

STM32F746工程部署

使用jlink 将可执行文件拷贝到单板上并做推理

jlinkgdbserver           # 启动jlinkgdbserver 选定target device为STM32F746IG
jlinkRTTViewer           # 启动jlinkRTTViewer 选定target devices为STM32F746IG
arm-none-eabi-gdb        # 启动arm-gcc gdb服务
file build/target.elf    # 打开调测文件
target remote 127.0.0.1  # 连接jlink服务器
monitor reset            # 重置单板
monitor halt             # 挂起单板
load                     # 加载可执行文件到单板
c                        # 执行模型推理

执行结果

更多详情

Linux x86_64平台编译部署

Android平台编译部署