OSDev

для всех
Текущее время: 23 июн 2018, 03:25

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу Пред.  1, 2
Автор Сообщение
СообщениеДобавлено: 01 мар 2015, 22:48 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1088
leonidpr писал(а):
Спасибо за то что подробно описали процесс. вы правы, дело тут в неумении проектировать. Просто разработка под МК носит еще и свою специфику, как вы знаете, которая отражается и на процессе проектирования. я понимаю, что можно сделать модули, обслуживающие интерфейсы связи, а протоколы реализовать в виде задач, каждая из которых просто читает или пишет то, что модуль интерфейса накопил в буфере. Но мне кажется это неэффективным решением. ведь если оперировать терминами ОС, задача, обслуживающая протокол должна в таком случае периодически просыпаться, что бы посмотреть, пришло что-то или не пришло.
х-м-м, а вот тут идейка пришла. ведь можно сделать что-то вроде мьютекса, который будет взводиться обслуживающим интерфейс модулем, когда пришел блок данных. Соответственно задача, которой эти данные нужны будет спать, пока они не появятся. И плюс реализовать возможность сообщить модулю, обслуживающему интерфейс взводить мьютекс только по приходу N байт (ну или пакетов, не принципиально).

То что под МК разработка специфичная я знаю. А я думал у вас одновременно работает 1 или 2 устройства и не надо динамически, вернее автоматически переключаться между интерфейсами. Тогда вам нужен мультиплексор типа как железнодорожная сортировочная станция или как мультиплексор в телефонной станции(АТС).

Есть разные пути решения. Я бы даже сказал парадигмы программирования. Можно сделать как вы сказали процессами/потоками/задачами и планировать их работу усыпляя и пробуждая потоки. А можно и описать логику командным или функциональном стиле. Тогда пришли данные с генерировалось событие(или сигнал) который вызывал функцию, та быстро обработала параметры и вернула управление.

P.S. Если делать управление на задачах, то можно и на сообщениях сделать связывание. Правда то уже микроядро со всеми вытекающими последствиями.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 01 мар 2015, 23:06 

Зарегистрирован: 21 фев 2015, 10:39
Сообщения: 50
Код:
void  TIMER1_isr(void) {
int16 tmp;
struct {
   int1 p4, p3, p2, none, p1;
} tmpP;

//   timer1ctrl.on  = 0;
//   tmp            = timer1;
//   timer1         = TMR1SET + tmp;
//   timer1ctrl.on  = 1;

   tmpP = input_b();
   
   tmp = get_timer1();
   set_timer1(TMR1SET + tmp);

   if ( StreamA.RX1 ) {
      if ( --StreamA.Xbcount == 0 ) {
         if ( tmpP.p1 != IN1 ) {
            StreamA.Xbuffer[StreamA.Xptr++] = StreamA.Xbyte;
            if ( StreamA.Xptr == 1 ) {
               if ( StreamA.Xbyte != 0x80+'s' )
                  StreamA.Xptr = 0;
               else
                  StreamA.TimeOutCnt = 0;
            } else if ( StreamA.Xptr == 8 )
               StreamA.Recv = 1;
         }
         StreamA.Xbcount = BITRECV;
         StreamA.RX1     = 0;
      } else {
         StreamA.Xbyte >>= 1;
         if ( tmpP.p1 != IN1 )
            StreamA.Xbyte |= 0x80;
      }
   }

   if ( StreamA.TX1 ) {
      if ( --StreamA.Xbcount == 0 ) {
         if ( StreamA.Xptr < 8 ) {
            OUT1_HIGH;

//            timer1ctrl.on  = 0;
//            timer1         = TMR1SET;
//            timer1ctrl.on  = 1;
            set_timer1(TMR1SET);

            StreamA.Xbcount = BITSEND;
            StreamA.Xbyte   = ~StreamA.Xbuffer[StreamA.Xptr++];
         } else {
//            timer1ctrl.on  = 0;
            OUT1_LOW;
            StreamA.Xptr = 0;
            StreamA.TX1  = 0;
         }
      } else {
         if ( StreamA.Xbyte & 1 )
            OUT1_HIGH;
         else
            OUT1_LOW;
         StreamA.Xbyte >>= 1;
      }
   }

   if ( StreamA.TimeOutCnt != 0 )
      if ( --StreamA.TimeOutCnt == 0 )
        StreamA.TimeOut = 1;
}


вот тебе прием/передача усарта

основной цикл спит
принялось - есть взведенная переменная
передалось - сброшенная переменная

принимается/передается буфер
у меня 8 байт
но если надо то можно и переменной длинны


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 мар 2015, 00:13 

Зарегистрирован: 10 авг 2007, 15:37
Сообщения: 58
pavia, про мультиплексор это вы правильно сказали, что-то такое и нужно. при старте увязывает модули протоколов и интерфейсы, в зависимости от конфигурации. и в дальнейшем все идет через него. А насчет реализации думать дальше буду. что мне не нравится в тех ОСРВ, которые я посмотрел (FreeRTOS, RTX от Keil) - слишком много "нырков" в обработчик прерывания при работе с примитивами синхронизации. Хотя может по-другому и не сделать... за предложенные варианты спасибо, буду думать.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB