Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: miso 27. 04. 2012, 17:21:42

Název: Zachytávání přerušení ze sériového portu
Přispěvatel: miso 27. 04. 2012, 17:21:42
Zdravim,

vedel by niekto pomoct so scriptom, ktorý by po každom prijatom bajte vyvolal prerušenie od IRQ4 a zavolal nejakú funkciu z jeho obsluhou?

Účel je taký, že na ATmege dekodujem signály z dialkového ovládača a podla nich posielam data cez seriovy kanal do PC, na základe ktorych budem spustat jednotlive prikazy v shelly.

Dnes som s tym zabil kopu casu a jedine k comu som sa dostal je prikaz "trap", ktorý vsak, ak som spravne pochopil dokaze zavolat funkciu len od softwaroveho prerusenia.

Vdaka

Miso
Název: Re:Prerusenie od serioveho portu
Přispěvatel: gsdfgsdgsdg 27. 04. 2012, 20:14:33
to by sis musel udelat modul do kernelu, abys mohl pracovat s interruptem ze seriove linky.
jednodussi reseni a pouze v uzivatelskem prostoru by bylo napsat daemon programek, ktery by cyklicky cetl data z seriove linky a provadel nejakou cinnost,
po zbytek casu by spal.
Název: Re:Prerusenie od serioveho portu
Přispěvatel: miso 27. 04. 2012, 21:41:34
Vdaka,

aspon viem na com som. Medzicasom som skusal aj tvoje riesenie, kde som si vytvoril script1.sh s obsahom:

Kód: [Vybrat]
#!/bin/bash

stty 115200 -F /dev/ttyS0

while true
do
read -n 1 COMMAND < /dev/ttyS0
export COMMAND
echo "$COMMAND"
done

,ktory sluzi na citanie bytu zo serioveho portu a zaroven uklada obsah do premennej prostredia COMMAND, a srtipt2.sh s obsahom:

Kód: [Vybrat]
#!/bin/bash

while true
do
echo "$COMMAND"
sleep 1
done

, kde sa snazim obsah premennej COMMAND precitat, avsak bez uspechu. Script1 a 2 su spustene vo zvlast terminalovych oknach, pricom script1 pracuje OK (t.j. vypisuje prijate data), avsak script2 vypisuje iba biele znaky. Neviete kde moze byt chyba?

Miso
Název: Re:Prerusenie od serioveho portu
Přispěvatel: hu 27. 04. 2012, 21:44:56
Vdaka,

aspon viem na com som. Medzicasom som skusal aj tvoje riesenie, kde som si vytvoril script1.sh s obsahom:

Kód: [Vybrat]
#!/bin/bash

stty 115200 -F /dev/ttyS0

while true
do
read -n 1 COMMAND < /dev/ttyS0
export COMMAND
echo "$COMMAND"
done

,ktory sluzi na citanie bytu zo serioveho portu a zaroven uklada obsah do premennej prostredia COMMAND, a srtipt2.sh s obsahom:

Kód: [Vybrat]
#!/bin/bash

while true
do
echo "$COMMAND"
sleep 1
done

, kde sa snazim obsah premennej COMMAND precitat, avsak bez uspechu. Script1 a 2 su spustene vo zvlast terminalovych oknach, pricom script1 pracuje OK (t.j. vypisuje prijate data), avsak script2 vypisuje iba biele znaky. Neviete kde moze byt chyba?

Miso

A je to druhy okno potomkem shellu z prvniho?-
Název: Re:Prerusenie od serioveho portu
Přispěvatel: hu 27. 04. 2012, 21:51:48
To ti vlastne taky nepomuze. Napis si na to neco v C...
Název: Re:Prerusenie od serioveho portu
Přispěvatel: miso 27. 04. 2012, 21:58:11
To ti vlastne taky nepomuze. Napis si na to neco v C...

Hah, no tomu som sa chcel prave vyhnut. Myslel som, ze v shelly to zbucham za moment a naviac si netrufam napisat prog. v C, ktory by ovladal terminal.


Miso
Název: Re:Prerusenie od serioveho portu
Přispěvatel: -klusacek- 27. 04. 2012, 22:38:38
V Cecku si normalne otevri /dev/ttyS0 pro cteni nebo kde mas ten port a pak cekej na data pomoci select(). V Unixu to funguje tak, ze porgram v selectu usne a kdyz pak prijde preruseni (po prijatem bytu) tak ti ho OS probudi a pomoci read() muzes precist co to bylo (neni nikde zaruceno ze to bude jen 1 byte -- system mohl byt zneprazdneny a mezitim mohly prijit dalsi byty, ale dokud se nenaplni vstupni fronta tako to OS bufferuje). Muzes precist i jen ten 1 (i kdyby jich cekalo vic) a az priste vlezes do selectu tak se vubec nebude spat a rovnou te to pusti k read().

Mozna jde neco ekvivalentniho zaridit i v shellu, ale v Ccku mi to prijde jednodussi (a taky min narocny na pamet a CPU cas).

