Смысл в следующем: при попытке прикрутить поверх стандартной либы свою библиотеку UART с использованием очереди (или циклического буфера) наткнулся на ошибку линковщика [Li005]. А именно в момент прописывания обработчика прервыния по завершению передачи UART в файле "stm8s_it.c".
Вот выдержки из всех файлов, которые на мой взгляд нужны для помощи мне))):
Файл main.c
Код
#include "main.h"
#include "stm8s.h"
#include "stdio.h"
#include "uart.h"
void main(void)
{
UART_init();
UART_SendStr("test");
while(1);
}
#include "stm8s.h"
#include "stdio.h"
#include "uart.h"
void main(void)
{
UART_init();
UART_SendStr("test");
while(1);
}
Файл uart.h
Код
#include "stm8s.h"
#define UART_SPEED 115200
#define UART_GPIO_PINS (GPIO_PIN_6 | GPIO_PIN_5)
#define SIZE_BUF 256
void UART_init(void);
__monitor void UART_PutChar(uint8_t sym);
void UART_SendStr(uint8_t * data);
#define UART_SPEED 115200
#define UART_GPIO_PINS (GPIO_PIN_6 | GPIO_PIN_5)
#define SIZE_BUF 256
void UART_init(void);
__monitor void UART_PutChar(uint8_t sym);
void UART_SendStr(uint8_t * data);
Файл uart.c
Код
#include "uart.h"
static volatile uint8_t uartTxBuf[SIZE_BUF];
static uint16_t txBufHead = 0;
static volatile uint16_t txCount = 0;
void UART_init(void)
{
UART2_DeInit();
UART2_Init((uint32_t)UART_SPEED, UART2_WORDLENGTH_8D, UART2_STOPBITS_1, UART2_PARITY_NO,
UART2_SYNCMODE_CLOCK_DISABLE, UART2_MODE_TXRX_ENABLE);
UART2_ITConfig(UART2_IT_TC, ENABLE);
UART2_ITConfig(UART2_IT_RXNE_OR, ENABLE);
enableInterrupts();
}
__monitor void UART_PutChar(uint8_t sym)
{
if((UART2_GetFlagStatus(UART2_FLAG_TXE) == RESET) && (txCount == 0))
UART2_SendData8(sym);
else
{
if (txCount < SIZE_BUF)
{
uartTxBuf[txBufTail] = sym;
txCount++;
txBufTail++;
txBufTail = txBufTail % SIZE_BUF;
}
}
}
void UART_SendStr(uint8_t * data)
{
uint8_t sym;
while(*data)
{
sym = *data++;
UART_PutChar(sym);
}
}
static volatile uint8_t uartTxBuf[SIZE_BUF];
static uint16_t txBufHead = 0;
static volatile uint16_t txCount = 0;
void UART_init(void)
{
UART2_DeInit();
UART2_Init((uint32_t)UART_SPEED, UART2_WORDLENGTH_8D, UART2_STOPBITS_1, UART2_PARITY_NO,
UART2_SYNCMODE_CLOCK_DISABLE, UART2_MODE_TXRX_ENABLE);
UART2_ITConfig(UART2_IT_TC, ENABLE);
UART2_ITConfig(UART2_IT_RXNE_OR, ENABLE);
enableInterrupts();
}
__monitor void UART_PutChar(uint8_t sym)
{
if((UART2_GetFlagStatus(UART2_FLAG_TXE) == RESET) && (txCount == 0))
UART2_SendData8(sym);
else
{
if (txCount < SIZE_BUF)
{
uartTxBuf[txBufTail] = sym;
txCount++;
txBufTail++;
txBufTail = txBufTail % SIZE_BUF;
}
}
}
void UART_SendStr(uint8_t * data)
{
uint8_t sym;
while(*data)
{
sym = *data++;
UART_PutChar(sym);
}
}
Файл stm8s_it.c
Код
#include "stm8s_it.h"
#include "uart.h"
extern uint8_t uartTxBuf[SIZE_BUF];
extern uint16_t txBufHead;
extern uint16_t txCount;
INTERRUPT_HANDLER(UART2_TX_IRQHandler, 20)
{
if (txCount > 0)
{
UART2_SendData8(uartTxBuf[txBufHead]);
txCount--;
txBufHead++;
if (txBufHead == SIZE_BUF)
txBufHead = 0;
}
}
#include "uart.h"
extern uint8_t uartTxBuf[SIZE_BUF];
extern uint16_t txBufHead;
extern uint16_t txCount;
INTERRUPT_HANDLER(UART2_TX_IRQHandler, 20)
{
if (txCount > 0)
{
UART2_SendData8(uartTxBuf[txBufHead]);
txCount--;
txBufHead++;
if (txBufHead == SIZE_BUF)
txBufHead = 0;
}
}
При компиляции IAR выдает следующее:
Код
Error[Li005]: no definition for "txCount" [referenced from F:\SOURSE\SST135\STM8S_StdPeriph_Lib_V2.1.0\Project\STM8S_StdPeriph_Template\EWSTM8\STM8S105\Obj\stm8s_it.o]
Error[Li005]: no definition for "txBufHead" [referenced from F:\SOURSE\SST135\STM8S_StdPeriph_Lib_V2.1.0\Project\STM8S_StdPeriph_Template\EWSTM8\STM8S105\Obj\stm8s_it.o]
Error[Li005]: no definition for "uartTxBuf" [referenced from F:\SOURSE\SST135\STM8S_StdPeriph_Lib_V2.1.0\Project\STM8S_StdPeriph_Template\EWSTM8\STM8S105\Obj\stm8s_it.o]
Errors: 3
Warnings: none
Link time: 0.08 (CPU) 0.10 (elapsed)
Error while running Linker
Total number of errors: 3
Total number of warnings: 0
Error[Li005]: no definition for "txBufHead" [referenced from F:\SOURSE\SST135\STM8S_StdPeriph_Lib_V2.1.0\Project\STM8S_StdPeriph_Template\EWSTM8\STM8S105\Obj\stm8s_it.o]
Error[Li005]: no definition for "uartTxBuf" [referenced from F:\SOURSE\SST135\STM8S_StdPeriph_Lib_V2.1.0\Project\STM8S_StdPeriph_Template\EWSTM8\STM8S105\Obj\stm8s_it.o]
Errors: 3
Warnings: none
Link time: 0.08 (CPU) 0.10 (elapsed)
Error while running Linker
Total number of errors: 3
Total number of warnings: 0
В общем не нравятся ему переменные в файле stm8s_it.c которые объявлены в файле uart.c хотя я и объявил их как extern.
Что бы не было вопросов "включен ли файл в проект":

IAR 6.1.6.1880 (6.1.6.1880), проц STM8S105
Заранее благодарен.