OSDev http://osdev.su/ |
|
Проектирование подсистемы ввода/вывода http://osdev.su/viewtopic.php?f=5&t=1060 |
Страница 2 из 2 |
Автор: | pavia [ 01 мар 2015, 22:48 ] |
Заголовок сообщения: | Re: Проектирование подсистемы ввода/вывода |
leonidpr писал(а): Спасибо за то что подробно описали процесс. вы правы, дело тут в неумении проектировать. Просто разработка под МК носит еще и свою специфику, как вы знаете, которая отражается и на процессе проектирования. я понимаю, что можно сделать модули, обслуживающие интерфейсы связи, а протоколы реализовать в виде задач, каждая из которых просто читает или пишет то, что модуль интерфейса накопил в буфере. Но мне кажется это неэффективным решением. ведь если оперировать терминами ОС, задача, обслуживающая протокол должна в таком случае периодически просыпаться, что бы посмотреть, пришло что-то или не пришло. х-м-м, а вот тут идейка пришла. ведь можно сделать что-то вроде мьютекса, который будет взводиться обслуживающим интерфейс модулем, когда пришел блок данных. Соответственно задача, которой эти данные нужны будет спать, пока они не появятся. И плюс реализовать возможность сообщить модулю, обслуживающему интерфейс взводить мьютекс только по приходу N байт (ну или пакетов, не принципиально). То что под МК разработка специфичная я знаю. А я думал у вас одновременно работает 1 или 2 устройства и не надо динамически, вернее автоматически переключаться между интерфейсами. Тогда вам нужен мультиплексор типа как железнодорожная сортировочная станция или как мультиплексор в телефонной станции(АТС). Есть разные пути решения. Я бы даже сказал парадигмы программирования. Можно сделать как вы сказали процессами/потоками/задачами и планировать их работу усыпляя и пробуждая потоки. А можно и описать логику командным или функциональном стиле. Тогда пришли данные с генерировалось событие(или сигнал) который вызывал функцию, та быстро обработала параметры и вернула управление. P.S. Если делать управление на задачах, то можно и на сообщениях сделать связывание. Правда то уже микроядро со всеми вытекающими последствиями. |
Автор: | imsushka [ 01 мар 2015, 23:06 ] |
Заголовок сообщения: | Re: Проектирование подсистемы ввода/вывода |
Код: 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 байт но если надо то можно и переменной длинны |
Автор: | leonidpr [ 02 мар 2015, 00:13 ] |
Заголовок сообщения: | Re: Проектирование подсистемы ввода/вывода |
pavia, про мультиплексор это вы правильно сказали, что-то такое и нужно. при старте увязывает модули протоколов и интерфейсы, в зависимости от конфигурации. и в дальнейшем все идет через него. А насчет реализации думать дальше буду. что мне не нравится в тех ОСРВ, которые я посмотрел (FreeRTOS, RTX от Keil) - слишком много "нырков" в обработчик прерывания при работе с примитивами синхронизации. Хотя может по-другому и не сделать... за предложенные варианты спасибо, буду думать. |
Страница 2 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |