c - 用 C 编写的嵌入式 ARM/Raspberry Pi 汇编

标签 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 语言并在必要时消除汇编。

最佳答案

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/

相关文章:

c - 段错误和 realloc() : invalid next size:

multithreading - x86 CPU 会重新排序指令吗?

c - Valgrind报告内存肯定丢失没有错误

c++ - 错误 : invalid instruction suffix for `push'

C:执行手动映射的文本段,无需编写太多程序集

arduino - 想要使用 arduino 每 5 秒获取一次 GPS 数据

arduino - 使用arduino中的accelStepper以恒定速度前往特定位置

c - arduino上的循环变量

java - 虚码和扫码的区别

c - 获取段错误(核心转储)并且不明白为什么