Torna indietro   Hardware Upgrade Forum > Software > Linux, Unix, OS alternativi

Due mesi di Battlefield 6: dalla campagna al battle royale, è l'FPS che stavamo aspettando
Due mesi di Battlefield 6: dalla campagna al battle royale, è l'FPS che stavamo aspettando
Abbiamo giocato a lungo a Battlefield 6, abbiamo provato tutte le modalità multiplayer, Redsec, e le numerose personalizzazioni. In sintesi, ci siamo concentrati su ogni aspetto del titolo per comprendere al meglio uno degli FPS più ambiziosi della storia dei videogiochi e, dopo quasi due mesi, abbiamo tirato le somme. In questo articolo, condividiamo con voi tutto ciò che è Battlefield 6, un gioco che, a nostro avviso, rappresenta esattamente ciò che questo genere attendeva da tempo
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Abbiamo messo alla prova il drone Antigravity A1 capace di riprese in 8K a 360° che permette un reframe in post-produzione ad eliche ferme. Il concetto è molto valido, permette al pilota di concentrarsi sul volo e le manovre in tutta sicurezza e decidere con tutta tranquillità come gestire le riprese. La qualità dei video, tuttavia, ha bisogno di uno step in più per essere competitiva
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Dopo oltre 4 anni si rinnova la serie Sony Alpha 7 con la quinta generazione, che porta in dote veramente tante novità a partire dai 30fps e dal nuovo sensore partially stacked da 33Mpixel. L'abbiamo provata per un breve periodo, ecco come è andata dopo averla messa alle strette.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 05-05-2003, 12:16   #1
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
Keyboard Interrupt

Salve ragazzi,

dovrei fare una modifica al kernel in modo che mi memorizzi in una variabile globale (creata da me) quanto tempo ci mette il Kernel a gestire una interruzione di tipo KeyBoard.

Credo che dovrò usare il sistema di Timing rdtsc presente sui Pentium:
è una funzione assembler e dovrebbe restituirire il valore di certi registri.

Gli IRQ da tastiera sono i numeri 1, quindi pensavo di vedere il tempo che trascorre da quando l'IRQ1 si presenta in uno dei registri succitati a quando si ri-presenta dopo essere stato interrotto dagli altri IRQ prioritari.

Ma non ho che ho le idee chiarissime..cosa mi consigliate?

Lo so che la questione non è stupida, quindi mi rivolgo agli intenditori del Kernel.

Grazie 1000 ai cervelloni che sapranno rispondere.
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 05-05-2003, 12:39   #2
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Re: Keyboard Interrupt

Se vuoi misurare il tempo di latenza dell'irq handler, guarda in drivers/char/pc_keyb.c:keyboard_interrupt.
Nota che la gestione degli irq è fatta in due parti; durante l'irq handler (keyboard_interrupt) le irq sono disabilitate; la gestione vera e propria viene fatta da un tasklet (v. drivers/char/keyboard.c, keyboard_tasklet e relativa funzione kbd_bh) che è eseguita al di fuori di keyboard_interrupt, e con gli irq abilitati (come normale).
Tra l'avvento dell'irq e l'avvio del tasklet può ovviamente intercorrere diverso tempo, è questo che devi misurare?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 05-05-2003, 12:54   #3
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
mmm no, ho letto male, il tasklet si occupa solo di gestire i led, la gestione è un pò più complicata e divisa in più parti. Le funzioni salienti sono
handle_scancode in keyboard.c (eseguita in irq context)
console_callback in console.c per la notifica/gestione dei vt (eseguita in process context, con la chiamata schedule_console_callback)
Probabilmente sei interessato solo alla parte eseguita in irq context, quindi puoi mettere la misura direttamente in keyboard_interrupt. Nota che durante la gestione gli irq si mantengono disabilitati (non ho verificato in dettaglio ma mi sembra così).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2003, 17:02   #4
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
Ehi! grazie per la risposta..il discorso è abbastanza tecnico e sono felice che qualcuno risponda.

Quello che io devo misurare è il tempo che intercorre da quando premo il pulsante a quando compare il carattere sullo schermo, ovvero tutto il flusso Input/Output:

-Premo tasto
-Interruzione al Kernel
-Gestione Interruzione da parte di Linux e della CPU.
-Ritorno a video di quello che mi aspetto (il carattere premuto appunto)

Stop.

Il tasklet per i leds che segnali, non dovrebbe interessarmi.
Invece l' elenco di operazioni che mi hai elencato nell' ultimo post è interessante.

Io immagino che l' IRW da tastiera sia gestito + o - come gli altri, ma con priorità molto bassa: a questo punto devo misurare il tempo di Control Path, incluse le funzioni differite (se mai ce ne sono).
Non penso sia difficile..se vuoi parlare + in dettaglio (se ti và di aiutarmi ) e pensi che il topic sia di poco interesse, possiamo farlo in pvt.

