Автор Тема: Как уменьшить нагрузку на проц от наблюдения за gpio?  (Прочитано 394 раз)

Оффлайн brunh

Пользуюсь скриптом, который периодически проверяет состояние gpio и из за этого грузит процессор, паузы в 0.2 секунды помогли, нагрузка упала до 40%, что тоже много.
Процессор не греется, остальные процессы работают нормально, иногда слетает стриминг. может не от этого.
   731 root      20   0    8692   3464   1612 R  26.8  0.3   1123:18 python
19272 root      20   0       0      0      0 S  20.2  0.0   6:18.85 kworker/u:0
19368 root      20   0       0      0      0 S  17.2  0.0   6:04.42 kworker/u:4
  717 root      20   0   15600  10000   2964 S  10.6  1.0 426:49.05 python
28835 root      20   0       0      0      0 S   6.9  0.0   2:36.25 kworker/u:2
   68 root      rt   0       0      0      0 S   4.6  0.0 155:16.93 cfinteractive
  603 root      20   0  124392  29372   5600 S   1.0  2.9  58:32.54 doorpi_cli
 4094 root      20   0    4548   1176    812 R   0.7  0.1   0:00.17 top
14782 root      20   0   42104   3200   2944 S   0.7  0.3   2:25.75 mjpg_streamer

кусок скрипта, по событию записывает в файл значение фальш, затем перезаписывает как тру, сначала идет ридер, потом две кнопки:
while continue_reading:
  (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
  if status == MIFAREReader.MI_OK:
    print "Card detected"
  (status,backData) = MIFAREReader.MFRC522_Anticoll()
  if status == MIFAREReader.MI_OK:
    numer = str(backData[0])+str(backData[1])+str(backData[2])+str(backData[3])+str(backData[4])
    file=open(path+'/'+numer,'w')
    file.write("false")
    file.close()
    time.sleep(0.2)
    file=open(path+'/'+numer,'w')
    file.write("true")
    file.close()
  time.sleep(0.2)
 
  if gpio.input(port.PC7) == 0: #input button
filename = '/usr/local/etc/DoorPi/virtual/inputs/599' # bell
f = open (filename, 'w')
        f.write('false')
        f.close()
        time.sleep (0.2)
        f = open (filename, 'w')
f.write('true')
f.close()
time.sleep(1)
  if gpio.input(port.PC4) == 0: # exit button
filename = '/usr/local/etc/DoorPi/virtual/inputs/5888'# open door
f = open (filename, 'w')
        f.write('false')
        f.close()       
        time.sleep(0.2)
        f = open (filename, 'w')
        f.write('true')
f.close()
time.sleep(1)
  else:
time.sleep(0.2)


« Последнее редактирование: Февраль 15, 2017, 08:13:03 am от brunh »

Оффлайн alexsis_76

используйте wiringPi он правда не очень сочетается с языками интерпретаторов ну или библиотеку которую я выкладывал заодно и узнаем какую он создает нагрузку

Оффлайн brunh

Думаете дело в библиотеке? Пользуюсь pyA20.

Оффлайн alexsis_76

навряд ли,хотя кто его знает,библиотека проста, читает,пишет прямо в регистры процессора,wiringPi может работать с прерываниями,это более правильный подход,может быть нагрузку создает интерпретатор ,попробуйте запустить код на си посмотрит,попробуйте в интерпретаторе только опрашивать порты,посмотрите что изменилось.
« Последнее редактирование: Февраль 19, 2017, 05:46:56 am от alexsis_76 »