【发布时间】:2019-02-28 18:55:07
【问题描述】:
我正在将一个库从 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”是 Rotate Over Right,我希望编译器将“r3”放入其中,并且“r3”可能是第四个寄存器(如果你使用第零个我想是第三个寄存器)。
虽然此代码设计得非常紧凑,允许低功耗处理器完成大量工作,但我可以将其转换为 C 并在必要时消除程序集。
【问题讨论】:
-
快速浏览一下类似
sendbyte = (sendbyte >> 1) | (counter == *ledPtr) ? 0x80 : 0x00; -
看不到汇编代码但我认为你只能在累加器寄存器上做ROR,所以把R3移到A再试一次?
-
顺便说一句,即使是原始代码也被破坏/不安全。不能保证两个 asm 块之间会保留进位标志。它应该写成一个块。
标签: c assembly arduino raspberry-pi