Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Equilibrio e potenza definiscono il Samsung Galaxy S26+, un flagship che sfida la variante Ultra e la fascia alta del mercato con il primo processore mobile a 2nm. Pur mantenendo l'hardware fotografico precedente, lo smartphone brilla per un display QHD+ da 6,7 pollici d'eccellenza, privo però del trattamento antiriflesso dell'Ultra, e per prestazioni molto elevate. Completano il quadro la ricarica wireless a 20W e, soprattutto, un supporto software settennale
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr sbarca ufficialmente in Italia con tre modelli elettrici premium, X, 7X e 001, distribuiti da Jameel Motors su una rete di 52 punti vendita già attivi. La Zeekr X parte da 39.900 euro, la 7X da 54.100: piattaforma a 800V, chip Snapdragon di ultima generazione, ricarica ultraveloce e un'autonomia dichiarata fino a 615 km WLTP. Le prime consegne sono previste a metà aprile
Marathon: arriva il Fortnite hardcore
Marathon: arriva il Fortnite hardcore
Marathon è il titolo multiplayer competitivo del momento. Ecco quali sono le caratteristiche di gioco principali, insieme alle nostre prime considerazioni dopo qualche "run" nell'extraction shooter di Bungie
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-08-2007, 15:18   #1
mastoo
Member
 
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
[c]Temporizzazione ad elevata precisione in linux

ho scritto questo programma che dovrebbe eseguire eseguire delle istruzioni di output
temporizzate in modo preciso.
Codice:
#include <sys/time.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <asm/io.h>


int main(void)
{
	int i;
	struct timeval now;
	struct timeval after;
	
  
	if (ioperm(0x80,1,1)  )
	{
		perror("ioperm(0x80)"); 
		exit(1);
	}
	if (ioperm(0x378,1,1)  )
	{
		perror("ioperm(0x378) "); 
		exit(1);
	}
  	
	while(1)
	{		
		gettimeofday(&now, NULL);
		
		outb(1,0x378);
		usleep (1500);//primo sleep
		outb(0,0x378);
		usleep (30000);
		
		gettimeofday(&after, NULL); 
		printf("%d\n",after.tv_usec-now.tv_usec);
	}

	return 0;

}
ma la temporizzazione non è delle migliori infatti l'output è
Codice:
36218
31586
31864
34117
31589
31577
31749
31569
31572
31586
32310
37199
34089
31578
31574
31571
33305
32306
31591
31570
33859
33916
che non è di 31500 usec.
come posso aumentare la precisione soprattutto del primo usleep, l'altro ha poca importanza ma il primo deve essere preciso al massimo.
ho provato anche a eseguire tante istruzioni inb(80) ma il risultato è peggiore.
grazie per le risposte
mastoo è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2007, 15:51   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Credo che il modo migliore sia un'attesa attiva controllando continuamente il tempo, magari intervallata da delle usleep molto piccole per non impallare il sistema (tipo 20 microsecondi).
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2007, 16:43   #3
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
uhm, comunque faccia il multitasking del sistema operativo ci sarà sempre; interessante notare come la maggior parte dei valori sia poco maggiore di 31500, tranne ogni tanto che salta un po' di più; in quei punti evidentemente ci sono dei process switch verso processi che tardano a rilasciare la CPU perché hanno da lavorare. credo che la soluzione migliore sia alzare al massimo la priorità del processo (non so come si faccia su Linux), e poi casomai riabbassarla dopo il primo intervallo, che hai detto che è il più importante.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2007, 21:34   #4
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da mastoo Guarda i messaggi
che non è di 31500 usec.
Come puoi pretendere una granularità di 500us se lo scheduler viaggia a 1khz?

Il tuo usleep(1500) è decisamente critico, non puoi ottenerlo così. La tecnica da adottare dipende da quanta tolleranza puoi permetterti sui 1500us.
__________________
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

Ultima modifica di ilsensine : 11-08-2007 alle 21:37.
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2007, 21:36   #5
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
e già che ci sei, puoi sostituire l'accesso diretto alle porte di i/o (outb, ecc.) con il driver ppdev.
__________________
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 11-08-2007, 21:45   #6
eliano
Senior Member
 
L'Avatar di eliano
 
Iscritto dal: Mar 2002
Città: Capua (CE)
Messaggi: 317
googlando ho trovato una pagina con spunti interessanti:
http://www.pluto.it/files/ildp/HOWTO...ramming-4.html
__________________
Se pensi di sapere, sappi che non sai di non saperlo!
Le mie statistiche - "real man uses Duron!"
Ho fatto affari con: schumyFast, navale, The_Nameless_One, Sonic80, diamante.picci, Downset88, ilviandante, tecno789
eliano è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2007, 23:46   #7
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da ilsensine Guarda i messaggi
e già che ci sei, puoi sostituire l'accesso diretto alle porte di i/o (outb, ecc.) con il driver ppdev.
mi stavo giusto chiedendo come fosse possibile che quella cosa funzionasse... Linux permette ai programmi user-mode di accedere direttamente alle porte di I/O?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2007, 09:27   #8
mastoo
Member
 
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
Quote:
Originariamente inviato da ilsensine Guarda i messaggi
Come puoi pretendere una granularità di 500us se lo scheduler viaggia a 1khz?

