dzavalishin писал(а):
Конечно, всё это можно запихать в два .h файла, но кому от этого будет легче?
Но, вообще, openpod.h - это первый, pod_kernel_api.h - второй.
Всем легче. Основной мой посыл в том что-бы упростить. У вас через чур запутанная система. Если за 5 минут в ней нельзя с ориентироваться, то никто её даже рассматривать не будет.
Мне проще взять uIP и FatLib там всё четко и понятно. Даже в исходниках просто ориентироваться.
Берем u-boot тут шел, там специфичные вещи для чипа и тд. А у вас открываешь я ничерта не понятно. Сейчас я говорю о модульности и иерархичности проекта. Имена модулей согласно книги качественный код должны состоять из 1 слова. Если у вас они из 3-х, то что-о тут не не так, неправильно.
Цитата:
4. Нужны варианты API устройства для разных типов. У сетевого драйвера есть get mac address, а у видео - bitblt.
Возьмите ultibo там практически для всего есть интерфейс
https://github.com/ultibohub/Core/blob/ ... buffer.pasЦитата:
3. Нужны процедуры передачи драйвером найденных устройств от драйвера к ядру. Драйвер может порождать несколько устройств, иногда - разного типа.
Linux без этого обходится. Каждый программист может написать kmesg. А другой которому нужно распарсить и вызывать скрипт установки нужного драйвера mydriver -setup usb1.1
Цитата:
2. Нужны процедуры запуска и останова драйвера. Останова ещё ладно, его мало кто реально делает, но запуск - да.
В С++ это main() это все знают. Шучу, но в каждой шутке есть доля шутки. Я бы взял что-то стандартное к примерку как это сделано в миникс.
http://minix3.ru/docs/DriverProgramming-05.pdfЦитата:
1. Нужен набор сервисов со стороны ядра. В стандартном формате. malloc/interrupt/mutex/cond/mmap. Кстати, не все они ещё описаны в спецификации.
Вроде в спецификации L4 я виде все.
Цитата:
6. Эффективные драйвера (в частности - ahci и virtio) умеют ставить в очередь аппаратуре несколько запросов на ввод-вывод параллельно. Это значит, что точка входа в драйвер на запрос ввода-вывода не может быть синхронной, а должна иметь вид "запрос - мгновенный возврат - коллбек", а значит - нужно описать семантику работы с очередью. Чистым набором функций тут не обойтись. Нужно описание схемы работы, и там есть нетривиальные моменты, которые могут привести к race condition.
А вам точно нужен обратный вызов? Я бы остановился на идеологии REST, правда там решается путем опроса(polling - полинг не путать с пулингом)
https://ru.wikipedia.org/wiki/RESTИли как в ПЛК, когда есть ячейка в неё пишем.
race condition - двойной lock (википедию не читаем там описано неправильно с ошибками). В теории СУБД race condition давно научились бороться припомощи спецификаторов которые описывают как обращаться к данным что-бы не было DedLock'ов.
Называются эти спецификаторы как "
уровниметоды изоляции транзакций".
https://docs.microsoft.com/ru-ru/sql/t- ... s-pdw-2016 READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SNAPSHOT
| SERIALIZABLE
При помощи них можно описать как читать из очереди без блокировок. Хорошего описания у меня нету. В том смысле что-бы кратко и лаконично. Но я собрал все что касается этой темы, можно читать pdf они дублируют архив страниц.
https://yadi.sk/d/zeV90jnZHIN1cg