Re: GPIO
Добавлено: 23 ноя 2018, 10:37
Там есть одно интересное место, на которое можно убить много времени при экспериментировании ... его нужно повторить здесь:Olej писал(а):Описание работы с GPIO средствами системы (ядра) простенько, но в более чем достаточной мере, описано здесь:
В общем ... читайте источник.Авторы подсистемы GPIO видимо хотели, чтобы cat value срабатывал всегда, независимо от того, что записано в файле edge, поэтому первое чтение не будет блокироваться никогда. В принципе, это логично: для того, чтобы отслеживать изменения нужно сначала определить изначальное состояние. Однако, мне пришлось потратить почти часа два, и только в каком-то заброшенном форуме я нашел предположение, почему poll() не срабатывает и что для этого можно сделать.
Я открывал файл value на каждое чтение и очень удивлялся, почему не происходит блокировка. Оказалось, что файл нужно открывать один раз за весь сеанс слежения за линией, читать из него начальное значение и только тогда, последующие операции чтения будут блокироваться до появления указанного в edge события. И тут тоже есть одна тонкость: значения из файла value читаются только по смещению 0, в то время как вызов функции read() изменяет позицию чтения. Поэтому, перед вызовом read() нужно сбросить позицию чтения с помощью lseek(). В документации Linux эти моменты почему-то обойдены.