Я портирую библиотеку из 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 иустранение сборки при необходимости.