1:cortex-a7 如何支持fpu?我在默认打开RT_USING_FPU,程序在运行的时候都会出现未定错误
RT_USING_FPU
查看更多
啥芯片? 我看你前几天的提问,你老早就打开了FPU功能啊。
是否是因为 neon 指令引起的?把 libcpu/arm/cortex-a/trap.c 里面的 rt_hw_trap_undef 更新一下,修改为
libcpu/arm/cortex-a/trap.c
rt_hw_trap_undef
if (((ins & 0xe00) == 0xa00) || ((ins & 0xF8000000) == 0xF0000000)) { /* float ins */ uint32_t val = (1U << 30); asm volatile ("vmsr fpexc, %0"::"r"(val):"memory"); regs->pc = addr; return; }
if (((ins & 0xe00) == 0xa00) || ((ins & 0xF8000000) == 0xF0000000))
{
/* float ins */
uint32_t val = (1U << 30);
asm volatile ("vmsr fpexc, %0"::"r"(val):"memory");
regs->pc = addr;
return;
}
如果说 上述判断条件成立,说明这里的cond是 0b1111, 即此命令是 undefined 的。既然是未定义的指令,所以跟浮点是没有关系的吧?判断是否多余?
欢迎发表与嵌入式相关的技术分享、开发技巧、工具介绍、技术设想、职业心得、行业评论等对他人有启发,排版优雅的文章
回到 顶部
发布 问题
分享 好友
手机 浏览
投诉 建议
回到 底部
我们自己设计的芯片,支持neon和硬件浮点。就是neon引起的。我把neon关闭就正常
-mfpu=neon-vfpv4
改为-mfpu=vfpv4-dp16
,并且把
vldmia sp!, {d16-d31}
屏蔽掉正常。问题:
ins & 0xe00) == 0xa00
这边0xa00
代表什么意思?ins & 0xF8000000) == 0xF0000000
这边0xF0000000
又是表示什么意思FPU和neon指令识别
好像env自带的编译器版本,整个工程开neon会有些问题,启动不了。
没有细查原因在哪,楼主可以深入挖掘一下。
或可以不要整个工程都开neon,而是只把有SIMD需求的算法库编译的时候打开neon。
反正对于一般的代码,neon也没有太大作用。
@aozima 目前我按你的方法,总个工程打开neon,能正常启动,你们是概率性的出现启动不了还是一直都是启动不了?
@EEZK_1546 一直启动不了,项目紧,没细查,应该好查。
所以只把算法库用了Neon
@aozima 您好,关于
这个命令,有一些疑问,想请教下做此判断的依据是什么?
我这边查了下手册,如下:
你好,遇到同样的问题。
请教一下,我在打开
RT_USING_FPU
之后编译报错,然后 将start_gcc.S
和context_gcc.S
中的vldmia sp!, {d16-d31}
屏蔽掉之后,再编译翻译OK了。但是,实际测试时,一个线程,一个中断,线程和中断中均有计算浮点数。

发现在线程中调用函数计算浮点数时,有时会出现错误的结果。经过查汇编,发现d6 d7寄存器数据被破坏。
如上图中,在acc <= 0.1设置断点(该断点应该永远进不来才对),实际会进入该断点。
当断点后,查看r11所存的内存地址中的数据均是正确的。
重新执行
这两条指令会发现内存中的数据被load到了d8,d9中。
如果线程中计算浮点时关闭中断,则不会出现此问题。
请教一下,如果使用硬浮点,需要修改哪几个文件?stack.c文件需要修改吗?
我的环境是:
内核:cortex-a7
打开MMU,cache
编译器:
arm-none-eabi-gcc
编译选项:
mfpu=vfpv4-d16 -mfloat-abi=hard
编译优化:
-O0
@EEZK_1546