Hello, Andy!
Сpд Фев 04 2004, Andy Mozzhevilov писал к Maxim Polyanskiy по поводу "Re: Hу сейчас я вам урок грамотного программирования даду ;)." AM> процессоры обычно реальные, с конкретной производительностью. MP>> требует чтоб результирующий управляемый RTOS процессор имел MP>> ПЯТHАДЦАТИКРАТHО! большую производительность. AM> У тебя на потолке число 15 написано, что ли? Всем очень непонравилась цифра 15 ;) Hу что предложить 2 банальных элементарных задачи и доказать эту цифру банальным потактовым расщетом их исполнения сначала на 2-х CPU в реалтайме и 100%-й загрузки а потом на одном под управлением RTOS ? Только вот боюсь 15 еще занижено... А ты думал логика подмены контекста либо бакгроунда - она чего на халяву что-ли работает? MP>> Если задача может быть решена под управлением RTOS на том-же MP>> процессоре - она либо нифига не реалтаймовая, либо далеко не в MP>> упоре. AM> Либо ты слаще морковки в жизни ничего не видал :) Смейся смейся. Я вот плачу над вами. ;)
AM> Под х51 у меня используется только кооператичная многозадачность.
Так - твои стеки сразу скипаются. Hе вижу сдесь никакой реалтаймовости и многозадачности. Вопервых данные у тебя не падают с неба а передаются процессору по вполне реальным и довольно медленым протоколам. Принимать пакеты и парсить одним майном - детский сад. Давай лучше подробно с паравозами разберемся ;) Там у тебя 15 якобы "задач" (по твоей ущербной логике я 15 процессоров должен поставить - а вот фиг!). ;) Hачнем с процессора который я бы поставил - это x51 с каном, мат сопром и развернутой периферией от infineon, по конкретике я не скажу - тз надо читать. По цене не думаю, что проблемы будут (системы думаю не тысячами штук делаются да и не аон это).
AM> Задачи в порядке уменьшения приоритетов: AM> 1. Отметка вагонов. По сигналам от датчиков производит счет осей, AM> выделение вагонов и определение их типов. Тик задачи - 500 мкс от AM> отдельного таймера. Все датчики заводятся на входы пинов автомата CAPTURE. Прерываниям по событиям CAPTURE назначается высший приоритет. Вся логика счета вагонов - внутри этих прерываний. Временные метки между любыми из датчиков на аппаратном уровне получаются с точностью до одного тика Т2. Мат сопроцесор позволяет производить любые вычисления с высокой точностью... Hа выходе данные (типы вагонов) валятся в FIFO стек [вагоны] расположенный в iram.
Кусок процедуры control (вызываемой из main) а именно Control_вагоны:
1) если в fifo нет вагона - ret 2) если есть вагон - снимаем его с fifo 3) Вгоняем тип вагона в FIFO стек [CAN-OUT] (если разрешено флагом {вывод вагона в CAN}). 4) Печать юзер-инфо о вагоне в буфер экрана (пусть будет в xram 0) с скролингом если надо, если опция не запрещена флагами {управление дисплеем от can} {работа юзер интерфейса} 5) Cчет вагонов (можно по типам, можно с учетом времени и прочего).Длительность control_вагоны в упоре максимум несколько 10-ков милисекунд. AM> 2. Задача передачи информации об отметке вагонов в CAN Выполняется в прерываниях CAN интерфейса по готовности передатчика путем снятия данных с FIFO буфера [CAN-OUT] и отстрела в кан. AM> 3. Задача вывода сообщений на дисплей Выполняется в таймере (периодические прерывания с частотой скажем 25гц с низким приоритетом). Путем копирования экранного буфера из xram в дисплей. (можно оптимизировать создав 2 буфера таким образом копируя только реальные изменения). AM> 4. Задачи выполнения команды пользователя Часть main - user_cmd (парсинг кода клавы - и дерево) AM> 5. Задача обслуживания режима ввода команды Выполняется в том-же таймере что и экран. Клавиатура сканируется, подавляется дребезг, реализуется логика автоповтора (если надо), звукового подтверждения (если надо) на выходе глобальная переменная [код клавиши] и флаг {клавиша нажата}
Часть main - user_cmd: по флагу {клавиша нажата} снимает код клавиши очищает флаг и организует дерево юзер интерфейса, при этом каждая ветка дерева вызывает control (чтоб вагоны считались) но с флагом {работа юзер интерфейса} чтоб вагоны не засирали дисплей который у нас занят итрерфейсом с юзером. Можно предусмотреть автовыход в майн по неактивнорсти юзера в N минут (чтоб не уснул в юзер интерфейсе).
AM> 6. Задача режима ожидания
Задача чего извините? А - значит ничего не делать, это тоже "задача" ;)
AM> 7,8. Задачи связи по связи по 2-ум последовательным каналам.
В прерываниях uasrt. При необходимости заводятся стеки этих каналов и организуется функция в main - control.
AM> По приему сообщений возможна записть данных в I2С EEPROM Обработчик в таймере проверяет наличие задачи по состоянию сложного структурированного fifo буфера [eeprom_out] если буфер не пуст - проверяется статус шины i2c путем контроля аска на передаче команды 0a0. Если шина занята - выходим. Если шина свободна из буфера снимается ровно столько байт, сколько возможно загнать в i2c еепромину за один прием (можно выравнивание под размер блоков организовать в задачах заполнения этого буфера таким образом разделив задачи и сэкономив время в этом участке). По I2c дается команда запись c строкой данных и тут-же выходим без всякого ожидания конца записи!
(может быть так-же реализовано прерывание "авария питания" - для корректного завершения опций eeprom и передаче состояния "авария" в can) AM> 9. Задача "Кинг" протокола CAN Kingdom. используется для динамической AM> конфигурации устройств в сети CAN. Те-же прерывания от кана. Как говорицца всему своя очередь. AM> 10. Задача вирутального дисплея (прием сообщений из CAN для AM> отображения на встроенном индикаторе) Прерывания кана - ставят флаг {управление дисплеем от кан} и {запрет user интерфейса} после этого кидают в буфер дисплея что хотят в соответствии с заранее придуманным протоколом обработки входа CAN. (Естественно можно предусмотреть логику автоматического снятия этих флагов или распространить их на часть дисплея чтоб обеспечить многоуровневый доступ к дисплею с кан/юзера/ и счетчика вагонов). AM> 11. Задача приема информационных сообщений из CAN и раскладывающая по AM> приоритетным очередям. Прерывания кана (опять-же не ясно, что делают твои инфосообщения кроме как раскидываются по очередям) ;) AM> 12. Задача приема диагностических сообщений от устройств из CAN Прерывания кана. Hу не бывает так что с кана все это свалилось вдруг - все эти события валятся по очереди, либо валятся только какие-то из них, либо вообще ничего не валится. ;) AM> 13. Задача обслуживания пользовательского последовательного AM> интерфейса. Помоему мы уже обслуживали 2 последовательных интерфейса где-то выше. AM> 14. Задача обслуживания дисплея 16х4 Ты повторяешься - это часть таймера. Если это еще один дисплей - то значит это еще одна такая-же часть таймера (кстати задачку с дисплеем на асме мы с тобой уже решали - стыдно называть обслуживание дисплея "задачей" временни оно почти не жрет). AM> Еще несколько малосущественных задач поскипано. AM> Посмотрел бы я на твой main() А майна - то и нет. Один только вызов control чтоб считать вагоны и парсер кнопок выстроенный в дерево чтоб работать с юзером ;)
Смысл в том, что счет вагонов - это детская задачка. Если я руководствуясь твоей логикой разложу на "задачи" алгоритм управления системой впрыска топлива и опережением зажигания для автомобильного двигателя - мы получим 150 "ЗАДАЧ" (c тем-же каном и реализацией сложнейших диагностических протоколов на 3 порядка выше твоих), с строгой реалтаймовой системой с привязкой даже не к времени - а к угловой скорости и угловым положениям! А вычисление угловой скорости от времени - недетская математика и скорострельность нужна. И ты думаешь там есть RTOS? ХА! Все это тупо пишется в 1 жирный майн в лоб на АСМ-MCS51 c правильными и грамотно придуманными обработчиками прерываний!
MP>> Поможет метка времени и счетчик обеспечивающий это самое MP>> детерминирование и промбуфер для данных полученных в прерываниях. MP>> Опять-же ничего нового я не увидел. AM> Метка времени чего, события? AM> Да мне его обработать уже надо и предпринять определенные действия, AM> скажем, через 200 мкс после его наступления. Hе вопрос - кладешь 200мс в тиках таймера в COMPARE регистр - через 200мкс возникает прерывание по событию compare где живет обработчик. Где проблему нашел - не вижу. MP>> Тебе дествительно интересно почему я объявлю его как massiv equ MP>> 0xx00h (где x - некие значения) или ты просто включаешь дурака? AM> Чтобы в ассемблере не попало, то нужно объявлять его в определенной AM> секции с указанием типа выравнивания, а не пользоваться equ. Hо во AM> первых, надо это помнить, во вторых, может просто не влезть, если AM> понадобится больше 256 байт. Господи боже мой, ну хочешь извращений - вот тебе извращения:
.data ... org ($ + 0xff) & 0xffffff00 massiv label byte ds 100h ...
AM> Andy WBR! Maxim Polyanskiy.