搜索
bottom↓
回复: 28

求教: gcc, 开FPU后printf输出浮点数死机

[复制链接]

出0入362汤圆

发表于 2022-5-6 22:17:05 | 显示全部楼层 |阅读模式
mcu是gd32ffprtgu6 (魔改的gd32f30x), 只要开了FPU, 再用printf输出浮点变量就直接HardFault了
(Makefile里编译选项加 CPFLAGS += -mfloat-abi=hard -mfpu=vfpv4-d16,   链接选项加 -larm_cortexM4lf_math)

强制转换成int再用%d输出, 计算结果基本是对的

试了一下直接执行这两行,  一样死机
  1.        volatile float f = 3.141593;
  2.         printf("%f\n", f);
复制代码


怀疑栈给小了, 加到32k了, 一样
编译选项里去掉 -specs=nano.specs ,或者改成nosys.specs, 一样
arm-none-eabi-gcc 4.9, 10.2都试了, 一样

哪位解决过这个问题么...

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出140入158汤圆

发表于 2022-5-6 22:33:21 | 显示全部楼层
GD没用过,不清楚,但是对于H7和F4,是使能FPU才行,否则CPU遇到带v的指令,就HardFault。使能FPU的语句如下:
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */

出0入362汤圆

 楼主| 发表于 2022-5-6 22:43:23 | 显示全部楼层
amigenius 发表于 2022-5-6 22:33
GD没用过,不清楚,但是对于H7和F4,是使能FPU才行,否则CPU遇到带v的指令,就HardFault。使能FPU的语句如 ...
(引用自2楼)

这行加了啊
fft计算结果我转成int, 用printf的%d输出, 结果是对的, 所以使能FPU这里没有问题...

出100入312汤圆

发表于 2022-5-6 22:58:37 | 显示全部楼层
gd32ffprtgu6 可能不支持fpu

出105入79汤圆

发表于 2022-5-6 23:02:14 | 显示全部楼层
print 浮点,需要3百多个Bytes的Stack

出0入362汤圆

 楼主| 发表于 2022-5-6 23:03:20 | 显示全部楼层
akey3000 发表于 2022-5-6 22:58
gd32ffprtgu6 可能不支持fpu
(引用自4楼)

...拜托, 我fft都算出结果了, 怎么可能不支持

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2022-5-6 23:03:30 | 显示全部楼层
你的这个printf,是不是重定向到了串口,没有开启micro lib啊?
在MDK里见过类似现象,禁用micro lib运行到printf就死,开启micro lib后打印各种数据类型就正常了。

出0入362汤圆

 楼主| 发表于 2022-5-6 23:05:32 | 显示全部楼层
bigharpoon 发表于 2022-5-6 23:03
你的这个printf,是不是重定向到了串口,没有开启micro lib啊?
在MDK里见过类似现象,禁用micro lib运行到 ...
(引用自7楼)

那是mdk, gcc没有microlib这一说吧

我是在_write桩函数里加入自己的usart_writebyte实现的, 这么用了好几年了

出0入362汤圆

 楼主| 发表于 2022-5-6 23:12:38 | 显示全部楼层
qwe2231695 发表于 2022-5-6 23:02
print 浮点,需要3百多个Bytes的Stack
(引用自5楼)

给到32k的栈了... 再怎么也该够用了吧

出105入79汤圆

发表于 2022-5-6 23:14:43 | 显示全部楼层
如果是用了操作系统 要进行任务栈字节对齐

出0入0汤圆

发表于 2022-5-6 23:16:41 | 显示全部楼层
tomzbj 发表于 2022-5-6 23:05
那是mdk, gcc没有microlib这一说吧

我是在_write桩函数里加入自己的usart_writebyte实现的, 这么用了好 ...
(引用自8楼)

这种类似奇怪的现象,亲身经历过,只不过在MDK环境中。几年之前的一个项目,前期为了打印方便,用了printf重定向。
调通printf后,后面上了操作系统和开启FPU,也有卡死现象。最后放弃了printf这个系统函数,用其它非标函数进行串口输出就正常了。

出0入0汤圆

发表于 2022-5-6 23:20:27 | 显示全部楼层
反汇编上放断点看看死在那条指令上了

出0入0汤圆

发表于 2022-5-7 00:54:09 | 显示全部楼层
HardFault 上看不到什么有用的信息吗,比如引发 HardFault 的错误类型是什么,指令是哪条

出0入0汤圆

发表于 2022-5-7 09:20:42 | 显示全部楼层
是不是这个printf逻辑代码里不支持打印浮点?

出15入178汤圆

发表于 2022-5-7 10:29:36 | 显示全部楼层
C库用的Newlib还是Nano?

