Комментарии 8
Плата челябинская, внушает. ThinkPad был похожий, живучая машинка.
0
Зачем писать на ассемблере код, который 1-в-1 на язык С ложится и оптимизируется компилятором? Это я к тому, что весь код на языке С будет более понятен и востребован людям. Было бы интересно на вашу реализацию кольцевого буфера посмотреть, но декодировать ассемблер нет желания.
+1
Зачем писать на ассемблере— потому что могу
+1
Для примера — кольцевой буфер для передачи в UART
#define FifoTxBuf (256)
static unsigned char TxFifo[FifoTxBuf];//буфер для передачи данных
static unsigned short TxHead=0;//голова, байт для передачи кладем на голову
static volatile unsigned short TxTail=0;//хвост, с хвоста в UART
void AES_RNG_LPUART1_IRQHandler(void)
{//обработчик прерывания "передача закончена"
if(LPUART1->ISR & USART_ISR_TC)
{
if(TxHead==TxTail)//проверяем наличие байт в буфере
{//Данных нет, сбрасываем флаг прерывания
LPUART1->ICR=USART_ICR_TCCF;
}
else
{//данные есть, передаем, FIFO->UART
LPUART1->TDR=TxFifo[TxTail];
TxTail=(TxTail+1)&(FifoTxBuf-1);
}
}
}
void PutUart0(unsigned char data)
{
//если в TX буфере пусто и регистр передачи пуст
if(
(TxHead==TxTail)
&&
(((LPUART1->ISR)&USART_ISR_TXE)!=0)
)
{//сразу запускаем передачу
LPUART1->TDR=data;
return;
}
//если в буфере не пусто кладем в Tx буфер
TxFifo[TxHead]=data;
TxHead=(TxHead+1)&(FifoTxBuf-1);
0
Я для работы с UART никогда не использовал кольцевые буферы. Брал просто один буфер и скармливал его коду, отвечающему за приём данных по прерываниям. Если там использовались маркеры начала и конца пакета, то это дело сразу проверялось, чтобы уложить пакет в буфер и определить признак его конца. Но чаще всего я использовал таймауты между приёмами байтов в качестве признака конца пакета. В кольцевом буфере не вижу смысла, так как если программа не успевает обработать пакет, то кольцевой буфер ей не поможет, но код из-за него усложняется. В задачах приема данных по UART двойной буферизации хватает за глаза. Код проще и занимает меньше места.
0
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Портирование ModBus Slave RTU/ASCII на IAR AVR v3