Il tuo usleep(1500) è decisamente critico, non puoi ottenerlo così. La tecnica da adottare dipende da quanta tolleranza puoi permetterti sui 1500us.
la tolleranza è di +o- 12 us.
ho letto sulla guida di eliano di impostare il processo in soft realtime con sched_setscheduler() per utilizzare nanosleep
ma non so come fare.
mastoo è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2007, 09:35   #9
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
12 microsecondi è davvero poco...imho ti servirebbe un kernel realtime.
L'unico modo per farlo imho è un'attesa attiva in quel secondo e mezzo...
Codice:
do
{
   gettimeofday(&after, NULL); 
}
while(after.tv_usec - now.tv_usec < 1488);
Sfruttiamo la tolleranza per anticiparci un po'
E' comunque importante, come ti hanno detto, impostare l'applicazione ad una priorità molto alta.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2007, 09:45   #10
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Se ti serve:
Codice:
#include <sched.h>  
int set_real-time_priority(void)
{
struct sched_param schp;
    /*
     * set the process to real-time privs
     */
    memset(&schp, 0, sizeof(schp));
    schp.sched_priority = sched_get_priority_max(SCHED_FIFO);

    if (sched_setscheduler(0, SCHED_FIFO, &schp) != 0) {
            perror("sched_setscheduler");
            return -1;
    }

     return 0;

}
Nota...stai attento che mentre testi l'applicazione sarebbe bene non abilitare questa cosa oppure abilitarla e disabilitarla solo quando serve, perché se sbagli qualcosa ti si pianta il sistema.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2007, 09:49   #11
mastoo
Member
 
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
avevo gia provato cosi ma gli effetti sono gli stessi
pero non ho provato ad aumentare la priorita perche non so come si fa.
il fatto è per quello che sto facendo e importante che non ci siano impulsi di durata parecchio elevata tipo 1800 .
e poi che almeno la media sia di 1500 perche gli impulsi sono sempre piu grandi di 1500 e mai piu piccoli
mastoo è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2007, 10:05   #12
mastoo
Member
 
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
aumentando la priorita va leggermente meglio
Codice:
21538
22604
21538
21815
21556
21537
-978447
21546
21537
21834
22585
21523
22257
22056
21541
22360
21532
21516
22425
21555
21523
23637
21538
21519
21574
22909
21817
21526
21537
23236
21549
21535
ma ancora non basta.
cos' è il kernel realtime?
mastoo è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2007, 10:08   #13
vegeta83ssj
Senior Member
 
L'Avatar di vegeta83ssj
 
Iscritto dal: Feb 2002
Città: Modena
Messaggi: 592
Quote:
Originariamente inviato da mastoo Guarda i messaggi
cos' è il kernel realtime?
https://www.rtai.org/
Me l'hanno fatto usare all'università per dei progetti di Controlli Automatici!

