Поскольку вы спрашивали о Windows и Linux, я отвечу на оба ваших вопроса.
Linux:
В мире Linux почти все является файлом.Все получается от A до B, используя перенаправление вывода из одного двоичного источника в приемник (файл или файл устройства) или передачу вывода из одного двоичного файла в другой двоичный.Простейшим примером является символьное устройство, а простейшим примером символьного устройства является драйвер последовательного порта.
Следующая команда:
echo ciao > /dev/ttyS0
- прекрасный пример подключения пространства пользователя.в пространство ядра.
ПРИМЕЧАНИЕ: / dev / ttyS0 является стандартной номенклатурой для последовательного порта и эквивалентна COM1 в Windows.
Я отправил по крайней мере 4 байта всимвольное устройство / dev / ttyS0.Выполнение кода начинается в пространстве ядра, поэтому вызывается функция open () (определенная в драйвере) для инициализации последовательного порта, который до сих пор был отключен.
Эта инициализация в linux не только подготавливаетпоследовательный порт, но открывает линию TTY.TTY обозначает teletype, и он прозрачно управляет перемещением строки «ciao» на аппаратное устройство.
Вот шаги:
- Подготовка последовательной линии (или gpio или чего-либо еще)
- Создание буфера данных в ОЗУ для помещения данных в
- Отображение памяти аппаратных адресов в доступное для ядра пространство памяти
- Копирование данных из буфера ОЗУ в отображаемое в памяти оборудованиеадрес.
- Аппаратное устройство будет тогда делать все, что предназначено для этих данных: то есть модулировать и передавать данные RS232 или устанавливать высокий или низкий GPIO.
Windows:
В Windows устройства обычно не представлены в виде файлов, поэтому это необходимо делать программно.Системные вызовы практически одинаковы, и обычно интерфейс пользовательского пространства к пространству ядра обычно обеспечивается функциями типа: open (), read (), write () и close ().
Оба:
Эти вызовы обычно используются для всех типов драйверов, включая графические и звуковые драйверы.В моем примере с Linux я описал, как отобразить строку в символьное устройство, но я мог бы также отобразить шестнадцатеричное значение, представляющее определенный тон или частоту, на мое аудиоустройство, которое можно найти в /dev/audio0.
В случае GPIO процесс будет аналогичным: open (случайный файл или буфер), write (1) или write (0), copyfromuserspacetohwbuffer ().
Также в случае GPIO,Linux предоставляет простой способ доступа к GPIO и манипулирования им из пользовательского пространства.Посмотрите файловую систему proc.Он экспортирует такие пути, как / proc / gpio / gpio1 / value, где вы можете очень легко выводить 0 или echo 1 из оболочки или из прикладной программы.
Надеюсь, это прояснило ваши сомнения!
-Vittorio