我正在将一个库从 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 语言并在必要时消除汇编。
最佳答案
I am porting a library from Arduino to Raspbian.
这行不通。
The library you're trying to port是专门为 Arduino 上使用的 AVR 微 Controller 的硬件而设计的。它取决于内存映射端口 I/O 的可用性并使用特定的硬件定时器。
Raspberry Pi 是一个完全不同的系统。该库所依赖的许多功能在 Pi 上使用的 BCM283x 处理器上不可用。此外,BCM283x 以更高的时钟速度运行,使得该库使用的大部分优化都是不必要的(甚至是不合适的)。
我不确定您到底想在这里完成什么,但您需要在更高的层面上解决这个问题。尝试对此代码执行逐行“翻译”不会产生有用的结果。
关于c - 用 C 编写的嵌入式 ARM/Raspberry Pi 汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54932438/