Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

[C] Funzione di calcolo della radice quadrata di un intero

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

2
voti

[21] Re: [C] Funzione di calcolo della radice quadrata di un inte

Messaggioda Foto UtenteShockwaver » 11 apr 2014, 12:58

E non solo...
La sta testando sul campo davanti ai suoi occhi, funzia alla grande, decide di condividerla con noi e tu che fai?? Gli vai a fare le pulci tirando fuori cose che tra l'altro non stanno in piedi???? ?%
Mah... ora capisco perché Foto UtenteTardoFreak non voleva più essere un moderatore di questa sezione del forum. Mi auguro solo che riesca a farsi scivolar tutto di dosso e gli ritorni la voglia di condividere codice e realizzazioni... Perché io credo non riuscirei..
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

0
voti

[22] Re: [C] Funzione di calcolo della radice quadrata di un inte

Messaggioda Foto Utenteeimiar » 11 apr 2014, 14:47

Minchia se ti sei arrabbiato!
Caro Shockwaver, io le stesse tue considerazioni le ho fatte quando ho scritto il mio post ?%
So benissimo che il mio benchmark non va bene, soprattutto sulla mia macchina che è quad core a più di 3 GHz e quant'altro, ma se permetti vorrei fare due considerazioni:

Anche se il sistema non è in real-time ed è pieno di threads e processi in esecuzione il mio benchmark non è proprio da buttare, perché è molto probabile che l'esecuzione di un programma piccolo come quello che ho scritto venga eseguito senza interruzioni di thread.
Quindi l'indicazione che si può estrarre da quel benchmark, l'unica utile, è che alcune funzioni sono veloci il doppio delle altre... Su un'architettura x86!

Poi hai totalmente ragione sul fatto che non c'è il minimo paragone tra queste due architetture perché una è MOLTO più ottimizzata dell'altra nello svolgere FLOPs.

Ma io non ho mai lavorato su microcontrollori! né ho mai detto di averlo fatto!
È per questo che sono interessato a sapere come performa la mia funzione su un microcontrollore. È sbagliato essere interessati?

Ho chiesto per cortesia se TardoFreak possa fare questo test non appena ha tempo così che io potessi capire, lo farei io stesso il test come tu mi consigli, ma ti ripeto: non possiedo un micro, tantomeno un oscilloscopio.
Avatar utente
Foto Utenteeimiar
248 5
Frequentatore
Frequentatore
 
Messaggi: 107
Iscritto il: 3 feb 2011, 16:41

1
voti

[23] Re: [C] Funzione di calcolo della radice quadrata di un inte

Messaggioda Foto UtenteShockwaver » 11 apr 2014, 15:27

Mi sono arrabbiato per via della tua insistenza nonostante tu stesso avessi detto che il tuo bench è fuori luogo e per via del fatto che l'unica risposta veramente elegante nei confronti di qualcuno che condivide del PROPRIO CODICE VALIDO è quella in [2].
E comunque hai ragione il tuo bench non è proprio da buttare, lo è proprio del tutto! Cercando di dimenticarsene il più in fretta possibile tra l'altro e dopo le 16.30 appena rimetto le mani sul computer ti faccio vedere perché senza bisogno di un benchmark.
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

3
voti

[24] Re: [C] Funzione di calcolo della radice quadrata di un inte

Messaggioda Foto UtenteShockwaver » 11 apr 2014, 17:29

Sqrts.png

Eccoci qua.
Da premettere innanzitutto che ho dovuto prendere in considerazione una MCU paragonabile a quella di Foto UtenteTardoFreak un PIC32 famiglia MX3.
A parte il fatto che a quanto sembra quell'algoritmo tanto caro agli sviluppatori di Q3A in collaborazione con quelli dell' id Tech 3 non è portabile sui microntrollori (credo abbia a che fare col "magic number" e la rappresentazione IEEE-754 ma non ho né il tempo né la voglia di controllare/approfondire), anche riadattando l'algoritmo per farlo funzionare, è evidente una differenza di 18 cicli tra un'implementazione e l'altra.
La limitazione dell'algoritmo sugli interi che può operare solo su... interi non ha alcuna influenza se chi la usa non ha bisogno di lavorare sui virgola mobile.