Grazie cmq..
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2003, 17:45   #5
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
E' un pò complicato quello che vuoi fare. Forse sarebbe meglio misurare il tempo intercorso da quando il tasto viene premuto a quando ad es. un programma utente lo "riceve". Se vai a "cercare" dove e quando viene stampato il carattere sullo schermo, non ne esci più (soprattutto se usi xfree, che non usa il kernel per l'output video).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 06-05-2003, 22:51   #6
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
OK, mi va bene anche come dici tu..tecnicamente quello che mi interessa è il tempo di gestione deel' interrupt..ovvero il tempo di Control Path..non so se mi segui..ciao
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 07-05-2003, 09:15   #7
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Il tempo di gestione dell'irq è semplice da misurare, basta misurare il tempo trascorso dentro pc_keyb.c:keyboard_interrupt().
Nota però che lo smistamento degli eventi della tastiera, una volta gestiti dall'interrupt, è posticipata a un altro kernel task. Quello che farei è:
- Prendere nota del tempo all'_entrata_ di keyboard_interrupt. Questo valore può essere esportato in un file dentro /proc.
- Un apposito programma utente è in read() su /dev/psaux. Appena arriva un tasto, prende nota dell'istante di arrivo, legge il valore scritto in /proc e tramite differenza misura il tempo trascorso.
Questo procedimento funziona sicuramente con XFree _non_ in esecuzione e tastiere ps/2. Se XFree è in esecuzione, potrebbe catturare lui gli eventi della tastiera, col risultato che ti perdi diversi tasti.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 07-05-2003, 10:26   #8
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
OK, ottima soluzione..ricapitoliamo:

-Piazzo una rdtsc (funziona per gli AMD che tu sappia?) in pc_keyb.c:keyboard_interrupt() . Appena arriva un IRQ da tastiera, mi faccio memorizzare dalla rdtsc il tempo dentro ad una variabile di profiling (che preferisco creare io).

- Tu dici: "è in read() su /dev/psaux" . Questa cosa non l'ho mai sentita! Ad intuito, immagino sia il device tastiera e il kernel è in read() ,ovvero in ascolto,degli input su questo device. Intendi questo?

-Ti confermo che non è necessario il funzionamento sotto XFREE..mi basta la shell e tastiera PS2.

Alla prossima.
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 07-05-2003, 10:50   #9
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originally posted by "fedo"


- Tu dici: "è in read() su /dev/psaux" . Questa cosa non l'ho mai sentita! Ad intuito, immagino sia il device tastiera e il kernel è in read() ,ovvero in ascolto,degli input su questo device. Intendi questo?
Sì. Però ho visto ora che /dev/psaux funziona solo col mouse...se aspetti un pò trovo una soluzione alternativa
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 07-05-2003, 11:05   #10
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Ok questo programmino è la soluzione; funziona anche sotto XFree:
Codice:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <termios.h>

int main() {
  unsigned char k;
  int fd = fileno(stdin);
  struct termios tty;

  tcgetattr(fd, &tty);
  tty.c_lflag &= ~ICANON;
  tty.c_lflag &= ~ECHO;
  tty.c_cc[VMIN] = 1;
  tty.c_cc[VTIME] = 0;
  tcsetattr(fd, TCSAFLUSH, &tty);

  while(1) {
    read(fd, &k, 1);
/* Mettere la misura qui */
    fprintf(stderr, "recv %02x\n", k);
  }
  return 0;
}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 07-05-2003, 11:22   #11
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
Grande!

Che codice ostico...forse perchè non conosco tutte le librerie. (Termios )

Quindi questo programmino che farebbe?

Si mette in ascolto per eventi da tastiera? come dovrei utilizzarlo?

Scusa per lo stress, ma mai mi sarei sognato di beccare sul forum uno che si "infilava" nell' argomento

ciao
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 07-05-2003, 11:30   #12
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Se skifezze di termios servono semplicemente a disabilitare l'echo, a settare il tempo minimo di delay e a impostare la ricezione dei caratteri appena arrivano (di default stdin è line-buffered).
Il funzionamento è semplice: il programma rimane bloccato sulla read finché non è disponibile un carattere in ingresso.

Nota che:
- Per ogni tasto premuto, vengono generate _più_ interruzioni. Ad es. sul mio sistema la pressione di un tasto normalmente comporta 3 interruzioni.
- I dati ricevuti dalla tastiera vengono smistati dal kernel nel layer console, che li gestisce al di fuori del contesto di interruzione.
- Il layer console provvede a "tradurre" i tasti in base al layout di tastiera impostato. Nota che alcuni tasti funzione generano _più_ di un "carattere".
- Appena un carattere è disponibile nel buffer di lettura, la read() viene "svegliata" e il controllo ripassa al programma.

