0

对不起,英语不好。

我需要编写一段使用延迟的对时间要求严格的代码(通过 bit-bang 实现软件协议的严格部分)。编译时的 C 预处理器可以计算F_CPU延迟的时钟周期数(使用宏),因此我需要为未知的周期数实现汇编器延迟代码。

但是 GCC 提供了非常有用的功能,可以精确地__builtin_avr_delay_cycles(unsigned long cycles)延迟定义频率的时钟周期。 cyclesF_CPU

问题。有没有办法__builtin_avr_delay_cycles 在内联汇编代码中使用?

注意。绕过方式是这样的:

__asm__ (...);
__builtin_avr_delay_cycles(...);
__asm__ (...);

但是编译器可以围绕__asm__片段制作一些代码。这对我不好,我需要控制每个时钟周期。

4

2 回答 2

2
__asm__ (...);
__builtin_avr_delay_cycles(...);
__asm__ (...);

像这样编译代码,然后查看编译器为内置函数发出的内容。

这将是一个与以下非常相似的序列:

   ldi R2,lo8(N)
   ldi R3,hi8(N)
   ldi R4,hlo8(N)
1: subi R2,1
   sbci R3,0
   sbci R4,0
   brne 1b"

可能有 2-3 个这样的序列,有时以nopvinsn 结尾,有时会有 1 或 2 或 3 个ldisbciinsns,你会得到模式(这取决于循环数)。

把这些insn变成内联汇编,N是周期数,Rn是寄存器。

缺点是生成的代码取决于循环计数,如果它发生变化,您将不得不重复该过程。但是,如果更改在以下范围之一内,则您是安全的:[83886082, 0xFFFFFFFF], [262145, 83886081], [768, 262144], [6, 767]。

于 2012-11-22T15:44:30.130 回答
0

不,编译器内置函数不是真正的函数,不能从汇编器调用,编译器也不会在汇编器中识别它们。

于 2012-11-22T15:22:04.273 回答