Over and out.
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

3
voti

[25] Re: [C] Funzione di calcolo della radice quadrata di un inte

Messaggioda Foto UtenteShockwaver » 11 apr 2014, 17:47

Uff lo so che avevo detto passo e chiudo.. ma non riesco a smettere, per favore fermatemiiiii :lol:
Dimenticavo di far notare che ovviamente i cicli di istruzione nell'algoritmo sugli interi sono direttamente proporzionali alla dimensione dell'operando (a "scaglioni"), mentre nell'altro sono (quasi) fissi, quello di prima era il worst case... Guardare per credere.
Sqrts2.png


Over and, I hope, out.
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

5
voti

[26] Re: [C] Funzione di calcolo della radice quadrata di un inte

Messaggioda Foto UtenteTardoFreak » 11 apr 2014, 18:01

E per concludere (magari a qualcuno che paciocca con gli stepper potrebbe interessare) questa è la routine per la gestione del movimento dello stepper con rampe di accelerazione e decelerazione con a=cost. dove uso la funzione oggetto della discussione.
Codice: Seleziona tutto
//-----------------------------------------------------------------------------------------------
// Spostamento di n passi con rampa di accelerazione e decelerazione
// n può essere sia positivo che negativo
void muovi(int32_t passi)
{
  int8_t direzione;
  uint32_t passiAcc, passiDec, passiCost;
  uint32_t i;
  uint32_t v;
 
  if (passi ==0) return;
 
  direzione = 1;
  if (passi < 0) { direzione = -1; passi = -passi; }
 
  // Calcola i passi di accelerazione, velocità costante e decelerazione
  if (passi > (lungRampa * 2))
  {
    passiAcc = passiDec = lungRampa;
    passiCost = passi - passiAcc - passiDec;
  }
  else
  {
    passiAcc = passi /2;
    passiDec = passi - passiAcc;
    passiCost = 0;
  }
 
  // Rampa di accelerazione
  for (i=0; i<passiAcc; i++)
  {
    // Calcola la velocità
    v = uintSqrt(2*accelerazione*i + velMin*velMin);
    // Muove il motore
    passoMotore(direzione);
    // genera ritardo
    setTimer1(10000/v);
    while(getTimer1() != 0) os_tsk_pass();
  }
   
  // Movimento a velocità costante
  for (i=1; i<(passiCost+1); i++)
  {
    passoMotore(direzione);
    // genera ritardo
    setTimer1(10000/velMax);
    while(getTimer1() != 0) os_tsk_pass();
  }
 
  // Rampa di decelerazione
  for(i=passiDec; i>0; i--)
  {
    // Calcola la velocità
    v = uintSqrt(2*accelerazione*i + velMin*velMin);
    // Muove il motore
    passoMotore(direzione);
    // genera ritardo
    setTimer1(10000/v);
    while(getTimer1() != 0) os_tsk_pass();
  }
 
  // Ritardo finale per stabilizzazione
  setTimer1(10000/velMin);
  while(getTimer1() != 0) os_tsk_pass();
}

//-----------------------------------------------------------------------------------------------
// Inizializzazione motore
static void initMotore(void)
{
  posMotore = 0;
  statoMotore = 0;
  setStatoMotore();
  // Calcola i parametri
 
  #ifdef FULL_STEP
  velMin = 50;           // step al secondo
  velMax = 800;          // step al secondo
  accelerazione = 4000;  // step al secondo quadrato
  #endif
  #ifdef HALF_STEP
  velMin = 100;           // step al secondo
  velMax = 1600;          // step al secondo
  accelerazione = 8000;   // step al secondo quadrato
  #endif
  lungRampa = (velMax*velMax - velMin*velMin) / (accelerazione * 2);
}

