打印
[应用相关]

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

[复制链接]
531|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 STM新闻官 于 2025-4-20 01:16 编辑



01简介
最近在给客户完成电机预测性维护类的POC项目时,使用Keil编译器时遇到了一个NEAI库的异常,在和欧洲NEAI团队调查过程中发现了比较奇怪的BUG,本文将介绍该问题发生的条件和后续的规避方法。
02项目介绍
该项目是和电机相关的预测性维护项目,需要模拟一些异常的情况,然后使用NEAI进行建模和部署。我们通过小夹子模拟了电机带动风扇的不平衡情况,如下:
图1. 不平衡模拟
然后采集正常和异常的数据,使用NEAI的Abnormal detection类方法,进行训练,训练完成后进行部署。

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




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

04调试过程
该问题非常隐蔽和难以发现,欧洲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。
最终,S0中一个负数的出现,会导致执行log函数后,出现NAN的数据,此刻 neai_anomalydetection_detect退出执行,并返回了错误的结果。
05异常原因
发生异常的原因,主要是因为在执行log函数前一个错误的VMOV指令,而为什么会生成错误的VMOV指令,貌似和使用的编译器有关。后续又进行了一些对比测试,使用gcc编译器编译该段代码,发现没有问题。NEAI团队使用了源码+Keil编译器进行编译,也没有问题。唯独使用Lib+Keil编译器会出现该问题。
NEAI团队进一步对代码进行了简化分析,发现只要使用lib链接的方式+Keil ARMv6的编译器,并使用log函数时,就会复现该问题。至此几乎可以断定,该问题是由Keil链接器导致的,NEAI团队后续会联系ARM团队并反馈该问题。
05规避方法
总结以上,规避的方法就很明确了:
1. 使用源码编译。(但客户几乎无法获取NEAI库的源码)
2. 避免使用Keil。
3. 请NEAI团队帮忙编译。
▼▼▼

点击按钮下载《Keil工程使用NEAI库的异常问题》原文档。
点击下载

相关阅读






使用特权

评论回复
沙发
STM新闻官|  楼主 | 2025-4-20 01:17 | 只看该作者

使用特权

评论回复
板凳
xiaoqizi| | 2025-5-6 16:53 | 只看该作者
未定义的符号错误可能是缺少相应的库文件或对象文件,或者函数、变量的声明与定义不一致等

使用特权

评论回复
地板
木木guainv| | 2025-5-6 19:08 | 只看该作者
在多个源文件中,对某个函数的声明和定义不匹配,导致链接时找不到正确的符号

使用特权

评论回复
5
Jiangxiaopi| | 2025-5-6 21:21 | 只看该作者
检查代码中所有函数和变量的声明与定义是否一致,确保正确包含了所需的库文件和对象文件

使用特权

评论回复
6
荣陶陶| | 2025-5-7 08:03 | 只看该作者
重复定义错误通常是由于在多个源文件中定义了相同的全局变量或函数,或者头文件中的定义被多次包含且没有进行适当的防卫处理

使用特权

评论回复
7
Zhiniaocun| | 2025-5-7 10:40 | 只看该作者
对于全局变量和函数,确保在一个源文件中只进行一次定义,其他源文件中使用[size=0.875]extern关键字进行声明

使用特权

评论回复
8
Zuocidian| | 2025-5-7 13:04 | 只看该作者
仔细检查代码中指针的使用,确保指针指向有效的内存空间。对于数组的访问,要确保索引值在合法范围内

使用特权

评论回复
9
Puchou| | 2025-5-7 15:17 | 只看该作者
在中断服务程序中,避免修改与堆栈相关的数据,除非有充分的保护措施

使用特权

评论回复
10
Xiashiqi| | 2025-5-7 17:57 | 只看该作者
不同的编译器对C/C++语言标准的支持程度不同,或者编译器的优化选项会影响代码的生成和执行

使用特权

评论回复
11
小海师| | 2025-5-7 20:11 | 只看该作者
尽量使用与NEAI库编译时相同版本的编译器,或者根据NEAI库的要求调整当前工程的编译器设置。如果无法更换编译器,可以尝试调整编译器的优化选项,或者对代码进行一些修改以适应当前的编译器。

使用特权

评论回复
12
Haizangwang| | 2025-5-7 22:31 | 只看该作者
对代码进行全面的审查和测试,使用调试工具逐步执行代码,观察程序的执行流程和变量的变化

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:您的嵌入式应用将得益于意法半导体领先的产品架构、技术、多源产地和全方位支持。意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器。

1287

主题

1512

帖子

20

粉丝