GNU Arm 警告:-mcpu=cortex-r5 与 -march=armv7-r 开关冲突

Rea*_*Rik 6 gcc arm

我收到以下警告:

-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 标签,那将会很方便,拜托!

art*_*ise 0

我猜这些-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;好吧,在一个方向上是好的,所以工具可能会抱怨。你可以绕过这个......但这不是问题。