有一个带有中断处理程序的文件。所有函数都用[[gnu::interrupt]]
. 如果全局禁用 fpu387 和 SSE 命令的生成,则所有内容都会被编译。如果您允许使用 fpu387 和/或 SSE,则会发生错误
抱歉,未实现:中断中不允许使用 MMX/3Dnow 指令
.
使用 SSE,问题可以通过编译指示解决:#pragma GCC target "no-mmx,no-sse"
但这不适用于 80387:
抱歉,未实现:中断服务程序中不允许使用 80387 指令
我在搜索引擎中进行了搜索,但没有找到如何指示此文件中根本没有使用实数的解决方案。在 GCC 关于禁用 fpu387 代码的说明中仅在编译器选项 ( -mno-80387
) 中,即全局。
作为一个选项:全局关闭。我在通用头文件中包含了编译指示:#pragma GCC target("sse")
在我指定的文件#pragma GCC target("no-sse")
中 . 结果:
抱歉,未实现:中断服务程序中不允许 SSE 指令'
也就是说,编译指示被成功忽略。
代码示例(这只是一个示例!)https://godbolt.org/z/kLVdWE
找到了办法。坦率地说,它可以被称为变态,但它奏效了。关键是所有实数运算最初都是禁止的,参数
-mno-mmx -mno-sse -mno-80387
在必要的文件中,首先定义了所有不需要实数的函数。有必要提前添加对所有使用实数的函数的描述。我认为这是可以理解的。
最后,它告诉编译器使编译器能够处理实数并定义所有需要这种支持的函数。
示例:https ://godbolt.org/z/f4MpoY