tomzbj 发表于 2022-5-6 22:17:05

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

mcu是gd32ffprtgu6 (魔改的gd32f30x), 只要开了FPU, 再用printf输出浮点变量就直接HardFault了
(Makefile里编译选项加 CPFLAGS += -mfloat-abi=hard -mfpu=vfpv4-d16,   链接选项加 -larm_cortexM4lf_math)

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

试了一下直接执行这两行,一样死机
       volatile float f = 3.141593;
      printf("%f\n", f);

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

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

amigenius 发表于 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 */

tomzbj 发表于 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这里没有问题...

akey3000 发表于 2022-5-6 22:58:37

gd32ffprtgu6 可能不支持fpu

qwe2231695 发表于 2022-5-6 23:02:14

print 浮点,需要3百多个Bytes的Stack

tomzbj 发表于 2022-5-6 23:03:20

akey3000 发表于 2022-5-6 22:58
gd32ffprtgu6 可能不支持fpu
(引用自4楼)

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

bigharpoon 发表于 2022-5-6 23:03:30

你的这个printf,是不是重定向到了串口,没有开启micro lib啊?
在MDK里见过类似现象,禁用micro lib运行到printf就死,开启micro lib后打印各种数据类型就正常了。

tomzbj 发表于 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实现的, 这么用了好几年了

tomzbj 发表于 2022-5-6 23:12:38

qwe2231695 发表于 2022-5-6 23:02
print 浮点,需要3百多个Bytes的Stack
(引用自5楼)

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

qwe2231695 发表于 2022-5-6 23:14:43

如果是用了操作系统 要进行任务栈字节对齐

bigharpoon 发表于 2022-5-6 23:16:41

tomzbj 发表于 2022-5-6 23:05
那是mdk, gcc没有microlib这一说吧

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

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

modbus 发表于 2022-5-6 23:20:27

反汇编上放断点看看死在那条指令上了

wudicgi 发表于 2022-5-7 00:54:09

HardFault 上看不到什么有用的信息吗,比如引发 HardFault 的错误类型是什么,指令是哪条

shiva_shiva 发表于 2022-5-7 09:20:42

是不是这个printf逻辑代码里不支持打印浮点?

2nd 发表于 2022-5-7 10:29:36

C库用的Newlib还是Nano?

tomzbj 发表于 2022-5-7 10:48:33

2nd 发表于 2022-5-7 10:29
C库用的Newlib还是Nano?
(引用自15楼)

specs=nano, nosys都试了

liyang121316 发表于 2022-5-7 11:09:51

大概率库函数支持的不好。用非标打印函数试试。

cctv02 发表于 2022-5-7 12:43:07

M7开FPU遇到过汇编文件有问题的,还好看过硬汉的帖子省了点时间不过是RTX的《找到CMSIS 5.8.0软件包里面RTX5 底层汇编文件的处理欠妥的地方,ARM这等大厂也有这种骚操作》

擦鞋匠 发表于 2022-5-7 18:55:40

栈满足8字节对齐嘛?

了无 发表于 2022-5-8 00:22:17

关注一下,对这个问题也感兴趣

tomzbj 发表于 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

rei1984 发表于 2022-5-9 07:33:40

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

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

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

刚问一下lz 在哪里上班?

tomzbj 发表于 2022-5-9 07:46:03

差远了……也就是现用现查
我在中科院理化所,靠近五道口

akey3000 发表于 2022-5-9 07:54:56

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

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

tomzbj 发表于 2022-5-9 09:08:32

akey3000 发表于 2022-5-9 07:54
现在中科院大学非常火,收分很高
(引用自24楼)

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

qwe2231695 发表于 2022-5-9 23:58:11

{:handshake:} 庆祝一下解决了,Gcc 的选项很多

TINXPST 发表于 2022-5-10 14:14:44

QFN36 机贴的还是手焊的?

solojimes 发表于 2022-5-10 15:09:07

楼主真的是厉害

tomzbj 发表于 2022-5-10 15:28:37

TINXPST 发表于 2022-5-10 14:14
QFN36 机贴的还是手焊的?
(引用自27楼)

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

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

现在一般都刷点锡膏, 上铁板烧, 更省事, 不用对准, 锡化了自动就准了.
页: [1]
查看完整版本: 求教: gcc, 开FPU后printf输出浮点数死机