【问题标题】:Is it possible to use GCC's '__builtin_avr_delay_cycles' in the assembler?是否可以在汇编程序中使用 GCC 的“__builtin_avr_delay_cycles”?
【发布时间】:2012-11-22 15:02:57
【问题描述】:

对不起,英语不好。

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

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

问题。有没有办法使用__builtin_avr_delay_cycles within inline-assembler 代码?

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

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

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

【问题讨论】:

    标签: gcc inline-assembly avr avr-gcc


    【解决方案1】:
    __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个这样的序列,有时以nopv insn结尾,有时会有1个或2个或3个ldisbci insn,你会得到模式(这取决于循环数)。

    把这些insn变成内联汇编,N是循环计数,Rn是寄存器。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-09-15
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 2018-08-07
        • 1970-01-01
        • 2014-02-03
        • 2014-08-06
        相关资源
        最近更新 更多