VSCode+STM32嵌入式AI开发:轻量模型在64KB SRAM中的高效部署

发布时间:2026/9/13 4:09:25
VSCode+STM32嵌入式AI开发:轻量模型在64KB SRAM中的高效部署 1. 项目概述这不是一次简单的IDE切换而是一场嵌入式AI开发范式的迁移“当VSCODE碰上STM32之高效AI开发踩坑经历”——这个标题里藏着三个被行业长期割裂的关键词VSCode、STM32、AI开发。过去十年嵌入式工程师用Keil、IAR或STM32CubeIDE写裸机驱动和RTOS任务AI工程师则在PyCharm、Jupyter或VSCode里调大模型API、训小网络、搭智能体。两者像两条平行线一个在寄存器位操作里抠时序一个在GPU显存里算梯度。直到2023年Q4起我接手一个车载无感空调控制项目需求文档里赫然写着“需在STM32H743上本地运行轻量级温度预测模型输入NTC红外湿度输出PWM占空比响应延迟≤50ms功耗低于80mW”。那一刻我才意识到AI不再只是云端服务它正以毫秒级确定性挤进你手边那块贴着散热片的蓝色开发板里。这绝不是把Python脚本拖进VSCode那么简单。真正的“高效AI开发”是让VSCode从代码编辑器升维为嵌入式AI全栈工作台前端要能实时可视化传感器流数据中端要支持模型量化与C代码生成后端要无缝烧录调试并采集真实芯片上的推理耗时。我试过用KeilCMSIS-NN手动移植TensorFlow Lite Micro三天没跑通浮点精度对齐也试过CubeIDEAI插件结果模型编译后RAM暴涨200%直接触发HardFault。最终落地的方案是用VSCode作为唯一入口串联起Python数据预处理、ONNX模型优化、CMSIS-NN自动代码生成、OpenOCD硬件调试、以及自研的串口数据流监控终端——整套流程从模型输入到板级验证压缩在12分钟内完成。这篇文章不讲“VSCode怎么安装”也不教“STM32点灯”而是聚焦一个硬核问题当AI模型必须在64KB SRAM里完成推理VSCode如何成为那个最锋利的手术刀适合正在做边缘AI产品、想摆脱Keil许可证束缚、或需要让算法工程师与嵌入式工程师在同一个编辑器里协同的团队。你不需要会写C模板元编程但得愿意拆开ST-Link探针看SWD信号波形。2. 整体设计思路为什么放弃成熟IDE选择VSCode构建嵌入式AI流水线2.1 传统工具链的三大不可解困局先说清楚我们为什么要“折腾”不是为了炫技而是被现实逼出来的。在车载空调项目初期我们沿用Keil MDK-ARM v5.38 CMSIS-NN v5.8.0组合结果在模型部署阶段连续踩中三座大山内存墙一个仅含3层Conv1DReLU的LSTM温度预测模型ONNX格式1.2MB经CMSIS-NN转换后生成的C代码占用Flash 380KB、SRAM 92KB。而STM32H743VI的SRAM总量才1MB其中DTCM仅128KB且必须预留RTOS任务栈、CAN总线缓冲区、USB描述符等共约320KB。实测启动即HardFault定位发现是模型权重数组强制对齐到64字节边界导致碎片化严重。Keil的scatter文件虽可手动分配但每次模型结构调整都要重写链接脚本——算法工程师改个卷积核大小嵌入式工程师就得熬通宵调内存布局。调试盲区Keil的仿真器无法观测模型推理过程中的中间张量。比如ReLU层输出全为零你只能靠printf打桩但串口打印本身就会干扰50ms实时性要求。我们曾用逻辑分析仪抓取GPIO翻转波形反推执行路径耗时两天才定位到是量化参数scale值溢出导致整层失效。协作断层算法团队用PyTorch训练模型导出ONNX后丢给嵌入式组。后者用CMSIS-NN的Python脚本转换再手动复制.h/.c文件到Keil工程。某次模型更新漏传了一个bias数组板子跑起来温度预测偏差±15℃产线已贴片5000片。根本原因在于没有统一的模型版本管理、没有自动化校验、没有跨角色可读的中间表示。2.2 VSCode方案的核心设计哲学分层解耦 协议标准化VSCode不是万能胶水它的优势在于协议开放性。我们放弃“一个IDE搞定所有”的幻想转而构建四层解耦架构层级功能定位关键技术选型VSCode角色数据层传感器原始数据采集与标注Python PySerial Pandas通过Remote-SSH连接树莓派网关直接读取/写入CSV标注文件模型层ONNX模型优化与量化onnx-simplifier onnxruntime-tools TFLite Micro Converter安装Python扩展调用CLI命令行工具输出带量化注释的ONNX嵌入式层C代码生成与交叉编译CMSIS-NN Generator GNU Arm Embedded Toolchain配置CMakeLists.txt用CMake Tools插件一键生成Makefile硬件层烧录、调试、实时监控OpenOCD GDB 自研串口协议解析器通过Cortex-Debug插件连接ST-Link自定义launch.json注入数据流监控这个设计的关键转折点是把模型作为一等公民。我们强制规定所有模型必须以ONNX格式提交到Git仓库且附带model_info.json含输入shape、量化参数、预期延迟。VSCode的Tasks功能被改造为“模型验证流水线”保存.onnx文件时自动触发Python脚本检查输入维度是否匹配STM32 ADC采样率如12-bit10kHz → input_shape[1,120]校验量化scale是否在[0.001,10]安全区间。一旦失败编辑器底部状态栏立刻标红并提示具体错误行——这比Keil编译报错快10倍因为校验发生在代码生成前。2.3 为什么不用STM32CubeIDE一个被低估的致命缺陷很多人会问CubeIDE不是ST官方推荐吗它确实集成了AI插件X-CUBE-AI但我们在对比测试中发现其底层逻辑存在硬伤。CubeIDE的AI插件本质是封装了CMSIS-NN Generator的GUI而该工具在2023年发布的v7.3.0版本中默认启用“权重合并优化”——即将多个卷积层的bias数组合并为单个大数组。这在通用MCU上没问题但在STM32H7系列中DTCM RAM最快内存仅128KB且必须按128字节对齐。合并后的bias数组若超过128KB链接器会强制将其放入ITCM速度慢50%或SRAM1需额外总线仲裁。我们实测同一模型在CubeIDE生成代码下推理耗时87ms在VSCode手动禁用合并优化后降至43ms。更致命的是CubeIDE不暴露此开关你只能反编译生成的C代码找__attribute__((section(.bss)))声明去手动拆分——这已经脱离了“高效开发”的范畴。VSCode的胜利恰恰在于它不做封装只做连接。当我们需要调整CMSIS-NN Generator参数时直接在VSCode终端敲cmsisnn_gen --modelmodel.onnx --output_dirsrc/ai --disable-merge-bias --quantizedynamic参数含义一目了然且所有命令都记录在.vscode/tasks.json里新人拉取代码后按CtrlShiftP调出“Tasks: Run Task”即可复现全流程。这种透明性是GUI IDE永远无法提供的确定性。3. 核心细节解析从ONNX模型到STM32可执行文件的七道关卡3.1 第一道关ONNX模型的“嵌入式友好度”预检不是所有ONNX模型都能跑在STM32上。我们制定了一套硬性准入规则由VSCode的Python扩展自动执行。当算法工程师提交temp_predict.onnx时以下检查在3秒内完成算子白名单校验CMSIS-NN仅支持Conv, Relu, MaxPool, GlobalAveragePool, Reshape等23个算子。我们用onnx.helper.printable_graph(model.graph)提取所有node.op_type发现模型中存在Gather用于动态索引——立即拦截要求改用静态索引或替换为Slice。实测某次因未拦截Softmax生成代码在H7上触发FPU异常因为CMSIS-NN的Softmax实现要求输入必须为Q7格式而模型导出时误设为Q15。张量维度合规性STM32的DMA传输要求输入buffer长度为2的幂次。模型输入shape为[1,120]120不是2的幂会导致ADC采样后需软件补零增加1.2ms延迟。解决方案是在VSCode中配置Python任务自动插入Reshape节点将输入转为[1,128]多余8个点用前向填充forward-fill。代码片段如下import onnx from onnx import helper, numpy_helper model onnx.load(temp_predict.onnx) # 插入Reshape节点 reshape_node helper.make_node( Reshape, inputs[input, new_shape], outputs[reshaped_input] ) # new_shape tensor设为[1,128] new_shape numpy_helper.from_array(np.array([1,128], dtypenp.int64)) model.graph.initializer.extend([new_shape])量化参数安全性审计重点检查QuantizeLinear节点的scale值。我们发现某版模型scale0.0003导致int8权重在反量化时精度损失超15%。VSCode的Python脚本会计算理论误差error abs(scale * (int8_max - int8_min) - (max_val - min_val))若error 0.05则标红警告。这个阈值是通过在H7上实测1000次推理得出的经验值——误差超0.05时温度预测偏差必然突破±0.5℃。提示这些检查脚本全部放在项目根目录的scripts/onnx_audit.py中VSCode通过tasks.json绑定为保存时自动运行。新成员无需理解原理看到状态栏绿色对勾就知道模型合格。3.2 第二道关CMSIS-NN Generator的参数精调CMSIS-NN Generatorv7.3.0的命令行参数多达47个但真正影响STM32性能的只有5个核心参数。我们在VSCode的settings.json中预置了H743专用配置{ cmisnn.gen.model: model.onnx, cmisnn.gen.output: src/ai, cmisnn.gen.data-type: q7, // 强制int8避免q15在H7上触发FPU cmisnn.gen.disable-merge-bias: true, // 前文提过的关键开关 cmisnn.gen.quantize: dynamic, // 动态量化适配传感器数据波动 cmisnn.gen.cortex-m: cortex-m7 // 显式指定避免自动识别错误 }最关键的--data-type q7参数源于一次血泪教训某次误用q15生成代码中大量出现__SSAT饱和加法指令。在H7的双发射流水线中__SSAT需2个周期而q7的__SXTB16仅1周期。实测单次推理多耗时11ms。VSCode的配置文件强制锁定此参数杜绝人为失误。3.3 第三道关CMakeLists.txt的嵌入式特化改造VSCode的CMake Tools插件默认生成通用CMake脚本但STM32需要深度定制。我们在CMakeLists.txt中做了三处关键修改内存分区精准控制# 将模型权重强制放入DTCM RAM最快 target_link_libraries(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/ai/weights_q7.o ) set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS -Wl,--def${CMAKE_CURRENT_SOURCE_DIR}/linker_script.ld )对应的linker_script.ld中明确定义.ai_weights (NOLOAD) : ALIGN(128) { *(.ai_weights) } DTCM编译器优化策略# 启用ARM Cortex-M7专属优化 target_compile_options(${PROJECT_NAME} PRIVATE -mcpucortex-m7 -mfpufpv5-d16 -mfloat-abihard -O3 -ffast-math -fno-unroll-loops # 关键避免循环展开导致代码膨胀 )模型版本防伪机制# 从ONNX文件哈希生成版本号写入固件 execute_process(COMMAND md5sum ${CMAKE_CURRENT_SOURCE_DIR}/model.onnx OUTPUT_VARIABLE MODEL_HASH) string(REPLACE ; MODEL_HASH_LIST ${MODEL_HASH}) list(GET MODEL_HASH_LIST 0 HASH_VAL) add_definitions(-DMODEL_VERSION${HASH_VAL})这样烧录后通过串口发送ATMODEL?即可返回模型哈希确保产线固件与设计模型完全一致。3.4 第四道关OpenOCD调试脚本的AI感知增强标准OpenOCD配置只能看寄存器我们为其注入AI上下文。在.openocd.cfg中添加# 在模型推理函数入口设置硬件断点 proc set_ai_breakpoint {} { gdb_breakpoint ai_run_inference # 自动打印输入张量首地址 gdb_command p/x *(int8_t*)input_buffer # 记录推理开始时间戳 gdb_command set $start_time *(uint32_t*)0x20000000 }更关键的是我们开发了VSCode插件stm32-ai-debug它能在调试时实时解析模型中间层输出。当GDB停在conv1d_layer1函数末尾时插件自动读取layer1_output数组位于DTCM地址0x20000100用Python绘图库生成热力图并嵌入VSCode侧边栏——这是Keil永远做不到的“所见即所得”调试体验。3.5 第五道关串口数据流监控终端的实时性保障AI模型需要真实传感器数据验证。我们抛弃传统串口助手用VSCode的Terminal开发了ai-monitor工具零拷贝数据接收利用Linuxtermios配置设置VMIN0 VTIME1实现1ms轮询避免传统串口助手50ms延迟。时间戳对齐每帧数据附加硬件定时器计数TIM2_CNT在VSCode中用D3.js绘制时序图精确比对ADC采样时刻与模型推理完成时刻。异常自动标记当连续3帧温度预测值跳变5℃终端自动标红并截图保存供算法团队复现。这套监控使模型迭代周期从“天级”压缩到“小时级”。某次发现模型在湿度80%时预测失准我们用监控终端回放24小时数据15分钟内定位到是量化参数未覆盖高湿工况——这在Keil环境下需要手动导出日志再用Excel分析。4. 实操过程详解从零搭建VSCode STM32 AI开发环境的完整步骤4.1 环境准备硬件与软件清单2024年实测可用硬件清单全部淘宝可购总价300元主控板正点原子STM32H743ZI-Nucleo注意必须选ZI型号Nucleo-144底板自带ST-Link v3支持SWD高速下载调试器ST-Link V3 Mini单独购买兼容性优于V2支持CMSIS-DAP协议传感器模组AS6212温湿度MLX90614红外I2C接口供电3.3V通信模块CH340G USB转TTL用于串口监控避免使用板载USB导致干扰软件清单全部开源免费VSCodev1.85.12024年1月最新稳定版关键插件C/Cv1.17.12微软官方提供IntelliSenseCortex-Debugv0.4.15支持OpenOCD/GDB调试CMake Toolsv1.14.32CMake项目管理Pythonv2023.20.0运行模型预处理脚本Remote-SSHv0.106.0连接树莓派数据网关工具链GNU Arm Embedded Toolchaingcc-arm-none-eabi-12.2.MPAC-2023.06-win32官方推荐支持M7 DSP指令OpenOCDv0.12.02023年12月发布修复H743 SWD时序bugCMSIS-NN Generatorv7.3.0从ARM官方GitHub release页下载注意不要使用Windows Subsystem for LinuxWSLH743的SWD调试在WSL下存在时序抖动实测下载成功率仅65%。必须在原生Windows或Linux系统运行OpenOCD。4.2 步骤一VSCode基础环境配置15分钟安装VSCode并配置中文下载官网最新版vscode官网下载安装时勾选“Add to PATH”。启动后按CtrlShiftP输入Configure Display Language选择zh-cn重启生效。安装核心插件在Extensions面板搜索并安装C/CID: ms-vscode.cpptoolsCortex-DebugID: marus25.cortex-debugCMake ToolsID: ms-vscode.cmake-toolsPythonID: ms-python.python配置C IntelliSense按CtrlShiftP→C/C: Edit Configurations (UI)在Compiler path填入C:\Program Files\GNU Arm Embedded Toolchain\12 2023-q2-update\bin\arm-none-eabi-gcc.exeInclude path添加C:\Users\YourName\STM32\cmsis_nn\IncludeC:\Users\YourName\STM32\h743xx_hal_driver\Inc验证C配置创建test.cpp输入#include arm_math.h // CMSIS-DSP头文件 int main() { return arm_sqrt_f32(4.0f); }若无红色波浪线且Ctrl鼠标悬停能跳转到arm_math.h说明配置成功。4.3 步骤二构建STM32H743最小工程20分钟创建项目目录结构stm32-ai-project/ ├── CMakeLists.txt # 顶层CMake文件 ├── src/ │ ├── main.c # 主程序 │ ├── ai/ # AI模型代码后续生成 │ └── drivers/ # HAL驱动 ├── cmake/ # CMake模块 │ └── stm32-h743.cmake # H743专用配置 └── linker_script.ld # 链接脚本编写CMakeLists.txtcmake_minimum_required(VERSION 3.20) project(stm32-ai-project C ASM) set(CMAKE_C_STANDARD 11) set(CMAKE_ASM_STANDARD 11) # 设置工具链 set(CMAKE_C_COMPILER arm-none-eabi-gcc) set(CMAKE_ASM_COMPILER arm-none-eabi-gcc) set(CMAKE_OBJCOPY arm-none-eabi-objcopy) # 包含H743专用配置 include(cmake/stm32-h743.cmake) # 添加可执行文件 add_executable(${PROJECT_NAME}.elf src/main.c src/drivers/stm32h7xx_hal_msp.c ) # 链接脚本 target_link_libraries(${PROJECT_NAME}.elf PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/linker_script.ld ) # 生成bin文件 add_custom_target(${PROJECT_NAME}.bin COMMAND ${CMAKE_OBJCOPY} -O binary ${PROJECT_NAME}.elf ${PROJECT_NAME}.bin DEPENDS ${PROJECT_NAME}.elf )编写main.c最小框架#include stm32h7xx_hal.h #include ai_model.h // 模型头文件暂留空 void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); // 初始化AI模型 ai_init(); while (1) { // 采集传感器数据 float sensor_data[120]; read_sensors(sensor_data); // 执行AI推理 int8_t output; ai_run_inference((int8_t*)sensor_data, output); // 控制PWM输出 set_pwm_duty(output); HAL_Delay(10); // 100Hz采样率 } }配置CMake Tools按CtrlShiftP→CMake: Select a Kit选择GCC for ARM。然后CMake: Configure等待生成build/目录。此时build/compile_commands.json已就绪VSCode的IntelliSense可精准跳转。4.4 步骤三集成AI模型30分钟准备ONNX模型从算法团队获取temp_predict.onnx放入项目根目录。用VSCode打开右键→Run Task→ONNX Audit确认无报错。生成C代码在VSCode终端执行cmsisnn_gen --modeltemp_predict.onnx \ --output_dirsrc/ai \ --data-typeq7 \ --disable-merge-bias \ --quantizedynamic \ --cortex-mcortex-m7成功后src/ai/下生成model_data.h、model_data.c、weights_q7.c等文件。修改CMakeLists.txt引入模型在add_executable中添加src/ai/model_data.c src/ai/weights_q7.c并添加编译定义target_compile_definitions(${PROJECT_NAME}.elf PRIVATE CMSIS_NN __ARM_ARCH_7EM__ )在main.c中调用模型#include src/ai/model_data.h void ai_init() { // 初始化CMSIS-NN arm_cfft_instance_f32 S; arm_cfft_init_f32(S, 128); } void ai_run_inference(int8_t* input, int8_t* output) { // 调用生成的推理函数 temp_predict(input, output); }编译验证CMake: Build观察终端输出。若出现undefined reference to temp_predict检查model_data.c是否被正确加入编译列表。4.5 步骤四OpenOCD调试配置25分钟编写.openocd.cfgsource [find interface/stlink.cfg] transport select hla_swd source [find target/stm32h7x.cfg] # 重置并halt reset_config none init reset halt # 加载固件 flash write_image erase ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.elf verify_image ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.elf # 设置AI调试钩子 proc ai_debug_hook {} { echo AI Debug Hook Enabled gdb_breakpoint ai_run_inference }配置launch.json在.vscode/launch.json中{ version: 0.2.0, configurations: [ { name: STM32H743 Debug, type: cortex-debug, request: launch, servertype: openocd, cwd: ${workspaceRoot}, executable: ${workspaceRoot}/build/${workspaceFolderBasename}.elf, configFiles: [${workspaceRoot}/.openocd.cfg], preLaunchTask: Build, svdFile: ${workspaceRoot}/STM32H743x.svd, armToolchainPath: C:/Program Files/GNU Arm Embedded Toolchain/12 2023-q2-update/bin/ } ] }启动调试按F5VSCode自动启动OpenOCD加载固件停在main()入口。按F10单步执行当走到ai_run_inference时观察寄存器窗口中R0输入指针、R1输出指针的值是否合理。4.6 步骤五串口监控终端部署10分钟安装ai-monitor工具在VSCode终端执行pip install pyserial matplotlib numpy git clone https://github.com/your-org/ai-monitor.git cd ai-monitor python setup.py install配置串口参数编辑ai-monitor/config.yamlport: COM5 # 根据设备管理器确认 baudrate: 115200 timeout: 0.1 ai_model_hash: a1b2c3... # 从CMake生成的MODEL_VERSION复制启动监控在VSCode Terminal中执行ai-monitor --plot --log-level debug终端将实时显示温度预测曲线并在检测到异常时自动保存anomaly_20240101_120000.png。5. 常见问题与排查技巧实录那些官方文档不会写的坑5.1 问题速查表高频故障与根因分析现象可能根因排查命令/方法解决方案OpenOCD连接失败报错Unable to match requested speed 4000 kHzST-Link固件版本过旧st-info --probe查看固件版本升级ST-Link固件下载STSW-LINK007运行STLinkUpgrade.exe模型推理结果全为0但编译无报错权重数组未初始化或地址错误在GDB中执行x/10xb weights_q7[0]检查linker_script.ld中.ai_weights段是否正确映射到DTCM确认__attribute__((section(.ai_weights)))声明位置VSCode Intellisense无法跳转到arm_math.h函数C配置中Include path路径错误CtrlShiftP→C/C: Show References在c_cpp_properties.json中将C:/path/to/cmsis_nn/Include改为绝对路径且末尾不加/ai_run_inference函数调用后HardFault输入buffer未按16字节对齐在GDB中执行info registers查看SP值在main.c中声明int8_t input_buffer[128] __attribute__((aligned(16)));串口监控终端显示数据乱码串口波特率不匹配或电平不兼容用逻辑分析仪抓取TX引脚波形确认CH340G模块供电为3.3V非5V在main.c中设置huart1.Init.BaudRate 1152005.2 独家避坑技巧来自产线的血泪经验技巧1用__attribute__((section(.ram_func)))把关键函数搬进RAMCMSIS-NN的arm_convolve_s8函数在Flash中执行需约1200周期搬进ITCM RAM后仅需320周期。在model_data.c中__attribute__((section(.ram_func))) void temp_predict(int8_t* input, int8_t* output) { // 原有函数体 }并在linker_script.ld中添加.ram_func : { *(.ram_func) } ITCM这招让我们的推理耗时从68ms降至41ms且无需更换芯片。技巧2用volatile修饰传感器buffer防止编译器优化某次模型在Debug模式下正常Release模式下输出全0。定位发现GCC-O3将sensor_data数组优化为寄存器变量导致DMA传输后数据未刷新。解决方案volatile int8_t sensor_data[128]; // 关键加volatile HAL_ADC_Start_DMA(hadc1, (uint32_t*)sensor_data, 128, DMA_NORMAL);这个细节Keil文档从不提及但却是Release模式稳定的基石。技巧3ST-Link V3的隐藏调试模式当遇到“Download failed: No ACK received”时不是硬件故障而是ST-Link进入了低功耗模式。长按ST-Link上的NRST按钮3秒LED会快闪此时松开即可强制唤醒。这个操作比换线缆、重装驱动快10倍。技巧4VSCode终端编码问题导致中文乱码在Windows上VSCode终端默认GBK编码但Python脚本用UTF-8。执行chcp 65001切换为UTF-8再在VSCode设置中添加terminal.integrated.defaultProfile.windows: Command Prompt, terminal.integrated.profiles.windows: { Command Prompt: { path: cmd.exe, args: [/k, chcp, 65001] } }从此告别print(温度)显示为╬┬∂»的尴尬。5.3 性能调优实战从43ms到38ms的最后5ms项目交付前客户要求将推理延迟压到40ms以内。我们已做到43ms最后5ms的挖掘过程堪称教科书级第一步定位瓶颈在ai_run_inference函数前后插入DWT周期计数CoreDebug-DEMCR | CoreDebug_DEMCR_TRCENA_Msk; DWT-CTRL | DWT_CTRL_CYCCNTENA_Msk; DWT-CYCCNT 0; temp_predict(input, output); uint32_t cycles DWT-CYCCNT;测试发现arm_convolve_s8占总周期72%其中arm_mat_mult_s8子函数占其85%。第二步替换汇编实现CMSIS-NN v7.3.0的arm_mat_mult_s8是C语言实现。我们从ARM官方GitHub找到其M7汇编版本CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_s8.c但发现它依赖__SXTB16指令。在VSCode中搜索arm_convolve_s8定位到生成的model_data.c将调用语句arm_convolve_s8(conv_params, input_dims, input, filter_dims, weights, output_dims, output);替换为arm_convolve_s8_fast(conv_params, input_dims, input, filter_dims, weights, output_dims,