-
Notifications
You must be signed in to change notification settings - Fork 4.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Bug] bsp/cvitek 大核无法支持 float 指令 #9075
Comments
走读代码时发现 /* set to disable FPU */
li t0, SSTATUS_FS
csrc sstatus, t0
li t0, SSTATUS_SUM
csrs sstatus, t0 怀疑这会影响 float 指令的执行,但注释掉这四行语句后,运行依然报非法指令错误。 所以想问一下,@BernardXiong 当时为啥要 diable FPU? |
@BernardXiong 搜索 请问当时移植 |
编译ok,运行也正常,但是发现 备注,没有使用 musl gcc,还是和小核一样用的 newlib 的 gcc int main(void)
{
int i= 100;
float f = 100;
float x = f / 2;
i = x;
rt_kprintf("rt_kprintf x = %f\n", x);
rt_kprintf("Hello RTT test!, x = %d\n", i);
printf("printf x = %f\n", x);
return 0;
} 运行显示: rt_kprintf x = %f
Hello RTT test!, x = 50
printf x = 50.000000 难道 rt_kprintf 自身不支持 float 打印?还不太清楚,网上搜到一篇文章:https://github.com/mysterywolf/rt_vsnprintf_full 但搜索 rtt 源码树,也看到有对 rt_kprintf 调用 %f 的例子,譬如 components/drivers/sensor/v2/sensor_cmd.c 中,所以目前猜测打印的问题可能和使用了 newlib gcc 有关系,尝试了在小核上也是一样的效果。 至于为啥 printf 可以,这个还没有深入研究。 |
rt_kprintf是不支持float打印的 |
目前这个 issue 实际上可以分成两个问题
从长远看,如果大核要上 smart,以及为了解决 #8943,则要用 musl gcc,但是由于 问题 2 ,可能要从 toolchain 角度再看看,这个应该要用另外一个 issue 跟踪。 如果单纯为了解决问题 1,不换 newlib gcc,那么我认为可以采用修改 Kconfig,增加 |
启动时关闭 FPU VPU 是因为它们是按需自动开启的 😂 否则会拖垮大部分常规任务的整体性能 |
问题 2 应该不是问题,保留 |
参考 https://github.com/RT-Thread/rt-thread/blob/master/bsp/qemu-virt64-riscv/README_ch.md
所以 rootcause 就是 bsp/cvitek 的 大核 配置没有 enable FPU,需要补上。 |
#9290 为 cvitek 大核使能了 float,如果这个 pr 能进主线,也就解决了本 issue。tracking...... |
RT-Thread Version
master
Hardware Type/Architectures
bsp/cvitek
Develop Toolchain
GCC
Describe the bug
bsp/cvitek/cv18xx_risc-v/applications/main.c 的 main 中加入如下代码:
编译正常,但是运行会 crash,报 Unhandled Exception 2:Illegal Instruction
同样的代码加在 bsp/cvitek/c906_little/applications/main.c 中就正常
简单分析后发现大小核的编译选项有区别:
大核:-mabi=lp64
小核:-mabi=lp64d
统一成 -mabi=lp64d, 大核仍然 crash
后继续将大核的 gcc 换成 musl 的,即 https://download-redirect.rt-thread.org/download/rt-smart/toolchains/riscv64gc-linux-musleabi_for_x86_64-pc-linux-gnu_latest.tar.bz2
发现链接时报错:can't link soft-float modules with double-float modules
Other additional context
No response
The text was updated successfully, but these errors were encountered: