【官方原创】Keil工程使用NEAI库的异常问题 LAT1457

张开发
2026/4/17 16:22:39 15 分钟阅读

分享文章

【官方原创】Keil工程使用NEAI库的异常问题 LAT1457
关键字AI NEAIKeil1. 简介最近在给客户完成电机预测性维护类的POC项目时使用Keil编译器时遇到了一个NEAI库的异常在和欧洲NEAI团队调查过程中发现了比较奇怪的BUG本文将介绍该问题发生的条件和后续的规避方法。2. 项目介绍该项目是和电机相关的预测性维护项目需要模拟一些异常的情况然后使用NEAI进行建模和部署。我们通过小夹子模拟了电机带动风扇的不平衡情况如下图1. 不平衡模拟然后采集正常和异常的数据使用NEAI的Abnormal detection类方法进行训练训练完成后进行部署。3. 发生异常发生异常是在部署的时候使用neai_anomalydetection_detect这个API的返回值发生了异常如下图2所示。图2. 出现问题的API该函数使用input_user_buffer中的数据进行推理然后将结果返回到similarity变量中。similarity变量的值范围为0~100表示input_user_buffer中的数据和正常数据相比相似度大概是多少通过这个返回结果可以判断设备运转是正常还是异常。但是在实际部署测试的时候发现similarity变量的值有时候会超过100明显是一个不合理的值。4. 调试过程该问题非常隐蔽和难以发现欧洲NEAI开发团队的同事也花了非常多的精力才定位到发现问题的点图3. 单步调试发现问题的点在上图3中目前正在执行NEAI库中的log函数其中S0的值0.046875是正确的值此时单步执行下一步汇编代码中的VMOV将R0的值移到了S0导致S0的值不正确变为一个非常小的值1.08577e-19。图4. S0写回到R0然后程序继续执行log函数返回-43.6668并重新将S0 VMOV到R0。图5. 第二次迭代程序继续进行第二次迭代这时候R0的值已经变为了负数-43.6668继续将R0 VMOV到S0。图6. S0出现NAN最终S0中一个负数的出现会导致执行log函数后出现NAN的数据此刻neai_anomalydetection_detect 退出执行并返回了错误的结果。5. 异常原因发生异常的原因主要是因为在执行log函数前一个错误的VMOV指令而为什么会生成错误的VMOV指令貌似和使用的编译器有关。后续又进行了一些对比测试使用gcc编译器编译该段代码发现没有问题。NEAI团队使用了源码Keil编译器进行编译也没有问题。唯独使用LibKeil 编译器会出现该问题。NEAI 团队进一步对代码进行了简化分析发现只要使用lib链接的方式Keil ARMv6的编译器并使用log函数时就会复现该问题。至此几乎可以断定该问题是由Keil链接器导致的NEAI 团队后续会联系ARM团队并反馈该问题。6. 规避方法总结以上规避的方法就很明确了1. 使用源码编译。但客户几乎无法获取NEAI库的源码2. 避免使用Keil。3. 请NEAI团队帮忙编译。重要通知 - 请仔细阅读 意法半导体公司及其子公司 “ST”保留随时对 ST 产品和 / 或本文档进行变更的权利恕不另行通知。买方在订货之前应获取关于 ST 产 品的最新信息。 ST 产品的销售依照订单确认时的相关 ST 销售条款。 买方自行负责对 ST 产品的选择和使用 ST 概不承担与应用协助或买方产品设计相关的任何责任。 ST 不对任何知识产权进行任何明示或默示的授权或许可。 转售的 ST 产品如有不同于此处提供的信息的规定将导致 ST 针对该产品授予的任何保证失效。 ST 和 ST 徽标是 ST 的商标。若需 ST 商标的更多信息请参考 www.st.com/trademarks。所有其他产品或服务名称均为其 各自所有者的财 产。 本文档是ST中国本地团队的技术性文章旨在交流与分享并期望借此给予客户产品应用上足够的帮助或提醒。若文中内容存有局限或与ST 官网资料不一致请以实际应用验证结果和ST官网最新发布的内容为准。您拥有完全自主权是否采纳本文档包括代码电路图等信息 我们也不承担因使用或采纳本文档内容而导致的任何风险。 本文档中的信息取代本文档所有早期版本中提供的信息。 © 2020 STMicroelectronics - 保留所有权利

更多文章