C

时间:2019-02-28 18:55:07

标签: c assembly arduino raspberry-pi

我正在将库从Arduino移植到Raspbian。我无法完全弄清楚嵌入式程序集的一部分,希望有人可以提供帮助或为我提供其他资源。很有帮助的是,代码的注释很好,所以很辛苦。预先非常感谢。

Arduino代码是:

// The macro below uses 3 instructions per pin to generate the byte to transfer with SPI
// Retreive duty cycle setting from memory (ldd, 2 clockcycles)
// Compare with the counter (cp, 1 clockcycle) --> result is stored in carry
// Use the rotate over carry right to shift the compare result into the byte. (1 clockcycle).
#define add_one_pin_to_byte(sendbyte, counter, ledPtr) \
{ \
    unsigned char pwmval=*ledPtr; \
    asm volatile ("cp %0, %1" : /* No outputs */ : "r" (counter), "r" (pwmval): ); \
    asm volatile ("ror %0" : "+r" (sendbyte) : "r" (sendbyte) : );  \
}

unsigned char sendbyte;
add_one_pin_to_byte(sendbyte, counter, --ledPtr);

我相信在ARM / Raspberry Pi上,“比较”是“ CMP”而不是“ CP”,但是问题出在“ ROR”语句上。我在构建时收到一条错误消息,内容为:

/tmp/ccZN1jmK.s: Assembler messages:
/tmp/ccZN1jmK.s:138: Error: bad arguments to instruction -- `ror r3'

我知道“ ROR”是“向右旋转”,我希望编译器放入“ r3”,并且“ r3”可能是第四个寄存器(如果我使用零,则是第三个寄存器)。

虽然此代码设计得非常紧凑,可以让低功耗处理器完成许多工作,但我可以将其转换为C,并在必要时取消汇编。

2 个答案:

答案 0 :(得分:4)

  

我正在将库从Arduino移植到Raspbian。

这行不通。

The library you're trying to port是专为Arduino上使用的AVR微控制器的硬件而设计的。这取决于内存映射的端口I / O的可用性,并使用特定的硬件计时器。

Raspberry Pi是一个完全不同的系统。该库所依赖的许多功能在Pi上使用的BCM283x处理器上不可用。而且,BCM283x以更高的时钟速度运行,从而使该库使用的大多数优化都是不必要的(甚至是不合适的)。

我不确定您要在这里完成什么,但是您将需要在更高层次上解决这个问题。尝试逐行对此代码进行“翻译”不会产生有用的结果。

答案 1 :(得分:-4)

我的问题是在ARM / Raspberry Pi上,ROR指令需要两个参数,目标寄存器和寄存器进行旋转。在Arduino上,处理器只需要一个参数。将构建的语句是:

asm volatile ("ROR %0, %1" : "=r" (sendbyte) : "r" (sendbyte) : );

但是,我决定使用接近@Jester的C代码的东西。