В IAR EWAVR 6.20.1 и 6.12.1 напоролся на странные грабли с C++ при попытке создать внутри класса статический массив указателей на объекты этого класса. Линкер не находит объявленный массив: Error[e46]: Undefined external "HAL_Com::objects" referred in HAL_UART
Класс объявлен так:
class HAL_Com {
private:
USART_t* uart; // указатель на порт ATmega
u8 rx_buffer_mask; // маска соответствующая длине буфера приема
u8 tx_buffer_mask; // маска соответствующая длине буфера передачи
u8* RxBuff; // указатель на буфер приема
u8* TxBuff; // указатель на буфер передачи
volatile u8 RxHead; // current index of last received byte in UART RxBuf
volatile u8 RxTail; // current index of the last free space in the UART RxBuf.
volatile u8 TxHead; // current index of last received byte in UART TxBuf
volatile u8 TxTail; // current index of the last free space in the UART TxBuf.
UART_pfCBOnRxByte_t CB_OnRxByte; // указатель на callback-функцию
static HAL_Com* objects[2];// указатели на созданные экземпляры класса
#pragma vector=USART0_RX_vect
static __interrupt void handler_USART0_RX_vect(void);
#pragma vector=USART0_UDRE_vect
static __interrupt void handler_USART0_UDRE_vect(void);
#pragma vector=USART0_TX_vect
static __interrupt void handler_USART0_TX_vect(void);
#pragma vector=USART1_RX_vect
static __interrupt void handler_USART1_RX_vect(void);
#pragma vector=USART1_UDRE_vect
static __interrupt void handler_USART1_UDRE_vect(void);
#pragma vector=USART1_TX_vect
static __interrupt void handler_USART1_TX_vect(void);
public:
HAL_Com(u8 usart_num, u8* rx_buffer, u16 rx_buffer_size, u8* tx_buffer, u16 tx_buffer_size); // Конструктор. Инициализирует объект и связывает его с выбранным последовательным портом
void Init( u32 baudRate, uart_fomat_t format);// inits UART, it sets baud rate, enables receiver
u8 Receive( void ); // returns one incoming byte
void Transmit(u8* data,u16 length); // transmits data via UART.
bool Transmit_Byte(u8 byData); // transmits only one byte data via UART. возвращает флаг успешности операции
bool IsDataInRxBuf( void ); // checks if there incoming data pending
bool IsDataInTxBuf( void ); // checks if there outgoing data pending
void RxInterruptHandler( void ); // UART1 Rx interrupt, reads byte from Rx register and Calls Rx CB function
void DRE_InterruptHandler( void ); // Tx buffer empty interrupt - this function check if there is output data pending and sends new byte
void SetOnRxByteCB(UART_pfCBOnRxByte_t pfn);// Sets pointer to external Rx Callback function
};// HAL_Coms
Массив указателей на объекты класса используется так:
HAL_Com::HAL_Com(u8 usart_num, u8* rx_buffer, u16 rx_buffer_size, u8* tx_buffer, u16 tx_buffer_size) :
RxTail(0),RxHead(0),TxTail(0),TxHead(0)
{
if (usart_num) uart = &USART1;
else uart = &USART0;
objects[usart_num]=this;
RxBuff = rx_buffer;
RxBuff = tx_buffer;
// округляем длины буферов, с буферами длина которых не степень двойки работать не будет
rx_buffer_size = flp2(rx_buffer_size);
tx_buffer_size = flp2(tx_buffer_size);
rx_buffer_mask = rx_buffer_size-1;
tx_buffer_mask = tx_buffer_size-1;
}
-
- Вне класса добавьте объявление amusin(38 знак., 19.02.2013 13:56)
- спасибо, это я упустил - AlexG(19.02.2013 14:02)
- Вне класса добавьте объявление amusin(38 знак., 19.02.2013 13:56)