[an error occurred while processing this directive] [an error occurred while processing this directive]
Ответ: Round-Robin
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено SergS 30 января 2002 г. 08:29
В ответ на: Господа, хотелось бы обсудить вопрос об обмене в многопроцессорной системе отправлено Serg Sidorov 29 января 2002 г. 15:51

Если ваше устройство представляет собой конструктивно законченное изделие, то я бы на Вашем месте подумал о замене зоопарка контроллеров на один более мощный контроллер. При этом проблема обмена между контроллерами перейдет в плоскость обмена между задачами. Конечно тогда придется использовать некое многозадачное ядро (готовое или написанное самостоятельно). Зато значительно облегчится процесс поддержки и модификации устройства так как не нужно будет знать 3 разных ассемблера и в принципе можно будет перейти на язык С.

Если же 3-х процессорная архитектура задана, то как я понимаю с точки зрения обмена данными у Вас используется модель Master-Slave, когда главный контроллер шлет запрос/команду, а получатель на нее пассивно отвечает. Многое зависит от интенсивности обмена и его равномерности. Если скорость генерации данных для передачи может превышать в какие то промежутки времени пропускную способность канала, может понадобиться механизм очередей. Как правило самый простой с точки зрения отладки - это циклический алгоритм (Round-Robin). То есть программа контролллера может представлять собой бесконечный цикл типа:
...
call function1
call function2
...
call communications
...
Подпрограмма communication может слать на передачу один байт (если в в передаваемом буфере есть непереданный байт) и принять один байт (если таковой пришел). Для отладки хорошо то, что здесь можно не использовать механизм прерываний. Но это работает только если длительность основного цикла меньше длительности передачи одного байта (или нескольких байт если в UART есть аппаратный буфер соответствующего размера) иначе начнутся потери при приеме.

Второй подход это когда в любой момент когда нужно передать данные вызывается соответствующая функция которая, скажем, передает команду и ждет ответа. При этом в узле Мастер так же можно обойтись без прерываний, но основной цикл при этом замораживается на время обмена.

Третий подход - когда коммуникационные функции реализованы как простые обработчики прерываний от UART. Основная программа готовит буфер для передачи (это разделяемая память которая может быть создана вызовом функции :-))и запускает процесс передачи, который идет независимо от основной программы по прерываниям. Приемный буфер так же заполняется по прерываниям (так как у Вас Master-Slave, двойной буферизации не нужно). Основная программа может просто в своем цикле осматривать флажок прихода пакета в приемный буфер и проверять семафор буфера передачи (нельзя этот буфер трогать, пока все данные оттуда не переданы).

Четвертый подход - когда коммуникации выделены в отдельную задачу (драйвер), который поддерживает прерывания, очереди, межзадачный обмен и т.п. Другими словами появляются признаки многозадачности, а это уже отдельный вид спорта (особенно с точки зрения отладки).

Полезную дополнительную информацию Вы можете почерпнуть здесь:
http://www.cta.ru/pdf/1997-2/software6_1997_2.pdf (290Кб)


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru