Официальный форум СВД Встраиваемые Системы
29 Март, 2024, 09:33:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Прием символа с помощью tti()  (Прочитано 2799 раз)
LH
Ветеран

Сообщений: 345


« : 23 Июнь, 2010, 03:38:47 »

Драйвер последовательного канала должен принимать данные не по прерыванию, а просто вычитывать из буфера FIFO через к-то время.

За основу взял devc-serdebug и Запускаю отдельную нить для чтения, чтение имитирую вводом символа 0x31

Цитировать
void *tti_poll( void *area )
{
   DEV_USART   *dev = area;

   unsigned c, ret;
   timer_t tid;
   struct itimerspec irq_time;

   while(1)
   {
      delay(10);

      c=0x31;

      ret = tti( &dev->tty,  c);

      if ( ret  && (dev->tty.flags & EVENT_QUEUED) == 0)
      {
         dev_lock(&ttyctrl);
         ttyctrl.event_queue[ttyctrl.num_events++] = &dev->tty;
         atomic_set(&dev->tty.flags, EVENT_QUEUED);
         dev_unlock(&ttyctrl);

         timer_create(CLOCK_REALTIME, &ttyctrl.event, &tid);
         irq_time.it_value.tv_sec=0;
         irq_time.it_value.tv_nsec=1000;
         irq_time.it_interval.tv_sec=0;
         irq_time.it_interval.tv_nsec=0;
         timer_settime(tid, 0, &irq_time, NULL);
         timer_delete( tid);

      }

      printf("tti_poll  cnt=%d\n", dev->tty.ibuf.cnt );

   }
}

Символы начинают поступать в буфер, пока он не заполнится ( слежу за счетчиком ). Прикладная программа может вычитать буфер ( например #cat /dev/sertest выводит на экран "111111... ", но после этого вывод останавливается, сброс счетчика буфера , его повторное наполнение и непрерывный вывод на экран единичек не происходит.

Аналогично с прикладной программой: read() выполняет чтение однократно и получает столько символов, сколько накопилось в буфере. Повторный read() блокируется.

В похожих темах говорится, что драйвер должен сообщить верхнему уровню io-char о поступлении символов в буфер ввода с помощью
return &ttyctrl.event , там же рекомендовалось использовать для отправки этого события таймер...

Но у меня не работает.  Sad

ret = tti( &dev->tty,  c); возвращает всегда +1 ( в HELP говорится о коде возврата 0 или -1 ).

Пож. подскажите: что я делаю не так? Спасибо.





Записан
LH
Ветеран

Сообщений: 345


« Ответ #1 : 26 Июнь, 2010, 03:52:12 »

Решение, которое позволило выполнять ввод по последовательному каналу в отдельной сканирующей нити драйвера,
описано в этом обсуждении

http://qnx.org.ru/forum/index.php?topic=5783.msg53563;topicseen#msg53563

Сейчас не могу разобраться: как идет прием информации  в то время, когда она перенаправляется на запись на флеш-диск.

Может ли быть так, что процесс записи на флеш "перехватывает" ресурсы настолько, что драйвер не успеет считать и будет терять
приходяшие байты?

Записан
Владимир Махилёв
Сотрудник СВД ВС
Старожил

Сообщений: 704



WWW
« Ответ #2 : 27 Июнь, 2010, 13:25:56 »

Может мешать и любой другой высокоприоритетный поток, но конкретно для этого случая думаю, что приоритет процесса забирающего данные из последовательного интерфейса должен быть выше чем приоритет процесса записывающего на флэш (Оба драйвера на client driven priority).
Вместо флэши имеет смысл организовать буфер в ОЗУ, например в /dev/shmem и сохранять его с определённой периодичностью.
Вообще, идея работать с последовательным интерфейсом в режиме опроса может быть оправдана только в случае если недоступна работа по прерыванию.

Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2020 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 02 Февраль, 2024, 19:42:52