我收到以下警告:
-mcpu=cortex-r5 conflicts with -march=armv7-r switch
Run Code Online (Sandbox Code Playgroud)
当我将 -mcpu 设置为 cortex-r4 或 cortex-r4f 时,我没有遇到问题。由于 Cortex R5 是相同的 armv7-r 架构,我假设这是 GCC 工具链中的错误?我目前正在使用 Arm Launchpad 5.4 2016q3 工具。
我也想知道为什么没有 Cortex-r5f 选项,因为浮点单元是可选的。
我猜 -mcpu 选项并没有真正产生很大的不同?
如果有足够声誉的人可以创建一个 Cortex-R 标签,那将会很方便,拜托!
我猜这些
-mcpu选项并没有真正产生很大的区别?
是的,这是非常正确的。该-mcpu选项取代了-march; 它更具体。对于cortex-r4来说,它是一个最小的 cortex-r 系统,因此它基本上是 的同义词-march=armv7-r。您可以将 理想化-mcpu=xxx为-march=xxx和-mtune=xxx。在某些系统中,“x”和“y”可能各自具有独特的功能。但对于 cortex-r,cortex-r4 是最小的。这解释了观察到的(正确的)行为。
即使在今天,这个错误仍然存在。
$ arm-none-eabi-gcc --version
arm-none-eabi-gcc (15:10.3-2021.07-4) 10.3.1 20210621 (release)
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ cat test.c
/*@
ensures \result >= 0;
ensures x < 0 ==> \result == -x;
ensures x >= 0 ==> \result == x;
*/
int abs(int x)
{
if (x < 0)
return -x;
else
return x;
}
$ arm-none-eabi-gcc -Wall -mcpu=cortex-r5 -march=armv7-r -O3 -c -o test.o test.c
cc1: warning: switch '-mcpu=cortex-r5' conflicts with '-march=armv7-r' switch
Run Code Online (Sandbox Code Playgroud)
正如我在评论中所说,正确的选项是-mtune。
$ arm-none-eabi-gcc -Wall -mtune=cortex-r5 -march=armv7-r -O3 -c -o test.o test.c
Run Code Online (Sandbox Code Playgroud)
在这里,您可以为任何 cortex-r 系统生成代码,但它将针对 cortex-r5 进行优化。如果您确实只想仅针对 cortex-r5,则仅使用该-mcpu=cortex-r5选项。代码会稍微好一点。但是,您经常使用第 3 方库,有时它们是闭源代码并使用其他一些标志进行编译(这里有很多关于此主题的问题)。使用-march还可以让您有更多的可能性使用第 3 方闭源代码。
您应该能够链接-mcpu=cortex-r5代码-march=armv7-r;好吧,在一个方向上是好的,所以工具可能会抱怨。你可以绕过这个......但这不是问题。