ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
19 мая
339104 Топик полностью
Chum_A (06.07.2012 10:05, просмотров: 322) ответил bialix на Вопросы к коллективному разуму, чтобы начать обсуждение.
Хотели ответов, получите, если не в тему, снесите. "Чего только русские не придумают, что бы дорог не строить", сказали японцы разглядывая ходовую часть а/м "Урал" :) Ну так "дорог не строить" == "вытесняющую ОС не использовать". Предисловие: По множеству разных причин вытесняющую ОС (ну очень) не хотелось. Все наши задачи "короткие" и вытеснение им не нужно, а вот то что связано с вводом-выводом (UART, CAN...) по сравнению с ними "длинное", соответственно не хочется тратить время на ожидание завершения. Вот мы и сочинили для своих дел "событийный диспетчер" (в очередной раз придумали велосипед). Диспетчер в бесконечном цикле просматривает очереди (приоритетные) событий и при наличии активного вызывает назначенный на событие обработчик. По ходу обработчик может быть переназначен. Источники событий по которым выполняется постановка в очередь: - обработчики аппаратных прерываний; - user-таймеры (функции пуск/стоп/смена периода/убить...), можно нагенерить таймеров, они просматриваются обработчиком прерывания таймера SysTick; - функцией полинга IO (уровень/срез, мин. время, пуск/стоп/убить), полинг выполняется по тому же SysTick; - вызовом user-функции "поставить в очередь(ID обработчика, параметры)". Вызванный диспетчером обработчик должен отработать за "приемлемое время", на фоне его работы очереди событий пополняются по мере возникновения прерываний. Короче, здорово похоже :) на кооперативную ОС. То, что получилось, вполне даже и устраивает как по ресурсам, так и по быстродействию. Как выглядит программирование, на примере сильно утрированной задачи опроса CAN сети: 1. Назначаем обработчики событий "CAN-RX", "CAN-TOUT" и разрешаем генерить события по "CAN-RX"; 2. Настраиваем user-таймер(периодом опроса), назначаем его обработчик, запускаем user-таймер; 3. Срабатывает user-таймер, диспетчером выбирается из очереди, выполняет CAN-TX(исходящий пакет) и разрешает генерить событие по "CAN-TOUT"(ID исходящего); 4. Срабатывает прерывание и ставит в очередь либо обработчик "CAN-RX"(входящий пакет) либо "CAN-TOUT"(ID исходящего); 5. Отрабатывет обработчик соответствующего CAN, причём "CAN-RX" должен остановить отработку "CAN-TOUT". 6. Срабатывает user-таймер, см. п.3 Итого имеем - банальная задача "отправить - дождаться/tout - обработать" вырождается в несколько функций, причём напрямую не связанных. Вот тут и возникают мысли: "а как бы обернуть это в одну функцию, но без вытесняющей ОС". Что-то подсказывает, что ответ "никак", а хочется :).