|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#41 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Se e' una funzione di lettura e basta, giusto prima di chiamarla potresti fare una new di 1024 byte, passare alla funzione il nuovo puntatore e accodare il risultato ripempito nella coda condivisa.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#42 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
è una funzione di libreria scritta dal produttore dell'apparato e al massimo posso giocare sul buffer. In pagina 2 ho allegato il simulatore |
|
|
|
|
|
|
#43 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
E comunque giocare sul buffer, l'unica cosa che puoi fare, e' proprio quello che proponevo di fare. PRIMA di chiamare la funzione di lettura (che non e' ovviamente presente nel simulatore), allochi 1024 bytes e passi il nuovo puntatore alla funzione. Ottenuto il risultato accodi il tutto in una coda condivisa che ovviamente nel simulatore non c'e'. E il consumatore leggera' dalla coda condivisa quando piu' gli fa comodo.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 01-08-2011 alle 16:32. |
|
|
|
|
|
|
#44 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
marco.r,
quasi quasi se implemento solo due thread mi semplifico la vita. //TH1 - riempio buffer da ethernet - ciclo buffer se cambiato qualcosa creo evento e risveglio TH2 //TH2 - vislualizza e memorizza su disco |
|
|
|
|
|
#45 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
|
|
|
|
|
|
#46 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
Il mio problema è determinare il cambiamento di stato e il tempo di permamenza in tale stato |
|
|
|
|
|
|
#47 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Sapendo che i valori/bit del dispositivo sono N, io teoricamente farei così: a) polling continuo con il thread Lettore: - ha un buffer di N elementi; - prima lettura in avvio: copia lo stato del dispositivo nel buffer; - ciclo infinito, ad ogni iterazione: - se i valori che legge nel dispositivo sono diversi da quelli presenti nel buffer - copia i valori del dispositivo nel buffer (per futuri confronti) - fa una copia del buffer Copia; - crea un Elemento con Copia e un timestamp (per consumo da parte del thread Scrittore); - acquisisce mutex di Coda; - infila Elemento nella Coda; - rilascia mutex di Coda; - sleep brevissima b) una struttura che faccia da Coda, condivisa con una mutex c) thread Scrittore (con parametro X tarabile: numero di elementi da estrarre dalla Coda ad ogni iterazione) - ciclo infinito, ad ogni iterazione: - acquisisce mutex di Coda; - rimuovi al più X Elementi da Coda; - rilascia mutex di Coda; - scrivi al più X Elementi su file; - sleep moderata @EDIT: Invece di "salvare" tutto il buffer, se si salva in avvio lo stato iniziale del dispositivo (snapshot) poi si possono salvare solo le differenze (i delta). Magari ogni tanto (se neccessario o si ritiene sia conveniente) si può fare un nuovo snapshot per poi continuare con i soli delta.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 01-08-2011 alle 17:44. |
|
|
|
|
|
|
#48 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
Inizialmente avevo tre thread con un semaforo comune tra produttore e consumatore ed un evento tra consumatore e scrittore. Poi mi sono detto se ne valeva la pena mantenere un semaforo in quanto: se produttore sta riempiendo consumatore non può accedervi e allora tanto vale eliminare consumatore e mettere in sequenza i due //produttore -------- riempe array -------- cicla array e se trova bit a uno crea evento //scrittore ----- attesa_evento ----- scrive tempi su disco ----- resetta evento ma non so se ho fato bene ad eliminare consumatore, di primo acchito direi di si. Sta di fatto che continuo a notare differenze di al max 20 millisecondi: forse significa che windows in determinate condizioni può essere usato a scopo real time? |
|
|
|
|
|
|
#49 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Che io sappia no, non ci si può appoggiare a Windows assumendo di avere a che fare con un sistema real time, perchè non lo è.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#50 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
un link che non è chiarissimo se intendano che windows 2000/xp possono diventare RT http://www.codeguru.com/cpp/w-p/syst...cle.php/c14457 Ultima modifica di misterx : 01-08-2011 alle 18:14. |
|
|
|
|
|
|
#51 | |
|
Moderatore
Iscritto dal: Nov 2006
Messaggi: 21893
|
Quote:
in alternativa se il programma è semplice puoi pensare di portare l'acquisizione su un micro, salvare i dati su flash e postelaborarli offline
__________________
"WS" (p280,cx750m,4790k+212evo,z97pro,4x8GB ddr3 1600c11,GTX760-DC2OC,MZ-7TE500, WD20EFRX) Desktop (three hundred,650gq,3800x+nh-u14s ,x570 arous elite,2x16GB ddr4 3200c16, rx5600xt pulse P5 1TB)+NB: Lenovo p53 i7-9750H,64GB DDR4,2x1TB SSD, T1000 |
|
|
|
|
|
|
#52 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
Ti risulta windows CE oppure Linux o anche Windows XP Embedded? p.s guardacaso qua dice di no http://it.wikipedia.org/wiki/Sistema...tivo_real-time Ultima modifica di misterx : 01-08-2011 alle 19:33. |
|
|
|
|
|
|
#53 |
|
Senior Member
Iscritto dal: Jul 2011
Messaggi: 381
|
Un sistema operativo real-time ti può garantire con altissima probabilità (nulla è 100%) che lo scheduling dei processi avverrà nella deadline previste.
Il fatto che il tuo codice funzioni ora sulla tua macchina windows xp non garantisce affatto che funzioni su un 8-core con windows xp. Non ti garantisce nemmeno che funzioni sulla tua macchina domani.
__________________
Concluso positivamente con: Kamzata, Ducati82, Arus, TheLastRemnant, ghost driver, alexbull1, DanieleRC5, XatiX |
|
|
|
|
|
#54 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
dopo tutto quello che ho letto ed ho provato sulla mia pellaccia sono convinto! Meno male che il bit relativo al dispositivo più "veloce", si fa per dire, cambia in circa 1,5 secondi. Ciò vuol dire che dovrei riuscire anche con XP a determinare abbastanza frequentemente e con buona precisione tale tempo. Ho provato anche con bit che cambiano ogni 188 ms come esperimento e tali 188 ms che sono stati rilevati prima strumentalmente, grande mistero per me, leggo la maggior parte delle volte proprio 188 ms con un errore di (+/- 16 ms) solo a volte. E' un fatto che non riuscirò mai a spiegarmi boh. |
|
|
|
|
|
|
#55 |
|
Senior Member
Iscritto dal: Jul 2011
Messaggi: 381
|
Un modo per evitare di fare tutta la storia delle temporizzazioni è quello di modificare il dispositivo in modo tale da effettuare un handshake con il thread nel momento in cui è pronto un nuovo dato.
__________________
Concluso positivamente con: Kamzata, Ducati82, Arus, TheLastRemnant, ghost driver, alexbull1, DanieleRC5, XatiX |
|
|
|
|
|
#56 | |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
Quote:
Un metodo forse ci sarebbe ma non so se risolverebbe il problema. Mi pare che nel momento in cui viene fatto un refresh dei dati viene alzato un particolare bit. |
|
|
|
|
|
|
#57 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
dopo 3100 misurazioni ho ottenuto i seguenti risultati
Codice:
A B C D medie 401 199 600 797 max 422 204 610 797 min 390 187 593 719 |
|
|
|
|
|
#58 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
ho scoperto solo ora di avere un grosso problema nella mia implementazione: quando TH2 setta l'evento, TH3 non risponde in maniera così decisiva e quindi si perde dati per strada in quanto nel tempo in cui TH3 stra per rispondere TH2 ha già modificato li buffer, che soluzioni ci potrebbero essere?
Codice:
chari miobuf[80];
byte buf[1024];
//TH1
while(1)
{
WaitForSingleObject(hMutex,INFINITE);
RiempiArray(buf);
ReleaseMutex(hMutex);
Sleep(250);
}
Codice:
//TH2
while(1)
{
WaitForSingleObject(hMutex,INFINITE);
for(int i=0; i<1024; i++)
{
if(bit cambia stato)
calcola_tempo();
sprintf(miobuf,"%d.%d",a,b);
SetEvent ( hEvent2 );
}
ReleaseMutex(hMutex);
Sleep(50);
}
Codice:
//TH3
while(1)
{
WaitForSingleObject(hEvent2 ,INFINITE);
fprintf(fp,"X%s\n",miobuf);;
ResetEvent( hEvent2 );
}
Ultima modifica di misterx : 02-08-2011 alle 17:35. |
|
|
|
|
|
#59 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
|
|
|
|
|
|
|
#60 |
|
Senior Member
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3736
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:47.




















