bazzo54
Posts: 12
Joined: Thu Apr 11, 2013 8:46 am

Help Cpu 100% ( Risolto )

Fri Jul 13, 2018 1:53 pm

Buon pomeriggio a tutti

Avrei bisogno di un aiuto su un programma che ho fatto con Python , questo programma controlla il cambiamento dello stato d'ingresso di un pin del Gpio , ma questo causa l'utilizzo della cpu al 100%, vorrei che questo almeno si riduca al 50% vi allego immagine del top .
python_1.jpg
python_1.jpg (138.23 KiB) Viewed 295 times
questo e il file Python :

Code: Select all

 #! /usr/bin/python

##########################################
#                                        #
#     gestione  DTFM comandi MMDVM       #
#            2018 by I3YBD               #
#                                        #
##########################################

##########################################
#       leggenda codici Tastiera         #
#                                        #
#  * = 11 # = 12  A = 13  B =14  C = 15  #
#  D = 0  0 = 10                         #
#                                        #
#    A= stop DMR > attivo FUSION         #
#    B= stop FUSION > attivo DMR         #
#    #= reset pagina                     #
#    *= Reset totale Raspberry           #
# 1 - Digitare la PW ingresso  " 1954 "  #
# 2 - conferma  3 toni                   #
# 2 - errata  2 toni                     #
# 2 - reset pagina 1 tono lungo          #
# 3 - digitare funzione                  #
#     funz 1 = OFF TX                    #
#     Funz 2 = Disponibile               #
#     Funz 3 = usata dal Sistema         #
#     Funz 4 = usata dal Sistema         #
#     Digitare A uscire DMR > FUSION     #
#     Digitare B uscire FUSION > DMR     #
# 4 - Digitare # per uscire              #
##########################################



import subprocess
import os

import time
import RPi.GPIO as gpio

gpio.setwarnings(False)

# Iingresso scheda DTFM

Q1=5				# gpio05
Q2=22				# gpio22
Q3=27				# gpio27
Q4=17				# gpio17
SQ=4				# gpio04

# uscite

K1=6				# gpio06
K2=12				# gpio12
K3=16				# gpio16
K4=26				# gpio26

# variabili

A=0				# contatore password radio
B=0				# conversione decimale  DTMF
T=0				# dato confronto PW
C=0				# contattore passwor codec

PW_radio_ok=0			# reset password
PW_codec_ok=0			# reset password

K1_set=False			# controllo rele
K2_set=False			# Libero
K3_set=False			# usato dal sistema
K4_set=False			# usato dal sistema


start_DMR=1			# start DMR
start_FUS=0			# start Fusion
stop_DMR=0
stop_FUS=0
ST_codec=0			# start codec
ST_radio=0			# start radio

# PassWord

PW_radio=19			# password ingresso mmdvm_key "1954 "
PW_codec=36		        # password ingresso Codec " 061018 "







DTMF=False

gpio.setmode(gpio.BCM)

gpio.setup(Q1,gpio.IN)
gpio.setup(Q2,gpio.IN)
gpio.setup(Q3,gpio.IN)
gpio.setup(Q4,gpio.IN)

gpio.setup(K1,gpio.OUT, initial=1)
gpio.setup(K2,gpio.OUT, initial=1)
gpio.setup(K3,gpio.OUT, initial=1)
gpio.setup(K4,gpio.OUT, initial=1)



gpio.setup(SQ, gpio.IN, pull_up_down=gpio.PUD_DOWN)


def Dec(cod):

		R1=gpio.input(Q1)
		R2=gpio.input(Q2)
		R3=gpio.input(Q3)
		R4=gpio.input(Q4)

		B=R1+(R2*2)+(R3*4)+(R4*8)


		global A
		global T
		global C
		global PW_radio_ok
		global PW_codec_ok
		global ST_codec
		global K1_set
		global K2_set
		global K3_set
		global K4_set
		global start_DMR
		global start_FUS
		global stop_DMR
		global stop_FUS

		A=A+1
		T=T+B
		C=C+1




		if PW_radio_ok == 0:

			if A == 4:
				A=0

# programma ingresso comando DTFM
				if T == PW_radio:
	                      		PW_radio_ok=1
					RX_OK()
       		        		T=0
					A=0


				else:
					RX_KO()
					A=0
					T=0

			else:
				if B == 12 :
					reset()
					A=0
					T=0



		else:

