[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [gulliver] Python et la gestion des signaux


From plaunay1 <pierre dot launay at ac-rennes dot fr>
Subject Re: [gulliver] Python et la gestion des signaux
Date Mon, 21 Apr 2008 23:16:52 +0200

Patrick Lamaizière a écrit :

/* Quand on veut tester qu'on passe bien dans un programme d'IT,
on place un drapeau dans celui-ci et c'est dans le programme
principal qu'on l'affiche

Tu auras *toujours* une fenêtre de temps où le drapeau ne sera pas pris en compte. À moins de bloquer le signal.

J'ai du mal à comprendre.

Si je place, void signal_handler_IO (int status)
{
wait_flag = FALSE;
}
dans une interruption d'un microcontrôleur, le danger est que wait_flag=FALSE avant dans ce cas on perd une info, on le mettrais 2 fois à FAUX avant de mettre wait_flag à VRAI.


Mais les IT étant prioritaires on verra forcément wait_flag=FALSE dans le programme principal.

C'est sur le PC est plus complexe qu'un microcontroleur.

Pour info voici le source des fonctions inWaiting() et read()
dans le fichier serialposix.py

def inWaiting(self):
"""Return the number of characters currently in the input buffer."""
#~ s = fcntl.ioctl(self.fd, TERMIOS.FIONREAD, TIOCM_zero_str)
s = fcntl.ioctl(self.fd, TIOCINQ, TIOCM_zero_str)
return struct.unpack('I',s)[0]


def read(self, size=1):
"""Read size bytes from the serial port. If a timeout is set it may
return less characters as requested. With no timeout it will block
until the requested number of bytes is read."""
if self.fd is None: raise portNotOpenError
read = ''
inp = None
if size > 0:
while len(read) < size:
#print "\tread(): size",size, "have", len(read) #debug
ready,_,_ = select.select([self.fd],[],[], self._timeout)
if not ready:
break #timeout
buf = os.read(self.fd, size-len(read))
read = read + buf
if self._timeout >= 0 and not buf:
break #early abort on timeout
return read


Pierre