出0入362汤圆

 楼主| 发表于 2022-5-7 10:48:33 | 显示全部楼层
2nd 发表于 2022-5-7 10:29
C库用的Newlib还是Nano?
(引用自15楼)

specs=nano, nosys都试了

出0入42汤圆

发表于 2022-5-7 11:09:51 | 显示全部楼层
大概率库函数支持的不好。用非标打印函数试试。

出0入0汤圆

发表于 2022-5-7 12:43:07 | 显示全部楼层
M7开FPU遇到过汇编文件有问题的,还好看过硬汉的帖子省了点时间不过是RTX的《找到CMSIS 5.8.0软件包里面RTX5 底层汇编文件的处理欠妥的地方,ARM这等大厂也有这种骚操作》

出0入0汤圆

发表于 2022-5-7 18:55:40 | 显示全部楼层
栈满足8字节对齐嘛?

出0入8汤圆

发表于 2022-5-8 00:22:17 来自手机 | 显示全部楼层
关注一下,对这个问题也感兴趣

出0入362汤圆

 楼主| 发表于 2022-5-8 23:58:16 | 显示全部楼层
本帖最后由 tomzbj 于 2022-5-9 00:03 编辑

解决了
1. 初始化时加一条    SCB->SHCSR |= (7UL << 16);    // 打开BusFault, MemManageFault和UsageFault
2. 再出错时是掉进UsageFault了
3. 查看SCB->CFSR,  确定是UsageFault里的执行未定义指令
4. 反汇编, 定位到一条vcvt.f64.f32指令, 查了一下是双精度指令, M4f内核只支持单精度
5. 检查Makefile, 编译选项加了CPFLAGS += -mfloat-abi=hard -mfpu=vfpv4-d16,  这里加了双精度. 不过mfpu这里换了几个都不行, 干脆把-mfpu这个选项都去掉, 居然好了...

再查了一下, -mfpu支持的选项有这么多,  应该是选个只有单精度的就好了?

auto crypto-neon-fp-armv8 fp-armv8 fpv4-sp-d16 fpv5-d16 fpv5-sp-d16 neon neon-fp-armv8 neon-fp16 neon-vfpv3 neon-vfpv4 vfp vfp3 vfpv2 vfpv3 vfpv3-d16 vfpv3-d16-fp16 vfpv3-fp16 vfpv3xd vfpv3xd-fp16 vfpv4 vfpv4-d16

出0入25汤圆

发表于 2022-5-9 07:33:40 | 显示全部楼层
tomzbj 发表于 2022-5-8 23:58
解决了
1. 初始化时加一条    SCB->SHCSR |= (7UL CFSR,  确定是UsageFault里的执行未定义指令
4. 反汇编,  ...
(引用自21楼)

lz是高手,  在知乎上也碰到你的贴子。。

这个问题,确实只有自己才能解决。 因为精通 gcc 编译器配置的人,非常少。

刚问一下lz 在哪里上班?

出0入362汤圆

 楼主| 发表于 2022-5-9 07:46:03 | 显示全部楼层
差远了……也就是现用现查
我在中科院理化所,靠近五道口

出100入312汤圆

发表于 2022-5-9 07:54:56 | 显示全部楼层
tomzbj 发表于 2022-5-9 07:46
差远了……也就是现用现查
我在中科院理化所,靠近五道口
(引用自23楼)

现在中科院大学非常火,收分很高

出0入362汤圆

 楼主| 发表于 2022-5-9 09:08:32 | 显示全部楼层
akey3000 发表于 2022-5-9 07:54
现在中科院大学非常火,收分很高
(引用自24楼)

搬到雁栖湖之后我也就开会去过一两次... 之前读研时还在中关村这边, 当时还叫中科院研究生院
老板们倒是每周要过去讲课, 来回路上得两个小时多

出105入79汤圆

发表于 2022-5-9 23:58:11 | 显示全部楼层
庆祝一下解决了,Gcc 的选项很多

出0入0汤圆

发表于 2022-5-10 14:14:44 | 显示全部楼层
QFN36 机贴的还是手焊的?

出0入0汤圆

发表于 2022-5-10 15:09:07 | 显示全部楼层
楼主真的是厉害

出0入362汤圆

 楼主| 发表于 2022-5-10 15:28:37 | 显示全部楼层
TINXPST 发表于 2022-5-10 14:14
QFN36 机贴的还是手焊的?
(引用自27楼)

qfn手焊没问题啊, 就是对准位置稍微费点劲.

以及肚子下面有焊盘, 周围引脚又没有接地的, 这种没法手焊.

现在一般都刷点锡膏, 上铁板烧, 更省事, 不用对准, 锡化了自动就准了.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-23 23:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表