相关疑难解决方法(0)

如何防止GCC优化忙等待循环?

我想为Atmel AVR微控制器编写C代码固件.我将使用GCC编译它.此外,我想启用编译器优化(-Os-O2),因为我认为没有理由不启用它们,并且它们可能比手动编写汇编更快地生成更好的汇编方式.

但我想要一小段没有优化的代码.我想延迟函数的执行一段时间,因此我想写一个do-nothing循环只是为了浪费一些时间.不需要精确,只需等待一段时间.

/* How to NOT optimize this, while optimizing other code? */
unsigned char i, j;
j = 0;
while(--j) {
    i = 0;
    while(--i);
}
Run Code Online (Sandbox Code Playgroud)

由于AVR中的内存访问速度要慢得多,因此我希望i并将j其保存在CPU寄存器中.


更新:我刚刚发现UTIL/delay.hUTIL/delay_basic.hAVR libc库.尽管大多数情况下使用这些功能可能更好,但这个问题仍然有效且有趣.


相关问题:

c optimization gcc avr-gcc

62
推荐指数
4
解决办法
5万
查看次数

如何指示可以使用内联ASM参数*指向*的内存?

考虑以下小功能:

void foo(int* iptr) {
    iptr[10] = 1;
    __asm__ volatile ("nop"::"r"(iptr):);
    iptr[10] = 2;
}
Run Code Online (Sandbox Code Playgroud)

使用gcc,它将编译为

foo:
        nop
        mov     DWORD PTR [rdi+40], 2
        ret
Run Code Online (Sandbox Code Playgroud)

请特别注意,即在第一次写iptriptr[10] = 1根本不会发生:内联汇编nop是在函数的第一件事,只有最后写2(会出现ASM呼叫后)。显然,编译器决定只需要提供其iptr 自身值的最新版本,而不需要提供其指向的内存。

我可以告诉编译器,内存必须是最新的memory,就像这样:

void foo(int* iptr) {
    iptr[10] = 1;
    __asm__ volatile ("nop"::"r"(iptr):"memory");
    iptr[10] = 2;
}
Run Code Online (Sandbox Code Playgroud)

结果为预期的代码:

foo:
        mov     DWORD PTR [rdi+40], 1
        nop
        mov     DWORD PTR [rdi+40], 2
        ret
Run Code Online (Sandbox Code Playgroud)

但是,这太强了,因为它告诉编译器必须写入所有内存。例如,在以下功能中:

void foo2(int* iptr, long* …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc clang inline-assembly

5
推荐指数
1
解决办法
244
查看次数

cant use sleep() in embedded c for stm32

I try to learn embedded c for a stm32-microcontorller. I try to wirte a easy blink program, where i use the sleep()-function.

code:

/* Includes ------------------------------------------------------------------*/
#include <unistd.h>
#include "main.h"

int main(void)
{
  HAL_Init();

  while (1)
  { 
    HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);
    sleep(1);  // this line throws a error, when compiling
  }
}
Run Code Online (Sandbox Code Playgroud)

the compiler gives me following error:

/usr/lib/gcc/arm-none-eabi/7.4.0/../../../../arm-none-eabi/bin/ld: CMakeFiles/untitled2.elf.dir/Src/main.c.obj: in function `main':
/home/heinrich/CLionProjects/untitled2/Src/main.c:106: undefined reference to `sleep'
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/untitled2.elf.dir/build.make:391: untitled2.elf] Fehler 1
make[2]: *** …
Run Code Online (Sandbox Code Playgroud)

c sleep stm32

-1
推荐指数
1
解决办法
158
查看次数

标签 统计

c ×3

gcc ×2

assembly ×1

avr-gcc ×1

clang ×1

inline-assembly ×1

optimization ×1

sleep ×1

stm32 ×1