Обновить

Портирование ModBus Slave RTU/ASCII на IAR AVR v3

Промышленное программированиеРазработка робототехникиПрограммирование микроконтроллеровРазработка под ArduinoПроизводство и разработка электроники
Рейтинг +9
Количество просмотров 2k Добавить в закладки 35 Читать комментарии 8
Комментарии 8
Плата челябинская, внушает. ThinkPad был похожий, живучая машинка.
Плате лет 12-13. Ноуту 16. Раньше на совесть делали :)
Зачем писать на ассемблере код, который 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);
 
Я для работы с UART никогда не использовал кольцевые буферы. Брал просто один буфер и скармливал его коду, отвечающему за приём данных по прерываниям. Если там использовались маркеры начала и конца пакета, то это дело сразу проверялось, чтобы уложить пакет в буфер и определить признак его конца. Но чаще всего я использовал таймауты между приёмами байтов в качестве признака конца пакета. В кольцевом буфере не вижу смысла, так как если программа не успевает обработать пакет, то кольцевой буфер ей не поможет, но код из-за него усложняется. В задачах приема данных по UART двойной буферизации хватает за глаза. Код проще и занимает меньше места.
Я тоже пятого размера не видел, но не могу сказать, что в этом нет смысла.
Использование потокового ввода-вывода (stream), позволяет полностью абстрагироваться от способа приема-передачи данных.
На LabVIEW имеется готовый ModBus драйвер под USB, работа по UART…
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.