Ciauz
vegeta83ssj è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2007, 10:22   #14
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da mastoo Guarda i messaggi
aumentando la priorita va leggermente meglio
Ci fai vedere lo stato del codice con questa ultima versione ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2007, 10:24   #15
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da mastoo Guarda i messaggi
la tolleranza è di +o- 12 us.
ho letto sulla guida di eliano di impostare il processo in soft realtime con sched_setscheduler() per utilizzare nanosleep
ma non so come fare.
Un kernel realtime può aiutare, come può aiutare usare il kernel ufficiale con scheduler SCHED_FIFO. Il tuo problema però è anche un altro, ovvero come ottenere uno sleep di 1500us. La usleep non aiuta (come non aiuta la nanosleep, che tra l'altro è utilizzata internamente dalla usleep), in quanto è legata al tick dello scheduler; per generare l'intervallo in maniera precisa mi vengono in mente due strade:
- busy loop per 1500 us: è la soluzione più semplice (e forse la più efficace, in congiunzione con SCHED_FIFO). La misurazione dell'intervallo dipende però dalla velocità del processore.
- utilizzo del driver rtc: unitamente a un kernel realtime e allo scheduler realtime, potresti avvicinarti a tolleranze della decina di us.
Come vedi, non è un problema banale.
__________________
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 12-08-2007, 10:26   #16
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Ci sarebbe anche il kernel low-latency che magari potrebbe sarti una mano...dipende da che distro hai, ad esempio su ubuntu si può installare da apt.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2007, 10:28   #17
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
IMHO ci sono anche altri problemi di misura...hai detto che l'importante sono i primi 1500 us, ma te stai misurando i 1500 us + i 20K us...è chiaro che le approssimazioni aumentano.
Fai quindi una misura separata dei due intervalli.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2007, 10:37   #18
mastoo
Member
 
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
Quote:
Originariamente inviato da ilsensine Guarda i messaggi
Un kernel realtime può aiutare, come può aiutare usare il kernel ufficiale con scheduler SCHED_FIFO. Il tuo problema però è anche un altro, ovvero come ottenere uno sleep di 1500us. La usleep non aiuta (come non aiuta la nanosleep, che tra l'altro è utilizzata internamente dalla usleep), in quanto è legata al tick dello scheduler; per generare l'intervallo in maniera precisa mi vengono in mente due strade:
- busy loop per 1500 us: è la soluzione più semplice (e forse la più efficace, in congiunzione con SCHED_FIFO). La misurazione dell'intervallo dipende però dalla velocità del processore.
- utilizzo del driver rtc: unitamente a un kernel realtime e allo scheduler realtime, potresti avvicinarti a tolleranze della decina di us.
Come vedi, non è un problema banale.
per busy loop tu intendi un ciclo di instruzioni inutili tipo nop che perdono tempo?
ma in questo caso lo scheduler non puo interrompere comunque il processo lo stesso .
io avevo provato con tanti inb(0x80) che avevano una durata fissa di 2 us devo riprovare con il processo ad alta priorità
mastoo è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2007, 10:50   #19
mastoo
Member
 
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
il codice è questo
Codice:
#include <sys/time.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <asm/io.h>
#include <string.h>

#include <sched.h> 
int set_real_time_priority(void); 


int main(void)
{
	int i;
	struct timeval now;
	struct timeval after;
	
  
	if (ioperm(0x80,1,1)  )
	{
		perror("ioperm(0x80)"); 
		exit(1);
	}
	if (ioperm(0x378,1,1)  )
	{
		perror("ioperm(0x378) "); 
		exit(1);
	}
	set_real_time_priority();
	
			
	for(i=0;i<50;i++)
	{	
		gettimeofday(&now, NULL);
		outb(1,0x378);		
		usleep(1480);
		gettimeofday(&after, NULL); 
		printf("%d\n",after.tv_usec-now.tv_usec);
		outb(0,0x378);
		usleep (20000);		
		
	}
	
	
	return 0;

}


	

int set_real_time_priority(void)
{
	struct sched_param schp;
    /*
	* set the process to real-time privs
    */
	memset(&schp, 0, sizeof(schp));
	schp.sched_priority = sched_get_priority_max(SCHED_FIFO);

	if (sched_setscheduler(0, SCHED_FIFO, &schp) != 0) {
		perror("sched_setscheduler");
		return -1;
	}

	return 0;

}
l'output questo
Codice:
1537
1525
1511
1511
1521
1511
1512
1510
1525
1522
1511
1512
1511
1510
1534
1510
1513
1511
1522
1521
1509
1525
1529
1511
1528
1509
1518
1510
1524
1528
1509
1511
1510
1524
1521
1614
1510
1511
1523
1532
1510
1520
1529
1511
1526
1511
1524
1527
1524
1521
prima vi avevo dato l'output sbagliato .
ora ci siamo quasi se con questo busy loop si puo miglorare ancora bene
se no mi accontento.
mastoo è offline   Rispondi citando il messaggio o parte di esso
Old 12-08-2007, 10:51   #20
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Già meglio
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
Marathon: arriva il Fortnite hardcore Marathon: arriva il Fortnite hardcore
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
PNY RTX 5080 Slim OC, sembra una Founders Edition ma non lo è PNY RTX 5080 Slim OC, sembra una Founders Editio...
Panasonic LUMIX TZ300: la nuova compatta...
La società aerospaziale italiana ...
Il Politecnico di Milano guiderà ...
Amazon Leo punta ad aumentare la cadenza...
Pro Type Ergo: Razer si lancia a gamba t...
Artemis II: dal guasto risolto alla toil...
Le immagini e i video più spettac...
Previsioni drastiche di TrendForce: la D...
La PS6 portatile sarà più potente della ...
Toshiba annuncia i primi dischi FC-MAMR ...
Amazon Leo offrirà l'accesso a Internet ...
Alienware presenta i nuovi desktop Area-...
Fiat 600 benzina senza ibrido: 101 CV, c...
DJI Mini 4K Combo a 269€ o DJI Neo da 14...
Addio agli sprechi nel riciclo: il Fraun...
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: 20:47.


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