gpt4 book ai didi

c - 了解使用GCC编译器在ARM平台上优化C代码

转载 作者:行者123 更新时间:2023-11-30 15:07:46 25 4
gpt4 key购买 nike

我正在 ARM 上进行 C 编程,其中内存占用和速度都有非常严格的限制。我正在使用 GSL-2.1 库,它几乎具有 double 的所有功能,但我的硬件在硬件上没有浮点,所以它都是在软件中完成的。因此,它会产生额外的代码大小并降低执行速度。我的处理器有 180KB SRAM 和 1MB 闪存。现在我想提高速度和内存占用,因此我研究了 IDE 编译器设置并获得了以下设置。

enter image description here

我已阅读some thread关于 GCC 的优化级别,但这里还有一些我不太了解的设置。您能否详细说明 ARM Cortex-M 处理器的 GCC 的每个设置。

更新:我随机选中/取消选中了一些框,但代码大小没有任何差异。

最佳答案

当使用 gcc 为嵌入式系统编写代码时,需要注意的是,与许多嵌入式系统编译器不同,它们允许存储可以作为一种类型写入并作为另一种类型读取,并且将以至少某种可预测的方式处理整数溢出,依赖于此类行为的代码在使用 gcc 编译时很容易中断,除非使用 -fno-strict-aliasing-fwrapv 标志进行编译。例如,虽然 C 标准的作者预计该函数

// Assume usmall is an unsigned value half the size of unsigned int
unsigned multiply(usmall x, usmall y) { return x*y; }

在二进制补码硬件平台上应该是安全的,并且在溢出时有静默环绕,他们不要求编译器以这种方式实现它(我认为他们可能没有想到任何正在编写的人用于此类平台的编译器将非常迟钝,除非模拟其他平台,否则会采取其他方式。然而,当使用 gcc 编译时,该函数可能会产生意想不到的副作用。

同样,在许多编译器上,给定例如

struct widget_header {uint16_t length; uint8_t type_id;};
struct acme_widget {uint16_t length; uint8_t type_id; uint8_t dat[5];};
struct beta_widget {uint16_t length; uint8_t type_id; uint32_t foo;};

指向任何这些类型的指针都可以转换为 widget_header;代码然后可以查看 type_id 字段并转换为更具体的类型。然而,此类技术并不总是适用于 gcc;即使是 union 包含所有三种类型的声明都在范围内,gcc 将假定对这些类型之一的字段的访问不可能修改任何其他中的相应字段。

一个更具体的例子来展示 gcc 如何处理别名:

    struct s1 { int x; };
struct s2 { int x; };
union { struct s1 v1; struct s2 v2; } u;

static int peek(void *p)
{
struct s1 *p1 = (struct s1*)p;
return *(int*)&p1->x;
}

static void setToFive(void *p)
{
struct s2 *p2 = (struct s2*)p;
*(int*)(&p2->x) = 5;
}

static int test1a(void *p, void *q)
{
struct s1 *p1 = (struct s1*)p;
if (peek(p)!=23) return 0;
setToFive(q);
return peek(p);
}

int test1(void)
{
struct s2 v2 = {23};
u.v2 = v2;
return test1a(&u.v1, &u.v2);
}

ARM gcc 4.8.2 生成

test1:
movw r3, #:lower16:u
movt r3, #:upper16:u
movs r2, #5
movs r0, #23
str r2, [r3]
bx lr

它将 5 存储到“u”中,然后返回 23(假设第二次调用 peek 将返回与第一个相同的值,尽管所有指针类型转换都应该给出非常清楚地向编译器表明某些内容可能在某处使用别名)。

关于c - 了解使用GCC编译器在ARM平台上优化C代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37976563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com