为了能在内核态做浮点运算
先在Makefile添加
EXTRA_CFLAGS += -Wall -O0 -mfpu=neon -mfloat-abi=softfp -I. -lm -lrt
再把涉及浮点运算的代码用kernel_neon_begin/end括起来
但在编译时报错
drvmain.c:95:5: error: call to '__compiletime_assert_95' declared with attribute error: kernel_neon_begin() called from NEON code
请教该如何修正?
Yaoming Qin:
陈工,我跟您前面的沟通中说过,目前所有的arm 处理器的kernel不支持硬件的浮点,建议您把算法移到用户态中进行测试。
谢谢!
jianhui alvin:
回复 Yaoming Qin:
Hi, 那实际上,内核态,能否做浮点运算,不一定要硬件的浮点?
Richard.T:
回复 jianhui alvin:
能,但是一般没人会这么干, 浮点是app的工作, 内核代码中不应该存在浮点运算的代码. 内核默认使能软浮点. 谁会在内核中进行开方运算?内核本身就要求高效.
jianhui alvin:
回复 Richard.T:
谢谢,内核确实不应该做浮点,我看到335x是带vfp,难道真不能把这个东西运用在内核浮点运算上面吗?
Jian Zhou:
回复 jianhui alvin:
我们的SDK的makefile默认应该是已经把vfp和neon的支持enable了,如果您的应用程序有浮点运算直接在编译选项里加上vfp或者neon的支持就可以了。
Yaoming Qin:
回复 jianhui alvin:
一般来说,内核不会做浮点,Linux的编译体系就不支持硬浮点,比较内核是做逻辑的地方。但是,我最近看了下,网上是有针对x86的内核硬浮点的补丁的,但针对ARM核的只有些参考文档,没有现成的补丁,即使自己动手,工作量不小,而且维护起来的成不不低。最后,还是建议在用户层进行浮点运算。