Le velocità sono espresse in \frac{step}{s}
L' accelerazione in \frac{step}{s^{2}}
La risoluzione del timer è 100\mu s
L' istruzione
Codice: Seleziona tutto
os_tsk_pass();

è utilizzata per rilasciare il controllo allo scheduler.


Le prove sono state fatte in questo modo:
Codice: Seleziona tutto
for(;;)
  {
    MOSPA_SX_PORT->BRR = MOSPA_SX_PIN;
    //i=sqrt(4281346624);
    i = uintSqrt(4281346624);
    //i = pow(4281346624, 0.5);
    MOSPA_SX_PORT->BSRR = MOSPA_SX_PIN;
    //i=sqrt(4281346624);
    i = uintSqrt(4281346624);
    //i = pow(4281346624, 0.5);
  }

Togliendo dai commenti e vedendo il periodo dell' onda quadra visualizzata sull' oscilloscopio (delle balle).
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,4k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15764
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

1
voti

[27] Re: [C] Funzione di calcolo della radice quadrata di un inte

Messaggioda Foto Utenteeimiar » 11 apr 2014, 19:41

Apprezzo lo sforzo, era tutto ciò che chiedevo.
Perdonatemi se non v'è piaciuto il mio atteggiamento ma non pensavo di provocare questo casino.
La mia insistenza era causata dalla mia ignoranza per non aver mai praticato con un microcontrollore, abbiate pazienza.
Spero che non ci siano rancori e ad ogni modo vi ringrazio per il tempo dedicatomi.
:-)
Avatar utente
Foto Utenteeimiar
248 5
Frequentatore
Frequentatore
 
Messaggi: 107
Iscritto il: 3 feb 2011, 16:41

7
voti

[28] Re: [C] Funzione di calcolo della radice quadrata di un inte

Messaggioda Foto UtenteTardoFreak » 11 apr 2014, 22:36

Siamo in un forum tecnico,
Quindi nessun rancore ma attenzione e pignoleria per evitare di dare informazioni imprecise e/o fuorvianti.

Per quanto riguarda i microcontrollori c'è da dire che oggi sono macchine molto diverse dai personal computers, tablet ed altri prodotti. In effetti si assomigliano, è vero, ma la somiglianza la si può ritrovare più nei linguaggi utilizzati per scrivere i programmi (per fortuna dico io, il C è un dono del Signore iOi ) che nella filosofia e nelle applicazioni che ci stanno dietro.
Il microcontrollore lo trovi dentro lo spazzolino da denti elettrico, nella gettoniera del distributore di bibite, nel riproduttore musicale MP3, nella lavatrice, negli elettrodomestici in genere, nelle centraline dei motori, nel pupazzetto che trovi dentro l' uovo di Pasqua e che ti suona la musichetta e via discorrendo.
E' una macchina a programma ma la somiglianza con un personal computer non va oltre, anche se è vero che molto probabilmente l' evoluzione tecnologica li avvicinerà sempre di più.
Per semplificare: se quando si acquista un personal computer si presta attenzione alle prestazioni, quando si sceglie un micro lo si fa prestando attenzione al prezzo. Se il PC deve funzionare bene il micro non deve costare.
Questo significa avere a che fare con limitazioni in termini di memoria di programma, potenza di calcolo e memoria dati a volte notevoli (gli 8 bit per esempio). Oppure ci si trova con oggetti potenti, discretamente dotati, poco costosi ma tremendamente complicati (come i 32 bit).
Adottare un micro o un altro è sempre il risultato di compromessi ma il fine è sempre uno solo: produrre un oggetto al minor costo possibile, che sia affidabile (o comunque che non dia problemi in produzione) e possibilmente rapidamente. Ma non c'è una regola generale: dipende sempre dall' applicazione.
Prendiamo un caso reale: quello che sto facendo ora.
Uso un micro che costa molto poco, molto potente rispetto al prezzo ma complicato ed oneroso da utilizzare (i sistemi di sviluppo non te li regalano ma li paghi bei soldi). Una sorta di motore da formula 1, complicato come un motore da gara, ma che sviluppa solo un centinaio di cavalli, venduto a meno di un motore da tosaerba.
Non so che tipo di stepper gli dovrò far comandare, se userò un driver apposta o se opterò per una soluzione a componenti discreti per abbattere i costi, non so che carico meccanico dovrà pilotare e dovrò fare parecchie messe a punto. Non ho un team di ingegneri ma sono da solo a lavorare e quindi, visto che il micro me lo permette (fino ad un certo punto) cerco di sfruttare la sua intrinseca potenza per rendermi la vita semplice.
Poi magari succederà che dovrò produrre un solo tipo di apparecchiatura ed allora rifarò il progetto con il preciso scopo di abbattere ulteriormente i costi. Probabilmente non calcolerò più niente ma mi farò le tabelle come indicato da Foto UtenteDirtyDeeds da implementare su di un carciofo lento come una mucca con l' artrite.
Magari il programma lo dovrò scrivere in assembly o in un linguaggio che non conosco, o in Java o in Sumatra o in Barbados :mrgreen: ... in "bananix" ... chi può dirlo? Prenderò quello che passa il convento. :-|