# inizio programma comando rele

	          	if B == 1 and PW_radio_ok == 1:
			 	if K1_set == False:
					gpio.output(K1,0)		# comando Chiusura
 	              			K1_set=True


				else:

					gpio.output(K1,1)		# comando Apertura
					K1_set=False


			if B == 2 and PW_radio_ok == 1:
				if K2_set == False:
                	     	        gpio.output(K2,0)
                      		       	K2_set=True

	       			else:

	                       		gpio.output(K2,1)
	                       		K2_set=False




			if B == 12 and PW_radio_ok == 1:			# reset totale
					reset()
					PW_radio_ok=0
					T=0
					A=0




			if B == 13 and PW_radio_ok == 1:			# tasto "A" cambio codec
					os.system("sudo systemctl stop mmdvmhost_dmr.service")
					time.sleep(5)
					stop_DMR=0
					os.system("sudo systemctl start mmdvmhost_fus.service")
					time.sleep(2)
					start_FUS=1




			if B == 14 and PW_radio_ok == 1:			# tasto "B" cambio codec
					os.system("sudo systemctl stop mmdvmhost_fus.service")
					time.sleep(5)
					stop_FUS=0
					os.system("sudo systemctl start mmdvmhost_dmr.service")
					time.sleep(2)
					start_DMR=1



			if B == 11 and PW_radio_ok == 1:			# tasto "*" reset Raspberry
					time.sleep(2)
					os.system("sudo reboot")




def RX_OK():		# tre impulsi buono

						time.sleep(1)
                                                gpio.output(K3,0)
                                                time.sleep(.5)
						gpio.output(K4,0)
                                                time.sleep(.5)
                                                gpio.output(K4,1)
                                                time.sleep(.5)
                                                gpio.output(K4,0)
                                                time.sleep(.5)
                                                gpio.output(K4,1)
						time.sleep(.5)
						gpio.output(K4,0)
                                                time.sleep(.5)
                                                gpio.output(K4,1)
						time.sleep(.5)
						gpio.output(K3,1)

def RX_KO():		# due impulsi errato

						time.sleep(1)
                                                gpio.output(K3,0)
                                                time.sleep(.5)
						gpio.output(K4,0)
                                                time.sleep(.5)
                                                gpio.output(K4,1)
                                                time.sleep(.5)
						gpio.output(K4,0)
                                                time.sleep(.5)
                                                gpio.output(K4,1)
						time.sleep(.5)
						gpio.output(K3,1)

def reset():		# un impulso lungo
						time.sleep(.1)
						gpio.output(K3,0)
						time.sleep(.5)
						gpio.output(K4,0)
						time.sleep(2)
						gpio.output(K4,1)
						time.sleep(.5)
						gpio.output(K3,1)


def Key():		# due impulsi veloci key pervento

						time.sleep(.5)
						gpio.output(K3,0)
						time.sleep(.5)
						gpio.output(K4,0)
						time.sleep(.5)
						gpio.output(K4,1)
						time.sleep(.5)
						gpio.output(K3,1)



#Ieriamo un avento che causera la chiamata della funzione "Cambio di stato"
# ogni volta che viene rilevato un fronte di salita sul pin SQ

gpio.add_event_detect(SQ,gpio.RISING, callback=Dec, bouncetime=100)

while 1:
		if DTMF:
			DTMF=False
		else:
			DTMF=True
Last edited by bazzo54 on Fri Jul 13, 2018 7:20 pm, edited 3 times in total.

User avatar
Paeryn
Posts: 2217
Joined: Wed Nov 23, 2011 1:10 am
Location: Sheffield, England

Re: Help Cpu 100%

Fri Jul 13, 2018 4:57 pm

Scusa se questo legge male, io sono Google che traduce la mia risposta inglese in italiano.

Sorry if this reads badly, I am Google translating my English answer into Italian.

Quando si pubblica un codice, è necessario inserirlo all'interno dei tag del codice in modo tale da preservare il rientro che è importante per Python.

When posting code you should put it inside code tags so that indentation is preserved which is important for Python.

Code: Select all

[code]
# Metti il tuo codice qui
# Put your code here
[/code‍]
Stai usando il 100% della cpu a causa di questo bit di codice alla fine che si sta riavvolgendo indefinitamente, senza un sleep() nel ciclo, la CPU sta spendendo tanto tempo quanto è in grado di eseguire quelle poche righe. Basta brevemente sleep() è meglio che non sleep() a meno che non si voglia veramente attivare DTMF il più velocemente possibile.

You are using 100% cpu because of this bit of code at the end which is looping indefinitely, without a sleep() in the loop the cpu is spending as much time as it can executing those few lines. Just a short sleep() is better than no sleep() unless you really want to toggle DTMF as fast as possible.
bazzo54 wrote:
Fri Jul 13, 2018 1:53 pm

Code: Select all

while 1:
		if DTMF:
			DTMF=False
		else:
			DTMF=True

Code: Select all

while 1:
	if DTMF:
		DTMF=False
	else:
		DTMF=True
	sleep(0.01)
Last edited by Paeryn on Fri Jul 13, 2018 8:49 pm, edited 1 time in total.
She who travels light — forgot something.

bazzo54
Posts: 12
Joined: Thu Apr 11, 2013 8:46 am

Re: Help Cpu 100%

Fri Jul 13, 2018 7:19 pm

Grazie Paeryn !!!
:D :D :D :D

Return to “Italiano”