Ovviamente quello che misureresti è l'intervallo tra l'ultima interruzione avvenuta e quando il carattere, finalmente decodificato e tradotto, viene passato al programma.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 07-05-2003, 12:30   #13
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
OK, ora ci metto le mani e poi ti faccio sapere..per ora sei stato prezioso..thx
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 14:23   #14
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
Rieccomi qui!

Il file che tu dici pc_keyb.c l' ho beccato ed anche la funzione keyboard_interrupt(). La riporto:


static void keyboard_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
#ifdef CONFIG_VT
kbd_pt_regs = regs;
#endif

spin_lock_irq(&kbd_controller_lock);
handle_kbd_event();
spin_unlock_irq(&kbd_controller_lock);
}


OK, guardando questo codice si nota che la gestione di un Interrupt di tastiera è gestito dalla funzione handle_kbd_event(), che come dice il nome è il "gestore" degli eventi Keyboard.

Le funzioni spin_lock_irq(&kbd_controller_lock) e spin_unlock_irq(&kbd_controller_lock) mi pare servano a bloccare il keyboard controller affinchè non pervengano altre interruzioni.
Anche qui i conti tornano: essendo un collegamento seriale, il controller deve trattare un tasto alla volta.
Però correggimi se sbaglio...

Tornando alla handle_kbd_event(), si nota questo codice:

if (status & KBD_STAT_MOUSE_OBF)
handle_mouse_event(scancode);
else
handle_keyboard_event(scancode);


dal quale si capisce che la funzione tratta anche il mouse.
...bisogna entrare in quella specifica della tastiera....Entriamoci dunque..

static unsigned char kbd_exists = 1;

static inline void handle_keyboard_event(unsigned char scancode)
{
#ifdef CONFIG_VT
kbd_exists = 1;
if (do_acknowledge(scancode))
handle_scancode(scancode, !(scancode & 0x80));
#endif
tasklet_schedule(&keyboard_tasklet);
}


Bene! E se ora io piazzo le letture del time in questa funzione? Uso una rdtsc o una gettimeofday() .

La questione è che la gestione dell' IRQ è comunque iniziata nelle funzioni precedenti e quel tempo non lo posso buttare. io direi di leggere il time nelle funzioni precedenti e poi, se è il mouse ad aver generato l' IRQ, butto tutto, altrimenti mi prendo quello che volevo.

Ti pare corretto ?

Ciao
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 14:25   #15
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 14:30   #16
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
Ahò! ma è un forum o una chat? Come hai fatto a rispondermi nel giro di un min?

Dunque il tempo lo prendo in maniera simile:

if (status & KBD_STAT_MOUSE_OBF)
handle_mouse_event(scancode);
else
{
int inizio = gettimeofday();

handle_keyboard_event(scancode);

int fine = gettimeofday();

proc_var = fine - inizio;
}


Ovviamente è un meta-linguaggio...
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 14:31   #17
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Chi o che cosa ti ha messo in testa che in kernel space puoi usare le funzioni delle glibc (tipo gettimeofday)?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 14:33   #18
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532


OK...sorry...

procedo con l' "ignorantissima" rdtsc corretto questo, la procedura è giusta no?
fedo è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 15:11   #19
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
O rdtsc oppure do_gettimeofday (v. linux/time.h -- credo che sia invocabile anche in irq context)
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 19-05-2003, 16:24   #20
fedo
Senior Member
 
L'Avatar di fedo
 
Iscritto dal: Mar 2001
Città: Roma
Messaggi: 2532
OK ora provo.

grazie
fedo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Due mesi di Battlefield 6: dalla campagna al battle royale, è l'FPS che stavamo aspettando Due mesi di Battlefield 6: dalla campagna al bat...
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare Antigravity A1: drone futuristico per riprese a ...
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator Sony Alpha 7 V, anteprima e novità della ...
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1 realme GT 8 Pro Dream Edition: prestazioni da fl...
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum OVHcloud Summit 2025: le novità del cloud...
'L'UE dovrebbe essere abolita': la spara...
Non solo smartphone: Samsung sta lavoran...
Nessuno vuole comprare iPhone Air: il va...
Porsche Taycan 2027 elettrica con cambio...
Roscosmos: stazione spaziale russa ROS a...
Auto 2035, sei governi UE (c'è l'...
Chernobyl: la cupola di contenimento non...
SSD come CPU: queste memorie sono in gra...
La previsione di CATL: barche elettriche...
Stangata in arrivo: PC e notebook coster...
Lian Li si è inventata il primo a...
Amazon in raptus sconti: ogni 24 ore nov...
44 idee regalo sotto i 50€: con le offer...
Super Sconti Amazon Haul: ribassi fino a...
Cloudflare ha bloccato 416 miliardi di r...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 18:57.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v