Ciò detto,

Uno degli scopi di questa sezione è di raccogliere del codice che può essere utile nello sviluppo dei programmi di questi aggeggi quindi, da come la vedo io, qualsiasi contributo sviluppato sul campo, provato e funzionante e messo a disposizione è un qualcosa che potenzialmente può rendere la vita meno complicata.
A volte non sono le soluzioni più eleganti, a volte sono delle vere e proprie manovalate che però risolvono un problema.
Ricordo di aver postato le funzioni per sintetizzare un bus I2C utilizzando dei semplici pin di I/O e facendo tutto tramite programma. A me ha risolto un problema e potrebbe essere la soluzione per un altro utente che è costretto ad utilizzare un micro che non dispone della periferica I2C. Non è il top ma funziona.

In buona sostanza l' idea di scambiarsi del codice funzionante la vedo come un modo per cooperare con il solo fine di riuscire a risparmiare un' oretta da dedicare a gli affetti o alla famiglia per esempio, un modo per non ritrovarsi sempre da soli ad affrontare un problema che altri hanno già risolto.
Per questo motivo (ed altri legati al momentaccio che sto passando) non vedo di buon' occhio il "fare le pulci" ed auspico partecipazione attiva.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,4k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15764
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

1
voti

[29] Re: [C] Funzione di calcolo della radice quadrata di un inte

Messaggioda Foto UtenteShockwaver » 11 apr 2014, 23:28

Nessun rancore.
Anyone who has never made a mistake has never tried anything new
Two things are infinite: universe and human stupidity, and I'm not sure about the former
You did not really understand something unless you can explain it to your grandmother
A. Einstein
Avatar utente
Foto UtenteShockwaver
770 1 5 11
Expert
Expert
 
Messaggi: 859
Iscritto il: 3 mar 2010, 18:56

0
voti

[30] Re: [C] Funzione di calcolo della radice quadrata di un inte

Messaggioda Foto UtenteWALTERmwp » 12 apr 2014, 0:06

Dopo aver seguito la discussione, arrivato a questo punto, al netto delle considerazioni sulle funzioni, credo che quanto riportato da Foto UtenteTardoFreak da qui ...
TardoFreak ha scritto:Per quanto riguarda i microcontrollori
a qui ...
TardoFreak ha scritto:Prenderò quello che passa il convento.
... sia un prezioso compendio d'integrazione, d'affiancare a quelli "tecnici": bello !
La sintesi di una realtà.
Per quello che segue stavo aggiungendo un altro commento ma penso "parli" da sè.
Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
22,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6443
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite