По итогам переписки с blindman'ом в аське возникли примерно такие идеи:
1. Чтобы изолировать разработку драйверов от компоновки их в устройство нужно, чтобы драйверам система выделяла адресное пространство по регистрам, а они в нём потом работали;
2. Во всех таких устройствах должен быть предопределенный драйвер который всегда есть и он отвечает на запросы о том, какие драйвера установлены, какие у них версии и с какого адреса по какой - их адресное пространство.
3. Кроме информации о том, что драйвер работает в таком-то адресном пространстве должно быть некоторое описание этого драйвера, типа "что это?". И вот тут начинается неопределенность. Можно от 1 байта запользовать под идентификацию типа драйвера до строки + 2 байта - на строковое название драйвера и 2 байта - номер версии и субверсии.
Добавлено спустя 3 минуты 7 секунд: Такой подход нисколько не усложняет работу с устройствами по сравнению с текущей схемой, когда драйверы располагаются по конкретным адресам. Если мы не хотим писать код, который будет совместим с кучей разных контроллеров - можем прописать в своей программе работающей с контроллером конкретные адреса везде.
Более гибкая схема - сделать эти адреса настраиваемые, или стартовые адреса настраиваемые. Но тогда пользователь сам должен будет следить, чтобы всё было указано правильно.
А если мы предоставляем вот такой инструмент интроспекции, то можно будет сделать удобный визард, который позволит пользователю гораздо проще настраивать софт робота с любым нашим контроллером.
=DeaD= писал(а):Я бы посадил его на несколько первых адресов, чтобы сделав запрос по номеру драйвера получить обратно по нему полную инфу.
Одного вполне достаточно. Пишем туда запрос, читаем из него же ответ. Формат ответа зависит от запроса. Если нужна передача строк - ограничиваем их длину.
Неее... нарушается логика - не должны мы из 1 адреса читать более 1 байта. Если читаем 2 байта - это читаем 2 адреса.
Добавлено спустя 44 секунды: Раздавать централизованно - ну можно. Надо тогда диапазон выделить типа 192.168.х.х чтобы там пользователи могли что угодно делать
blindman писал(а):Почему это не должны? Как это не читать более 1 байта? Наверно что-то другое имелось в виду?
Да вроде нет, вроде в I2C всегда если я читаю 10 байт с адреса 00 это эквивалентно чтению по очереди по 1 байту с каждого из 10 адресов начиная с 0 и заканчивая 9.
Или я что-то упустил в стандарте i2c и типичных его реализациях?
Добавлено спустя 1 минуту 42 секунды: может не в тему: т.к. у нас возможен мультимастер, то мы можем писать по адресу 0 свой адрес (буфер), а потом ждать, когда нам драйвер по этому адресу все выгрузит. подойдет?
а контроллер может выступать в роли ведомого, т.е. возможна схема из вложенных контроллеров? если нет, то 255 адресов - вполне достаточно, ведь адрес только указывает на модуль (кто навешает на бота 200 модулей )
оки. давайте, чтоб не путаться: 1. адрес - в и2с - это 7 бит, указывающих конкретный модуль (физический). также может быть 10-бит. 2. регистр - в и2с - это 8 бит, адресующих память внутри конкретного устройства.
вот о регистрах и говорим? согласно стандарту и2с чтение последовательно двух байт при задаче N-го регистра равносильно чтению подряд регистров N и N+1. Инкремент номера регистра производится автоматически.
blindman, мы об этом. если это не учитывать, то уже не и2с получается.
Добавлено спустя 2 минуты 14 секунд: или мы делаем "надстройку над регистрами"?
Добавлено спустя 1 минуту 1 секунду: т.е. вводим что-то вроде портов? типа в регистре "0" устройства лежит номер порта буфера, куда складывать данные? как-то коряво
Еще раз. Забудьте на время о I2C. Нету его. Есть система драйверов, описанная здесь : viewtopic.php?f=69&t=5890. Чтобы понять о чем мы сейчас говорить надо почитать документацию в архиве который я там выкладывал. Код здесь : http://hg.vehq.ru/orfa/file/
Мы хотим сделать так, чтобы любому драйверу могли быть назначены произвольные регистры, и описать протокол получения информации о присутствующих драйверах и их регистрах, причем раздавать такую инфу должен специализированный драйвер, который присутствует всегда, и использует фиксированный регистр (ну или группу регистров)