Jo a jeste pred tim otevrenim budes muset linku zkonfigurovat pomoci stty (rychlost, start-stop bity atd, je dobry ji prepnout do raw modu, nelip udelas kdyz si prectes `man stty'). A taky si dej pozor jestli user pod kterym to spoustis ma pravo aby s ni manimuloval.


Název: Re:Prerusenie od serioveho portu
Přispěvatel: -klusacek- 27. 04. 2012, 23:19:01
nebo pokud ten program nema reagovat na nic jineho nez ttyS0 tak vlastne ani select nepotrebujes, staci read() ten se blockne dokud neprijde byte (muzes cist i vetsi blok naraz, pak read vrati pocet prectenych znaku).
Název: Re:Prerusenie od serioveho portu
Přispěvatel: hu 27. 04. 2012, 23:35:42
nebo pokud ten program nema reagovat na nic jineho nez ttyS0 tak vlastne ani select nepotrebujes, staci read() ten se blockne dokud neprijde byte (muzes cist i vetsi blok naraz, pak read vrati pocet prectenych znaku).

V pripade cteni vetsiho mnozstvi B je ovsem treba si napsat nejake FIFO (frontu), jelikoz nam zprava vyslana periferii muze prijit splitla mezi nekolik readu. Jestli jde o reseni "rychle k cili", cti to po jednom bajtu a kasli na to...
Název: Re:Zachytávání přerušení ze sériového portu
Přispěvatel: miso 28. 04. 2012, 10:44:02
Skusam to este cez shell, potreboval by som pomoct, ako nasledovny script upravit tak, aby mi po kazdom priechode cyklom (t.j. po kazdom prijatom bajte) aktualizovalo premennu COMMAND a bola viditelna v shelly aj pre dalsie scripty.

Kód: [Vybrat]
#!/bin/bash

stty 115200 -F /dev/ttyS0

while true
do
read -n 1 COMMAND < /dev/ttyS0
export COMMAND
bash
done

Tento script spustam na pozadi prikazom "sh script.sh &", ale po prijati 1. bajtu mi ho zastavi.

Miso
Název: Re:Zachytávání přerušení ze sériového portu
Přispěvatel: hu 28. 04. 2012, 11:24:13
Samozřemě, když na konci těla cyklu pouštíš novej bash. Ten se spustí a čeká na příkazy... já pořád nechápu, o co ti jde. Co přesně to má dělat?
Název: Re:Zachytávání přerušení ze sériového portu
Přispěvatel: miso 28. 04. 2012, 11:49:34
Ide mi o vytvorenie toho daemon programu pre citanie dat z portu, ktory bude bezat nezavisle na hlavnom programe a aktualizovat premennu COMMAND. Zatial to riesim zapisom hodnoty do suboru v daemon programe, a vycitanim tejto hodnoty zo suboru v hlavnom programe avšak toto riešenie nie je sa mi nazdá efektivne. Prosim o strpenie, so shell scriptami som zacal pre tyzdnom.

Miso
Název: Re:Zachytávání přerušení ze sériového portu
Přispěvatel: hu 28. 04. 2012, 14:16:18
Na meziprocesovou komunikaci (IPC) ve skriptech pouzij pojmenovane pipy. http://www.linuxjournal.com/content/using-named-pipes-fifos-bash
Název: Re:Zachytávání přerušení ze sériového portu
Přispěvatel: miso 29. 04. 2012, 09:48:06
Tak tu cast s prijimanim znakov uz mam rozbehanu nasledovnym sposobom:
Kód: [Vybrat]
#!/bin/bash

stty 115200 -F /dev/ttyS0

if [ ! -p "my_pipe" ]; then #create my_pipe if not exist
mkfifo my_pipe
fi

sh daemon.sh &

while true
do
read -n 1 temp < my_pipe

case "$temp" in
0 ) echo UP;;
1 ) echo DOWN;;
2 ) echo LEFT;;
3 ) echo RIGHT;;
4 ) echo ENTER;;
* ) exit 0;;
esac

done

Teraz by som potreboval nasmerovat, ako jednotlivim znakom priradit nejaku funkciu. Napr. ak pride znak "4" aby PC vykonal taku istu akciu, akoby som zmackol enter na klavesnici.

Miso
Název: Re:Zachytávání přerušení ze sériového portu
Přispěvatel: qazasd 29. 04. 2012, 20:35:16
Pro emulaci stisknuti Enteru lze pouzit

Kód: [Vybrat]
xte 'key Return'
program xte je v balicku xautomation (alespon v debainu) a umi generovat eventy klavesnice i mysi ...
Název: Re:Zachytávání přerušení ze sériového portu
Přispěvatel: miso 29. 04. 2012, 22:26:23
Pro emulaci stisknuti Enteru lze pouzit

Kód: [Vybrat]
xte 'key Return'
program xte je v balicku xautomation (alespon v debainu) a umi generovat eventy klavesnice i mysi ...

Parada, uz to vali, ze to bude az take jednoduche som necakal. Vdaka

Miso