你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

实战经验 | Keil工程使用NEAI库的异常问题

[复制链接]
STMCU-管管 发布时间:2025-5-8 15:19

0 1 简介

最近在给客户完成电机预测性维护类的POC项目时,使用Keil编译器时遇到了一个NEAI库的异常,在和欧洲NEAI团队调查过程中发现了比较奇怪的BUG,本文将介绍该问题发生的条件和后续的规避方法。

0 2 项目介绍

该项目是和电机相关的预测性维护项目,需要模拟一些异常的情况,然后使用NEAI进行建模和部署。

我们通过小夹子模拟了电机带动风扇的不平衡情况,如下: image.png

▲ 图1. 不平衡模拟

然后采集正常和异常的数据,使用NEAI的Abnormal detection类方法,进行训练,训练完成后进行部署。

0 3 发生异常

发生异常是在部署的时候,使用neai_anomalydetection_detect这个API的返回值发生了异常,如下图2所示。 image.png

▲ 图2. 出现问题的API

该函数使用input_user_buffer中的数据,进行推理,然后将结果返回到similarity变量中。similarity变量的值范围为0~100,表示input_user_buffer中的数据和正常数据相比相似度大概是多少,通过这个返回结果,可以判断设备运转是正常还是异常。但是在实际部署测试的时候,发现similarity变量的值有时候会超过100,明显是一个不合理的值。

0 4 调试过程

该问题非常隐蔽和难以发现,欧洲NEAI开发团队的同事也花了非常多的精力才定位到发现问题的点: image.png

▲ 图3. 单步调试,发现问题的点

在上图3中,目前正在执行NEAI库中的log函数,其中S0的值0.046875是正确的值,此时单步执行下一步汇编代码中的VMOV将R0的值移到了S0,导致S0的值不正确,变为一个非常小的值1.08577e-19。 image.png

▲ 图4. S0写回到R0

然后程序继续执行log函数,返回-43.6668,并重新将S0 VMOV到R0。 image.png

▲ 图5. 第二次迭代

程序继续进行第二次迭代,这时候R0的值已经变为了负数:-43.6668,继续将R0 VMOV到S0。 image.png

▲ 图6. S0出现NAN

最终,S0中一个负数的出现,会导致执行log函数后,出现NAN的数据,此刻 neai_anomalydetection_detect退出执行,并返回了错误的结果。

0 5 异常原因

发生异常的原因,主要是因为在执行log函数前一个错误的VMOV指令,而为什么会生成错误的VMOV指令,貌似和使用的编译器有关。后续又进行了一些对比测试,使用gcc编译器编译该段代码,发现没有问题。NEAI团队使用了源码+Keil编译器进行编译,也没有问题。唯独使用Lib+Keil编译器会出现该问题。

NEAI团队进一步对代码进行了简化分析,发现只要使用lib链接的方式+Keil ARMv6的编译器,并使用log函数时,就会复现该问题。至此几乎可以断定,该问题是由Keil链接器导致的,NEAI团队后续会联系ARM团队并反馈该问题。

0 5 规避方法

总结以上,规避的方法就很明确了:

  1. 使用源码编译。(但客户几乎无法获取NEAI库的源码)
  2. 避免使用Keil。
  3. 请NEAI团队帮忙编译。
收藏 评论0 发布时间:2025-5-8 15:19

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版