ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
26 апреля
1207604 Топик полностью
IBAH (11.05.2022 20:42, просмотров: 370) ответил IBAH на Внезапно! до меня дошло, что классический кольцевой буфер+Уарт на передачу непотокобезопасен! возможно зависание символа. Если прерывание "передача закончена (регистр передачи пуст)" произойдет между проверкой занятости Уарта и добавлением нового символа в кольцевой буфер, то символ "зависнет" и выйдет наружу только при следующей записи
У всех прошу прощения. Перебздел на рефакторинге. Все там нормально, потокобезопасно и подтверждено многолетними тестами. Хотя вот это мне не нравится (TxHead==TxTail) && (((USART1->ISR)&USART_ISR_TXE)!=0), какая то стрёмная проверка 
*
void PutFifo1(unsigned char data)
  {
  //если в буфере пусто и регистр передачи пуст 
  if(
     (TxHead==TxTail)
     &&
     (((USART1->ISR)&USART_ISR_TXE)!=0)
    )
    {//сразу запускаем передачу
    USART1->TDR=data;
    return;
    }
  //если в буфере не пусто кладем в Tx буфер
  TxFifo[TxHead]=data;//кладем на голову
  TxHead=(TxHead+1)&(FifoTxBuf-1);
  return;
  }
void USART1_IRQHandler(void)
  {
  //обработчик прерывания "передача закончена" 
  if(USART1->ISR & USART_ISR_TC)  
    {
    if(TxHead==TxTail)
      {
      USART1->ICR=USART_ICR_TCCF;
      return;
      }
    //данные есть
    USART1->TDR=TxFifo[TxTail];//с хвоста в Уарт
    TxTail=(TxTail+1)&(FifoTxBuf-1);
    return;
    }
  return;
  }



*