Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-08-2007, 16: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, 16: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, 17: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, 22: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 22:37.
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 11-08-2007, 22: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, 22: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 12-08-2007, 00: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, 10: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, 10: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, 10: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, 10: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, 11: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, 11: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, 11: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, 11: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, 11: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, 11: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, 11: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, 11: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, 11: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


Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
La nave elettrica più grande mai ...
Spusu lancia il Wi-Fi Calling: come funz...
Questo robot impara a muovere le labbra ...
iPhone 17 annienta la concorrenza in Cin...
La nuova Xiaomi SU7 batte un record: 4.2...
È possibile copiare i qubit: dei ...
BYD alza ulteriormente l'asticella: batt...
Il nuovo razzo spaziale riutilizzabile c...
L'ex leader di Assassin's Creed porta Ub...
Il razzo spaziale NASA SLS e la capsula ...
Samsung Galaxy S26 Ultra: quattro colora...
AWS investe 1,2 miliardi in Italia. Coin...
La navicella cinese Shenzhou-20 con il f...
I piani Business ed Education di Google ...
Ceres-2 e Lunga Marcia 3B: la Cina falli...
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: 06:13.


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