реклама на сайте
подробности

 
 
> Обобщенные драйвера, продолжение моих старых идей.
Evgeny_CD
сообщение Jun 8 2008, 16:10
Сообщение #1


Гуру
******

Группа: СуперМодераторы
Сообщений: 2 065
Регистрация: 11-01-05
Из: Москва
Пользователь №: 1 892



Есть контроллер (UART, USB, Ethernet, ...). Можно работать с его регистрами напрямую "в лоб", но структурированность и переносимость такого кода нулевые.

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

Более того, симулятор может принимать команды для контроллера, передавать их по каналу связи на железяку с контроллером, и выполнять их там. Обратно можно передавать ответы реального контроллера и данные. Это небыстро, но, зачастую, на начальном этапе освоения контроллера роль ошибок в документации и ошибок воприятия документаци куда важнее скорости. Лично я ненавижу такую процедуру: записал дрова, откомпилил, прошил, запустил, проверил - не в дугу. Написал чуть по другому, собрал, снова залили и т.д.

Но накладных расходов никто не отменял! Если вместо проверки бита готовности в регистре я буду вызывать некую функцию, то где-то это может стать просто фатально. Мощность современых контроллеров растет, но все же не хочется закладывать принципиально избыточные решения.

Можно пойти по пути макросов, но это сложно и не сильно универсально (макрос раскрывается либо в вызов симулятора, либо в набор операций с регистрами контроллера).

Есть более изящный способ!!!!

Берем кодогенератор типа Templarian
http://sourceforge.net/projects/templarian

В нем прописываем все "методы" объекта контроллера. Для разных вариантов - симулятор, "телепортация", "родное" исполнение кода.

В нужных местах проекта вставляем "выход" такого кодогенератора - и вуаля! Автоматическая модификация текста под целевую платформу готова!

Преимущества над макросами уже описал. Преимущества над #ifdef очевидны.

Если я ничего не путаю, в методиках использования С++ это называется "отделение интерфейса от реализации". Снова я кусок С++ "изобрел" smile.gif

Продолжаем тему совершенствования работы с контроллерами.

Самое тупое, что бывает при освоении нового контроллера - это чтение линейной PDF документации на него. Т.е. ты вначале парсишь мозгами 10м файл, затем, осознав, из чего же состоит твой контроллер, уже немного начинаешь ориентироваться в нем.

Что касается самго процесса написания документации, то я так и вижу уходяшие к горизонту вереницы tecnical wrighters (надо полагать, прикованных за ногу к батарее), которые правят бесчисленные таблицы в документации какой-нибудь ATxmega. Хоть одна ошибка - и плеть надсмотрщика...

Мы пойдем другим путем.

Берем XML и строим иерархическую структуру типа:
* контроллер
* интерфейс контроллера
* регистр
* битовое поле (офсет и длина)
* зачения этого поля

Естественно, к каждой сущности приписано ее описание нормальным языком.

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

Из этой структуры автоматически генерим "картинки с текстом" в виде графа сущностей контроллера. Так будет просто на порядки нагляднее линейнго описания.

Теперь берем программистский редактор, который воспринимает наше описание как... DTD! Выглядит этот так:
* жмем кнопарь - хочу работать с периферией
* далее выбираем : контроллер -> интерфейс -> регистр -> битовое поле -> значение

На каждом шаге мне автоматически подсовывается список того, из чего я могу выбрать в данный момент. И все это оформляется как "вызов" кодогенератора!

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

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

В реальности регистры устройства состоят из многих полей, и, прежде чем проициализировать регистр я должен "синтезировать" все слово, записываемое в регистр.

Т.е. в тексте у меня это будет выглядеть как-то так
Код
Обращение к кодогенератору (Ethernet.Control.Satate_Of_Chip_WR,
                PKT_LEN =1560,
                SPEED=100,
                FLOW_CONTROL=ON)


что раскроется в выражение типа
Код
*((volatile unsigned int*)0xFFFF0000)=((0x618<<24)|(1<<2)|1));


