Встроенная сборка ARM / Raspberry Pi в C - PullRequest
0 голосов
/ 28 февраля 2019

Я портирую библиотеку из 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 голосов
/ 28 февраля 2019

Я портирую библиотеку из Arduino в Raspbian.

Это не сработает.

Библиотека, которую вы пытаетесь портировать разработан специально для аппаратного обеспечения микроконтроллера AVR, используемого на Arduino.Это зависит от доступности подключенного к памяти порта ввода / вывода и использует определенные аппаратные таймеры.

Raspberry Pi - это совершенно другая система.Многие функции, от которых зависит эта библиотека, недоступны для процессора BCM283x, используемого на Pi.Более того, BCM283x работает на гораздо более высокой тактовой частоте, что делает большинство оптимизаций, используемых этой библиотекой, ненужными (и даже неуместными).

Я не уверен, чего именно вы пытаетесь достичь, новам нужно будет подойти к этому на более высоком уровне.Попытка выполнить построчный «перевод» этого кода не даст полезных результатов.

0 голосов
/ 28 февраля 2019

Моя проблема заключалась в том, что в ARM / Raspberry Pi инструкция ROR требует, чтобы два параметра, регистр назначения и регистр, были повернуты.На Arduino процессору требуется только один параметр.Утверждение, которое будет построено так:

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

Однако я решил использовать что-то похожее на код @ Jester's C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...