микрочип MPLAB X IDE v2.15 не может генерировать код для этого выражения

Я пытаюсь скомпилировать простой фрагмент кода, но сталкиваюсь с ошибкой "не могу сгенерировать код для этого выражения". я адаптировал код из "http://www.barrysoft.it/blog/midi-with-pic-ausart.html"

может кто-нибудь просветить меня об этой проблеме?

MPLAB X IDE v2.15 xc8 v1.32

миди.с:

 void midi_init(void)
 {
 /* MIDI uses 31250 baud/s serial speed */
 uart_init(19, 1, 0, 0 );        //<--- 
 }

midi.c:31: ошибка: (712) не может сгенерировать код для этого выражения

уарт.с:

 void uart_init(unsigned char spbrg, unsigned bit brgh, unsigned bit sync, unsigned bit parity)
 {

    // Setup the baud rate
    SPBRG = spbrg;

 // High speed baud rate
 BRGH = brgh;        ////

 // Synch or Async
 SYNC = sync;        ////

 // 8bit transmission
 TX9 = parity;        ////

 // Enable serial output
 SPEN = 1;

 // Enable UART out
 TXEN = 1;
 }

uart.c:29: ошибка: (712) не может сгенерировать код для этого выражения

uart.c:32: ошибка: (712) не может сгенерировать код для этого выражения

uart.c:35: ошибка: (712) не может сгенерировать код для этого выражения

уарт.ч:

void uart_init(unsigned char spbrg, unsigned bit brgh,unsigned bit sync,unsigned bit parity);

Невозможно разрешить бит идентификатора, это похоже на ошибку MPLAB IDE, которую можно отключить.


person NaturalDemon    schedule 09.09.2014    source источник


Ответы (1)


Вероятно, это связано с тем, как компилятор обрабатывает данные, ширина которых меньше собственной ширины процессора.

Одно простое решение — использовать макросы вместо функции. Это работает, потому что вы позволяете компилятору обрабатывать преобразования типов и литеральные данные так, как он считает нужным, вместо того, чтобы заставлять его фиксировать битовые переменные в ячейках памяти (для вызова функции).

В uart.h:

#define uart_init( spbrg, brgh, sync, parity ) \
    SPBRG = spbrg;\
    BRGH = brgh;\
    SYNC = sync;\
    TX9 = parity;\
    SPEN = 1;\
    TXEN = 1

*Обратите внимание, что я намеренно пропустил ';' в последней строке. чтобы макрос можно было вызывать как функцию.

В midi.c: Без изменений...

uart_init(19, 1, 0, 0 ); 
person Mathieu L.    schedule 10.09.2014
comment
Я нашел способ обойти это, но эта информация была довольно полезной, спасибо. - person NaturalDemon; 10.09.2014