ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
388826
AlexG (19.02.2013 13:40, просмотров: 2582)
В 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; }