Portál AbcLinuxu, 10. května 2025 01:19
A nebo to naprogramuju do jednocipa a pres port do pc jenom nactu pocet tech impulsu. Ale s tim prerusenim by to bylo nejlepsi, nemusel bych nic bastlit.Zásadní věcí je jakou frekvenci očekáváš a jak přesně chceš měřit čas příchodu impulsu. Vždy existuje určitá doba odezvy. Napiš, k čemu to bude sloužit.
Modul do jadra napsat neumimNo naprosto chápu.
a mutlithreadovou aplikaci taky ne.Často se to tak dělá. Není to tak hrozné.
Periodicky zjistovat se mi to moc nechce, protoze nemam jistotu, ze chytnu vsechny impulsy. A jak myslis to rozdeleni do dvou aplikaci? Ta druha by to stejne musela periodicky zjistovat ne?Ta druhá by mohla být ve stavu "čekám na upozornění od jádra, že se něco stalo".
Je mi divny ze takovej modul do jadra jeste nikde neexistuje (teda ja ho nenasel).Jaderný modul pro obsluhu paralelního portu samozřejmě existuje, je běžnou součástí jádra a samozřejmě se stará o obsluhu přerušení. Druhá věc je, co přesně od něj očekáváš.
... a mutlithreadovou aplikaci taky ne.Je to celkem jednoduché. Problémy jsou akorát při ladění, ale dá se to. Malá ukázka jak to přibližně vypadá (vynechávám detaily):
void *druhe_vlakno(void *arg) { /* tady budes smatlat po portu */ } int main() { pthread_t vlakno; pthread_create(&vlakno, opt, druhe_vlakno, NULL); /* nejaky ten kod v puvodnim vlakne */ pthread_join(&vlakno); }Je to opravdu osekane, ale zakladni princip to snad vystihuje. Najdi si nejaky cely priklad. Podrobnosti v manu. Jmena funkci jsou skutecna, jakakoliv podobnost se skutecnosti je naprosto zamerna.
#!/usr/bin/env python import sys, os, threading, tty, fcntl, struct, time, signal class CTS_events(threading.Thread): def __init__(self, lock): self.fd = os.open('/dev/ttyS0', os.O_RDWR | os.O_SYNC) threading.Thread.__init__(self) self.events = 0 self.lock = lock def __call__(self): return self.events def run(self): while True: fcntl.ioctl(self.fd, tty.TIOCMIWAIT, tty.TIOCM_CTS) lock.acquire() self.events += 1 lock.release() lock = threading.Lock() cts_events = CTS_events(lock) cts_events.start() try: while True: lock.acquire() print cts_events() lock.release() time.sleep(1) except KeyboardInterrupt: os.kill(os.getpid(), signal.SIGTERM)Je to vícevláknové hlídání událostí na lince CTS u sériového portu. Hlavní vlákno každou sekundu vypisuje čítač a může dělat i cokoli jiného. Další vlákno tento čítač zvyšuje pokaždé, když dostane od jádra upozornění na změnu linky CTS. Čítač je chráněn zámkem, aby nedošlo ke konfliktům (ale to je možná zbytečné).
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.