Пишу программу работающую с GPIO посредством файловой системы. Сейчас испытываю её на самописном эмуляторе GPIO файлов. Обнаружил что опрос всех 26 файлов занимает минимум 0,04 секунды. Это нормально или слишком много?
Запрашиваю состояние следующим кодом:
Public Sub Main()
  ' Автомойка
  Dim tb, te As Float
  Dim Box1 As New BoxType
  Dim cGPIO As New ControlGPIO
  Dim TestBin As New Boolean[]
  Dim a As Integer, m As Integer
  
  LoadConfig ' Загрузка настроек
  tb = Timer
  cGPIO.ConfGPIO("/home/stas/virtual_gpio/", "/opt/write-string-to-file", 26)
  
  te = Timer
  TestBin = cGPIO.GetStatusGPIO()
  m = TestBin.Max
  For a = 1 To m
    If TestBin[a] = True Then Print "GPIO" & LTrim(Str(a)) & " = True"
  Next
  
  Print "Время " & Str(Timer - te)
  
End
На выходе получаю:
GPIO3 = True
Время 0,04341006278992
Ниже код класса.
' Gambas class file ControlGPIO
Public GPIOpath As String  ' В конце строки должен обязательно быть слэш
Public PathScriptGPIO As String  ' Скрипт для ввода значений в GPIO порт
Public MaxGPIO As Integer ' Сколько всего GPIO
Public DisabledReadGPIO As New Boolean[] ' Включает игнорирование данных GPIO при чтении
Public SubstitutionValueGPIO As New Boolean[] ' При отключенном чтении, возвращает значение из данного массива
Public DisabledWriteGPIO As New Boolean[] ' Включает игнорирование данных GPIO при записи. Воздействует на функцию WriteGPIO
' Данные ограничения и массив подмены не работают при сипользовании функции ReadGPIO напрямую
' Поэтому следует запрашивать данные через GetStatusGPIO с особыми параметрами
Public Function GetStatusGPIO() As Boolean[]
  ' Функция возвращает двоичный массив содержащий состояние GPIO входов
  Dim Result As New Boolean[]
  Dim a As Integer, m As Integer
  Dim r As Boolean
  Dim ResultRealRead As Boolean
  Dim t As Integer, i As Integer
  
  Result.Add(False) ' Нулевой элемент массива
  
 'обычное считывание
  For a = 1 To MaxGPIO
    r = False ' Флаг подмены
    If DisabledReadGPIO.Count > 0 Then
      ' Если есть запреты на реальное чтение
      If DisabledReadGPIO.Max <= a Then
        ' Если входит в зону запрета
        If DisabledReadGPIO[a] = True Then
          ' Запрет на реальное чтение
          ' Подмена
          If SubstitutionValueGPIO.Count > 0 Then
            'Есть подмены
            If SubstitutionValueGPIO.Max >= a Then
              'Подмена определена 
              r = True ' Совершить подмену
            Endif
          Endif
        Endif
      Endif
    Endif
      
    If r = True Then
      ' Подмена
      If a > Result.Max Then
        Result.Add(SubstitutionValueGPIO[a]) 'Добавление подменного результата
      Else
        Result[a] = SubstitutionValueGPIO[a] 'Замена образца на подменный результат
      Endif
    Else
      ' Реальное чтение
      ResultRealRead = ReadGPIO(a)
      If a > Result.Max Then
        Result.Add(ResultRealRead) 'Добавление прочитанного результата
      Else
        Result[a] = ResultRealRead 'Замена образца на прочитанный результат
      Endif
    Endif
  Next
  Return Result
End
Public Sub ConfGPIO(PathGPIO As String, ScriptWriteGPIO As String, MaxPortsGPIO As Integer)
  PathScriptGPIO = ScriptWriteGPIO
  MaxGPIO = MaxPortsGPIO
  
  If Len(PathGPIO) > 0 Then
    If Mid(PathGPIO, Len(PathGPIO), 1) = "/" Then
      GPIOpath = PathGPIO
    Else  
      GPIOpath = PathGPIO & "/" ' Добавляет в конце / слэш если он не передан
    Endif
      
  Endif
End
Public Function ReadGPIO(GPIOn As Integer) As Boolean
  Dim P As Process
  Dim t As String
  Dim t1 As String 
  Dim r As Boolean
  Dim s As String
  s = GPIOpath & "gpio" & LTrim(Str(GPIOn)) & "/value"
  Exec ["cat", s] To t
  If Len(t) > 0 Then
    t1 = Mid(t, 1, 1)
    If t1 = "1" Then r = True
  Endif
  Return r
End
Public Sub WriteGPIO(GPIOn As Integer, Value As Boolean)
  Dim s As String
  Dim t As String
  s = GPIOpath & "gpio" & LTrim(Str(GPIOn)) & "/value"
  If Value = True Then
    ' Ввод единицы
    Exec [PathScriptGPIO, "1", s] To t
  Else
    ' Ввод нуля
    Exec [PathScriptGPIO, "0", s] To t
  Endif
  'Print s
End
Public Sub Execute(IntegerArrayGPIO As Integer[])
  ' Функция выполняет команды записанные в виде целых чисел.
  ' Модуль числа определяет номер GPIO, а знак определяет значение.
  ' <0 False
  ' >0 True
  Dim a As Integer, m As Integer
  If IntegerArrayGPIO.Count > 0 Then
    'Если в массиве есть элементы
    m = IntegerArrayGPIO.Max
    For a = 0 To m
      If IntegerArrayGPIO[a] > 0 Then
        ' True
        WriteGPIO(Abs(IntegerArrayGPIO[a]), True) ' Функция Abs использована в данной строе для единообразия
      Endif
      If IntegerArrayGPIO[a] > 0 Then
        ' False
        WriteGPIO(Abs(IntegerArrayGPIO[a]), False)
      Endif
      ' Значение 0 игнорируется
    Next
  Endif
  
End
/opt/write-string-to-file
#!/bin/bash
echo "$1" > "$2" 2>/dev/null
exit 0




