通过下图中还是没法定位问题?,下面中的dtoa.c,指的是什么,C库的函数吗?
查看更多
dtoa 意思是 double 转 ASCII 码,一般 vsnprintf, sprintf 这类函数会用到的,大概率是用了浮点数打印。看到_Balloc(会用到库自带的动态申请内存) 和 __sspirntf_r(_r 的意思是重入,reentrant) 应该是 gcc 编译器带的库吧,dtoa 这个函数比较坑会用到库里自带的动态分配内存。如果你正好是 gcc(newlibc) + 多线程 + 浮点数打印,你可以自己搜索下相关内容软件导致的芯片死机会进入到对应异常里,只要能够复现就很容易查了
不认得的,就当成编译器提供的。这种把错误定位指向编译器提供的代码的基本可以忽略了。
欢迎发表与嵌入式相关的技术分享、开发技巧、工具介绍、技术设想、职业心得、行业评论等对他人有启发,排版优雅的文章
回到 顶部
发布 问题
分享 好友
手机 浏览
投诉 建议
回到 底部
我这边确实有两个线程,频繁在使用snprintf转换0.1f的double进行浮点型打印。问题应该是这里,但是感觉还是很难查,老化了4片板子,有一台到48小时后才挂的,另外几台还是正常的😂
那这个是newlib库的问题,这个论坛也有讨论的
https://club.rt-thread.org/ask/article/3376.html
库的官方资料,按官方的适配很费空间,每个线程要多分配 1k 多字节空间吧(struct _reent),也麻烦
https://sourceware.org/newlib/libc.html#Reentrancy
相似的问题
https://nadler.com/embedded/newlibAndFreeRTOS.html
看你应用的环境,偷懒的话调用 snprintf (使用浮点)加个互斥锁就行了,也可以找个重新实现 snprintf 的方案