Получается все сбалансированно - описание для кодогенератора совместимо с любым программером smile.gif (и оно совершенно понятно без тщательного чтения доки на чип), а plain С строка совместима с любым С компилятором.

Ну и в качестве вершины такого подхода можно предложить обобщенные методы.

Например, у нас есть Ethernet_Init, которому в качестве параметров передается длина пакета, скорость, ну и много чего. А этот метод раскрывается в целый кусок кода:
* сборка значений в регистры
* запись в нужной поледовательности
* проверка готовности
* пр.

Тогда этот самый Ethernet контроллер для внешнего мира выглядит как компактный набор методов, которые в реальности суть очень эффективный С код.

Комбинация двух описанных выше подходов возволяет полностью исключить ручную низкоуровневую модификацию исходников при переходе от навороченного синтетического порта к, например, ATmega88P, которая еще очень долго будет "уделывать" по потреблению все эти супернавороченные ARM'ы при работе от кварца 32768.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zltigo
сообщение Jun 9 2008, 18:48
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Evgeny_CD @ Jun 8 2008, 18:10) *
Есть контроллер (UART, USB, Ethernet, ...). Можно работать с его регистрами напрямую "в лоб", но структурированность и переносимость такого кода нулевые.

Со структурированностью - не согласен. Сам работал с пятью(шестью?) контролерами Ethernet. Никто уже чисто изобретением велосипедов не занимается, есть пару подсемейств и сруктурируются они достаточно хорошо. Как пример очень старый проект http://crynwr.com/.
С более простыми вещами, типа UART попытка наворотить еще один уровень абстракции просто отсекает некоторые приятные особености коннкретного чипа, загоняет его под общую гребенку. Ради чего? Ради того, что-бы вместо нескольких десятков строк кода получить десяток строк одинакового кода и несколько сот строк кода почему-то априори считающегося безошибочным виртуализатора?
Ну а если создан структурированный код, то и переносимость уже далеко не нулевая.
Потом появится новый контроллер не слишком вкладывающийся не вкладывающийся в прокрустово ложе. Что будем делать?
Приходит изобретатель:
- Я придумал автомат для бритья!
- И как он работает?
- Клиент опускает монетку в эту щель, засовывает голову в это отверстие — и шесть лезвий начинают его брить.
- Позвольте, но ведь у каждого человека индивидуальное строение лица?
- Ну, в первый раз — да…

Такой подход к делу считаю нехорошим, хотя и очень распростаненным. Причем распространеным вне зависимости от того "банальный драйвер", или новая чудо технология. Буквально на прошлой неделе разбирался с Интеловскими драйверами под Linux. Десять c лишним лет развития чипсетов фирмой Intel прошли мимо этих драйверов - добавляем новые VID и PID и минимальная поддержка на уровне базовых функций типа "работает". Все остальное оставляем за бортом.
Ну не получится всех под одну гребенку и
Цитата
* жмем кнопарь - хочу работать с периферией

без накладных расходов ввиде НЕ ИСПОЛЬЗОВАНИЯ возможностей железа.

Цитата
Если я ничего не путаю, в методиках использования С++ это называется "отделение интерфейса от реализации".

Только вот удачные реализации такого подхода встречаются редко sad.gif И то на относительно высоком уровне - драйвер-система, а отнюдь не регистр_железа-система.
Цитата
Самое тупое, что бывает при освоении нового контроллера - это чтение линейной PDF документации на него. Т.е. ты вначале парсишь мозгами 10м файл, затем, осознав, из чего же состоит твой контроллер, уже немного начинаешь ориентироваться в нем.

Отнюдь. Как человек освоивший немалое количество контроллеров, могу точно сказать, что дело обстоит совсем не так. Из чего состоит - на певой станице PDF. Дальше конкретные разделы. По тем-же UART - это считанные страницы. Не думаю, что свою абстакцию Вы сможете изложить на меньшем количестве страниц smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 04:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016