Официальный форум СВД Встраиваемые Системы
04 Декабря, 2016, 09:05:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

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

Сообщений: 250


« : 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
Опытный пользователь

Сообщений: 250


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

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

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

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

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

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

Сообщений: 659



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

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

Записан

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

Powered by MySQL Powered by PHP © 2002-2016 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на 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 Декабря, 2016, 07:34:05