Show Posts
Pages: 1 [2] 3 4 ... 195
16  International / Software / Re: Array di oggetti che devono essere eliminati dopo tot tempo on: June 11, 2014, 08:31:39 am
Cercavo di capire il problema dell'allocazione della memoria e mi ha colpito il risultato, pensa che ho risparmiato anche un byte rispetto ad usare int OutIndex;

PS: nota che il test è eseguito su ATmega328

Ciao.



17  International / Generale / Re: compliazione programma, 3 pulsanti indipendenti che funzionano allo stesso tempo on: June 11, 2014, 08:27:12 am
Non vai molto lontano senza le basi del C++.

I nomi di funzione, variabili ecc, per il compilatore sono simboli che deve risolvere in indirizzi di memoria, se dai lo stesso nome a due funzioni, il compilatore non è in grado di risolvere i simboli in indirizzi.

Il C++ permette il "sovraccarico" (il C no), questo ci permette di chiamare le funzioni tutte con lo stesso nome, solo se il numero (quantità) di argomenti è diverso, o in alcuni casi il tipo di argomento deve essere diverso.

In sostanza conoscendo le regole del C++ si possono creare 1,2,3,4 ecc funzioni con lo stesso nome, ma si deve sapere come fare per evitare ambiguità.

void loop() e setup() sono funzioni tipiche di Arduino,  la funzione setup() viene eseguita solo una vola dopo il reset, poi si passa alla funzione loop(). La funzione loop cicla sempre come se fosse while (true) { // codice in loop }

Ciao.
18  International / Software / Re: Array di oggetti che devono essere eliminati dopo tot tempo on: June 11, 2014, 08:13:17 am

Code:
#define LED_ONBOARD 13

void abort()
{
  while (true) {
    delay(150);
    digitalWrite(LED_ONBOARD, HIGH);
    delay(150);
    digitalWrite(LED_ONBOARD, LOW);
  }
}


struct OutObj {
    byte OutIndex; // activated output
    unsigned long OutTimeout; // max millis of execution
};



void setup() {
  delay(1000);
  Serial.begin(9600);
  pinMode(LED_ONBOARD, OUTPUT);
  
  // put your setup code here, to run once:

    byte instanceCounter = 0;
    while (1) {
      OutObj *outObj = new OutObj;

      if (!outObj) {
        Serial.print(instanceCounter);
        Serial.println(" instance create with success");
        Serial.println("error: memory is full");
        abort(); 


      }
      instanceCounter++;
    }
}

/*  *** Test Result on Arduino 2009 ***
  
  237 instance create with success
  error: memory is full
  
  sizeof(struct OutObj) : 5 byte
  237 * 5 = 1185 byte on heap
  2048 - 1185 = 863 byte Arduino memory 
  
*/

void loop() {
  // put your main code here, to run repeatedly:

}

Ma è mai possibile che circa 863 byte sono impegnati da arduino, per lo stack ecc (che spreco).

Ciao.
19  International / Software / Re: Array di oggetti che devono essere eliminati dopo tot tempo on: June 11, 2014, 05:11:14 am
Ok, ora che ho il codice capisco.

Il codice yun_centipede_webserver_linkedList.ino gira sotto linux o sull'atmega?

Quote
Non posso utilizzare un'array fisso perchè vorrebbe dire ciclarsi sempre tutti e 100(?) gli elementi dell'array, e dato che ogni elemento ha una durata di "vita" diversa dagli altri, dovrei poterlo togliere dall'array dinamicamente.
Non è proprio corretto, si possono usare gli array ma si deve trovare il modo di gestirli in modo apparentemente dinamico. Supponiamo che ci fosse il modo di eliminare un elemento considerandolo vecchio e sovrascrivibile, es il ring buffer della seriale non è dinamico eppure se contiene dati vengono inviati in uscita e quelli che rimangono nel ring buffer vengono considerato sovrascrivibili.

Code:
for(int i = 0; i < myLinkedList.size(); i++)
    {
         // Get objects from list
OutObj *outObj = myLinkedList.get(i);
// If object is in timeout switch off output
if( outObj->OutTimeout <= millis() ) {
                  CS.digitalWrite(outObj->OutIndex, LOW); //  per prima cosa agisco
                  myLinkedList.remove(i);                              // rimuovo l'elemento   
                  Console.print(outObj->OutIndex);             
                  Console.println(": LOW");
                  Console.println(myLinkedList.size());
                  delete outObj;                                             // **Nota** altrimenti memory leack
}

Quando usi l'allocazione dinamica (con new o malloc ecc) ad una allocazione deve seguire un deallocazione per rendere disponibile la memoria prima riservata.

Ok, prova il codice, ci sono buone probabilità che funzioni, ma occasionalmente dopo molte operazioni di allocazione deallocazione (anche a causa dell'uso di String) new non sarà in grado di restituire un puntare valido.

Code:
OutObj *outObj = new OutObj();
if (!outObj) {
    Console.print("ops.. memory full);
    while (1) {
           // blink error led
    }
}
     

Ciao.
20  International / Generale / Re: poweroff on: June 11, 2014, 03:35:54 am
Quote
AIUTATEMI, VI PREGO!!

Non ne capisco nulla di yun, però posso consigliarti di evitare di farti prendere dal panico, principalmente perché non aiuta (anzi).

Ciao.
21  International / Software / Re: Array di oggetti che devono essere eliminati dopo tot tempo on: June 11, 2014, 03:32:05 am
Non mi è chiara la funzionalità che vuoi implementare. Per adesso io ho intuito che da connessione HTTP vuoi fornire dei dati e registrarli in un contenitore per poi processarli. I dati saranno interpretati e visti come un soft timer attaccato ad una azione, ci sarà una azione di ingresso diversa per ogni timer ecc, ma sono solo cose che ho intuito di cui non ho certezza.

Se potessi scrivere uno state case lo userei per scrivere codice di test, se ti va, io ti faccio le domande e tu rispondi e lo state case provo a scriverlo io, senza impegno.

Si parte semplificando:
Rimuovi tutto ciò che è dinamico e scrivi un codice di test che elabora 3 elementi timer a cui ad ogni timer c'è connessa una o più azioni. Minimizza le possibilità di insuccesso, rendi il codice funzionante staticamente e annota delle osservazioni.

State START: {
       che deve fare il codice?
       1) Attende dati da HTTP.  (1) Salta la fase dinamica, crea staticamente i dati in un contenitore
       2) Problema: come colleziono i dati? Cerca soluzione migliore es struct o  class. (ring buffer, linked list ecc)
            Scrivi e testa una sola struct (o class) timer.
}

Punto 2:
Serve una struttura dati, delle funzioni, per implementare delle azioni temporizzate basate su millis()
Descrivi nel dettaglio tutti i dati i tipo ecc, fino a creare un timer.

Sono cosciente che non sai come affrontare la cosa, e che ti sembrerà di non arrivare mai alla soluzione.

In un mio programma uso queste funzioni e macro, per temporizzare le azioni:
Code:
/* crea una variabile static (static_timer) per ospitare il valore di millis, se questa vale 0 (zero)
     inizializza il timer con il valore di restituito da millis()
*/
#define new_timer(static_timer)\
    static uint32_t static_timer = 0;\
    if(!static_timer) static_timer = millis();

/*
    Restituisce true se il tempo è scaduto, viceversa false
*/
bool timer_has_expired(uint32_t *const static_timer, const uint32_t time);

bool timer_has_expired(uint32_t *const static_timer, const uint32_t time)
{
    if ( (millis() - *static_timer) >= time) {
        *static_timer = 0;    // azzera il timer, così il timer viene reinizializzato
        return TRUE;
    }
    return FALSE;

}

void loop()
{
    new_timer(myTimer);
    if (timer_has_expired(&myTimer, 100) {
          // ... your code         
    }
   
    new_timer(myTimerA);
    if (timer_has_expired(&myTimerA, 250) {
         // ... your code
    } 
}

Ciao.

22  International / Generale / Re: compliazione programma, 3 pulsanti indipendenti che funzionano allo stesso tempo on: June 10, 2014, 06:09:03 pm
Una sola funzione loop() e una sola funzione setup() sono permesse, cambia nome o se proprio vuoi usare lo stesso nome (sconsigliato) fa in modo che abbiano un numero di parametri differente, altrimenti il compilatore C++ non è in grado di capire la differenza tra loop(int a) e loop(byte b).

Se devi ripetere n volte una porzione di codice usa l'istruzione for, oppure sfrutta la funzione loop() principale che al termine riparte e così per sempre.

Ti prego non dirmi che quel codice l'ho ha realmente scritto un professore.
PS: si capisce che è scritto da un principiante.

Ciao.
23  International / Software / Re: programmazione timer arduino mega on: June 10, 2014, 12:13:39 pm
Quote
Ottima cosa che sia fatta, prodotta, e venduta in Italia pero a che prezzo, come fanno i Cinesi !...e anche vero che in Cina non ci sono le stesse tasse, e le stesse lobi politiche e bancarie smiley-zipper.
<" Solo poche schede sono fatte al di fuori del nostro Paese, ma lo riportano chiaramente sul dorso.">, appunto made in china CE !  smiley-small

 smiley-eek

Ma di cosa parliamo, di bigiotteria Cinese o di prodotti di aziende conosciute che hanno delocalizzato ?
No perché c'è una bella differenza di qualità, oltre agli obbiettivi di commercio che sono profondamente
differenti. Se non ci fosse differenza allora Grana Padano se producesse in Cina e il formaggio copia Cinese sarebbero equiparabili come qualità. In sostanza anche se hai una board Arduino Made in China puoi star certo che è di buona fattura, con micro originale e componentistica di qualità industriale, mentre il clone venduto a 9 € a loro costa uno sputo ed è con questo che si tiene in piedi. smiley-wink

Poi è evidente che ci sono le eccezioni e c'è anche chi si sente fortunato e compra il prodotto cinese a 2€.

Ciao.
24  International / Software / Re: Array di oggetti che devono essere eliminati dopo tot tempo on: June 10, 2014, 12:00:17 pm
Quote
Mi sa che sei andato troppo sul tecnico  smiley-yell

Ok, pensa che mi sono limitato fortemente e il motivo è che l'argomento non è banale.
Il problema inoltre non è solo funzionale, ma anche informatico, nel senso che la funzionalità e la logica di ciò che vuoi ottenere rappresenta la parte funzionale, mentre il problema informatico è scrivere la parte funzionale in modo che non possa rompersi sul più bello, aggirando al contempo le limitazioni dell'hardware.

La libreria LinkedList di cui sopra io non la conosco nel dettaglio, gli ho dato una occhiata veloce ed è più o meno il massimo che si possa ottenere in C++, dove la allocazione/deallocazione continua alla lunga può portare al malfunzionamento.

Oltre alla lista lincata di cui sopra ti serve un contenitore di dati con dentro:
Quote
int OutIndex  // indice che indica qual'è l'uscita coinvolta
unsigned long OutTimeOn // millis() di quando è stata eseguito l'ON dell'uscita
int Timeout //  tempo in millisecondi che mi indica dopo quanto impostare ad OFF l'uscita
bool OutState // true se ON, false se OFF

Un esempio di contenitore dati è la struct (o class)
Code:
struct SoftTimer {
    int OutIndex;
    unsigned long OutTimeOn;
    int Timeout;
    // ecc
};

La linked list la si crea con qualcosa di simile a:
LinkedList<SoftTimer> myLinkedList = LinkedList<SoftTimer>();
e si usano i metodi
add, remove ecc.

Tuttavia non avendo studiato nel dettaglio la libreria in questione ne conoscendo nel dettaglio il problema
non mi sento di suggerirti altro.

PS: La libreria in questione usa i template C++.

Ciao.

25  International / Software / Re: Array di oggetti che devono essere eliminati dopo tot tempo on: June 10, 2014, 08:38:52 am
Quote
Magari c'è un modo di controllare quanta memoria sta per alloccare per evitare di crashare? sulla libreria parlano di alloccare anche 2000 elementi senza problemi, a me ne bastano al massimo 100 smiley-grin

Rileggi e ragionaci su ancora un poco. Il problema non sta nel numero degli oggetti, ma nel fatto che si alloca dinamicamente la memoria, su un PC c'è la memoria virtuale, c'è il compattamento della ram ecc, che evitano l'esaurimento della memoria. La memoria potrebbe non essere tutta occupata, ma ci potrebbero essere 100 locazioni (100 byte) non contigue, per cui malloc non trovando una spazio di memoria contigua di 100byte restituirebbe 0 e non allocherebbe alcuno spazio.

Gli oggetti di tipo struct (o class) (es typeA) li puoi dichiarare staticamente, in questo modo non usi lo heap (quindi niente malloc o new), mentre la linked list potresti decidere di farla dinamica.

Ogni elemento della lista lincata sarà una struct contenente due campi puntatore. Uno a tipo typeA e uno a se stesso. Allocare dinamicamente un elemento grande soltanto 32 bit migliora la situazione, in quanto la ram non serve che sia contigua e quindi ci sono molte più probabilità che in ram si trovi 32 bit liberi contigui che 60-80-100byte contigui (es un array in heap deve essere contiguo, altrimenti non può crescere o diminuire di dimensioni).

Cerca scheduler con google, leggi un po (magari su wikipedia) e dimmi se quello che serve a te è simile allo scheduler.

Ciao.
26  International / Software / Re: Array di oggetti che devono essere eliminati dopo tot tempo on: June 10, 2014, 06:43:57 am
Quote
Se devo per forza avere un'array fisso, in teoria con una coda di 100 richieste dovrei averne abbastanza, ma vorrei evitare che ad ogni loop vengano ciclati 100 elementi perchè questo mi sballerebbe tutti i tempi.

Vedo la cosa fattibile solo se cicla su tutti gli elementi dell'array, non vedo altra soluzione con arduino.
La cosa sarebbe fattibile con le liste collegate (linked list) che nel modo classico alloca memoria sullo heap e la dealloca per rimuovere l'oggetto dalla lista, però con arduino c'è il rischio di ritrovarsi senza memoria ram allocabile.

Il problema potrebbe verificarsi quando per il nuovo oggetto allochiamo dinamicamente (a run-time) la memoria, malloc (o altro allocatore) potrebbe non essere in grado di trovare uno spazio di memoria head sufficientemente grande per contenere l'oggetto.

Se allocassi/deallocassi dinamicamente oggetti di un solo tipo (con dimensione fissa) tutto funzionerebbe, ma se oltre a questi oggetti ne usi altri come ad esempio String primo o poi il programma va in crash.

Una soluzione sicuramente c'è, ma vanno valutate attentamente tutti i risvolti e prese le precauzioni necessarie per evitare che il codice smetta di funzionare dopo X tempo (a causa della continua allocazione/deallocazione).
Al momento non posso prendermi tempo per trovare una possibile soluzione, tu intanto continua a ragionarci su, magari trovi un modo diverso di svolgere il compito.

Ciao.
27  International / Software / Re: AVR-CoreLib on: June 08, 2014, 05:43:23 am
Quote
yes, l'interesse per la CoreLib e' semplicemente per risparmiare tempo, se qualcuno ha gia' convertito millis in c perche' reinventare la ruota ?  smiley-wink

Per millis o simile c'è time.h di quel repo, che però va configurato per renderlo flessibile, da quello che ho capito al volo, può ricevere gli impulsi da clock esterno (RTCC) o da timer hardware interno al micro. Ricordo di aver visto la variabile __system_time (o simile).

Comunque a parte time.h la millis si può creare facilmente, se specificamente legata all'applicazione è ancora più semplice, se ti interessa pezzi di codice li posso postare poi però li devi adattare tu. Tra l'altro @leo72 ha già scritto la swRTC da cui puoi prendere la ISR per il tick per poi aggiungere la millis e te la fai tu la libreria.

Quote
AtmelStudio e' semplicemente una veste diversa di Microsoft VisualStudio (infatti se vuoi puoi usare anche direttamente VisualStudio), e qui si spiega la difficolta' di un prodotto multipiattaforma.
Vero mi sono confuso. Il port di VisualStudio è qualcosa che non ci sarà mai, l'unica cosa che mi manca di windows sono proprio gli ambienti di sviluppo che sono molto semplici, potenti e flessibili, come dire quando vogliono le cose buone le sanno pure fare.

Quote
Non si deve scaricare a parte, e' integrato (almeno nella versione mia attuale la 6.2Beta).
Inoltre ho scoperto che c'è il repo git, l'ho scoperto cercando "atmel asf git" http://spaces.atmel.com/gf/project/asf/scmgit/?p=asf;a=tree e dovrebbe bastare dare da terminale bash:
Code:
git clone https://anonymous@spaces.atmel.com/git/asf
Ancora non ho clonato ma lo farò.

Quote
Tu usi spesso il debugger ? Che modello hai ?
No purtroppo per ATmega niente debug hardware, penso che in qualche occasione sarebbe utile, ma non indispensabile almeno per l'uso classico di debug perché gli ATmega sono abbastanza semplici, mentre per ottimizzare i cicli il debbugger hardware sarebbe l'ideale. Per ARM il debugger hardware è di primaria importanza
perché internamente sono abbastanza complessi, anche il cortex-0 che dovrebbe essere quello più semplice.

Ciao.
28  International / Software / Re: Progetto Pulsante quick-run on: June 07, 2014, 06:19:52 pm
Code:
if (state > 0) {

Non dovrebbe diventare:
Code:
if (state == "1") {

Perché nel modo precedente basta inviare in seriale qualunque carattere che ha un ascii superiore a 0 (zero).

Code:
arduino.read();
Il metodo read dovrebbe restituire un carattere, boo io di processing o java non ci capisco nulla.

Ciao.
29  International / Software / Re: AVR-CoreLib on: June 07, 2014, 06:12:27 pm
Io se potessi AtmelStudio lo proverei anche, ma mi manca windows. Sono curioso circa AtmelStudio, in particolare la gestione di progetti modulari abbastanza complessi, composti da sotto progetti che possono essere librerie specifiche per l'applicazione embedded, applicazioni di test, insomma una struttura di progetto articolata come quelle che uso io, dove nell'ide ci sono più progetti aperti di cui alcuni sono applicazioni per PC che usano una o più librerie di sistema o toolkit. Mi chiedo se genera dei makefile o li devo scrivere a manina (che palle). Come includo le librerie nell'applicazione? Posso creare e gestire repositor git da dentro AtmelStudio?

Di buono c'è sicuramente il debugger, per il resto non so se mi ci ritroverei a lavorare, poi penso che la base di AtmelStudio è eclipse e mi passa la curiosità. smiley-razz

Quote
E allora non vedo il problema di replicarti in C le funzioni di Arduino che ti interessano  smiley-wink, di avr-corelib non mi pare ci sia nulla di usabile al momento

Esattamente, non c'è nulla di più che time, sempre che passi all'interno di corelib, io penso che di time alcune cose dovrebbero rimanere in avr-libc e altre passare in corelib. Staremo a vedere.

@Testato
Perché intanto non ti scarichi asf e inizi a prenderci confidenza e inoltre ci sbirci dentro, visto che ci sono cose interessanti. Uno degli obbiettivi ambiziosi è unificare le api e fino ora sembra ci siano riusciti, certo ARM ha
dei gpio particolari, e anche il resto è molto differente da un atmega, ma sapere che port_t è un tipo di dato presente in tutte le architetture è rassicurante e dovrebbe permetterti di passare da una architettura all'altra
minimizzando la confusione mentale. Per ATmega purtroppo ci sono pochi driver, la seriale c'è, lo stack usb ??
twi mi pare di si, comunque io sono indietro di versione, l'ultima volta che ho provato a scaricare si è corrotto il pacchetto e poi mi scoccia che devo scaricare tutto, se ci fosse un repo git rimarrei sicuramente aggiornato.

Ciao.
30  International / Software / Re: AVR-CoreLib on: June 07, 2014, 03:20:23 pm
Esiste e non esiste, come tutti i progetti c'è un'inizio, in cui n programmatori dicono la loro, buttano giù del codice di test, altri osservano è fanno considerazioni, sollevano obbiezioni, apportano modifiche ecc, fino ad arrivare ad avere coscienza di come deve essere strutturato il progetto.

Dai post sembra ci sia la volontà di creare una libreria separata per ogni micro.
Una parte di avr-corelib dovrebbe essere proprio time.h e tutti il resto che ho descritto, che è visibile nel repo che ho linkato. Per il momento non si è scelto di gestire un repositor separato dalla avr-libc e penso per il fatto che al momento non c'è nulla di stabilito con precisione, sicuramente non sono stati assegnati compiti.

La cosa è da seguire altrimenti se non c'è interesse le cose vanno a rilento, capite che gli sviluppatori hanno bisogno di consenso, contributo, critiche ecc. Ho letto velocemente alcune discussioni e mi sembra che il primo obbiettivo sia un driver ISP.

@leo72
Tu se non ricordo male hai qualche nozione di astronomia, vedi se capisci i commenti e il codice nel repositor https://github.com/vancegroup-mirrors/avr-libc/tree/master/avr-libc/libc/time     
Io vedo che c'è il calendario iso, cioè quello che come primo giorno della settimana ha il lunedi, poi ci sono cose che in 10 minuti non riesco a seguire.

Ciao.
Pages: 1 [2] 3 4 ... 195