Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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
-
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.
-
Vdaka,
aspon viem na com som. Medzicasom som skusal aj tvoje riesenie, kde som si vytvoril script1.sh s obsahom:
#!/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:
#!/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
-
Vdaka,
aspon viem na com som. Medzicasom som skusal aj tvoje riesenie, kde som si vytvoril script1.sh s obsahom:
#!/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:
#!/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?-
-
To ti vlastne taky nepomuze. Napis si na to neco v C...
-
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
-
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.
-
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).
-
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...
-
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.
#!/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
-
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?
-
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
-
Na meziprocesovou komunikaci (IPC) ve skriptech pouzij pojmenovane pipy. http://www.linuxjournal.com/content/using-named-pipes-fifos-bash
-
Tak tu cast s prijimanim znakov uz mam rozbehanu nasledovnym sposobom:
#!/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
-
Pro emulaci stisknuti Enteru lze pouzit
xte 'key Return'
program xte je v balicku xautomation (alespon v debainu) a umi generovat eventy klavesnice i mysi ...
-
Pro emulaci stisknuti Enteru lze pouzit
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