2013-06-17 8 views
11
volatile uint8_t reset_mask[768] = {0} 

Ora sto impostando i valori di questi elementi di matrice su 1 durante una delle operazioni interne.Come impostare la matrice volatile su zero utilizzando memset?

In un'altra chiamata funzionale, ho bisogno di impostare tutti gli elementi della matrice a 0. Un modo è utilizzando ciclo for ma ritengo modo migliore per assegnare tutti gli elementi della matrice è quello di utilizzare memset

memset(reset_mask, 0, sizeof(reset_mask)); 

ma sto ottenendo questo errore: - "cast dal tipo 'volatili uint8_t * {alias volatili unsigned char *}' digitare 'void *' getta via le qualificazioni"

Nel caso in cui non possiamo usare memset qui, è c'è un modo migliore per impostare tutti gli elementi di questo array volatile in un colpo solo?

+6

'std :: fill (std :: begin (reset_mask), std :: end (reset_mask), 0);' funziona. –

+0

@ R.MartinhoFernandes Questa dovrebbe essere una risposta (poiché è davvero l'unica risposta corretta). In C, ovviamente, avrebbe dovuto usare il suo loop. –

+0

Per che cosa stai usando l'array volatile? Potrebbe essere necessario disabilitare alcuni/tutti gli interrupt? –

risposta

-3

Ovviamente si dovrebbe essere in grado di utilizzare memset. Sembra un problema di tipo casting per me. Rispetto a C, C++ è piuttosto restrittivo quando vengono usati i tipi. La funzione memset prevede di ricevere un void *, ma stai fornendo uint8_t *. Prova a trasmettere è:

memset (static_cast<void *>(reset_mask), 0, size_of(reset_mask)); 

Per maggiori dettagli su fusioni verificare questo:

Regular cast vs. static_cast vs. dynamic_cast

saluti

EDIT: ho aggiunto la parentesi mancante. Non ho ancora provato questo, anche se penso che dovrebbe funzionare.

+6

L'esecuzione di un qualificatore 'volatile' produce un comportamento indefinito (non è difficile indovinare perché se si sa cosa fa 'volatile'). (e anche se fosse ben definito, 'static_cast' non può farlo, avresti bisogno di' const_cast') –

6

È possibile "utilizzare" memset inviando volatilità a const_cast, ma rimuoverà la semantica volatile. Quindi, a meno che non sia ok per te, sei bloccato con la versione loop. A meno che la tua implementazione non fornisca una versione di memset che richiede volatilità * e che è documentata per svolgere il tuo lavoro. (Penserei sistemi embedded fuori improbabili, mi sorprenderebbe anche lì.)

2

Come ha detto Balog Pal, gettato via volatile chiamare memset rompe il volatile semantica. L'intero memset può essere ottimizzato o si verifica un errore di comportamento non definito.

O scrivere il proprio ciclo per azzerare la matrice, o utilizzare questo memset_volatile:

void memset_volatile(volatile void *s, char c, size_t n) 
{ 
    volatile char *p = s; 
    while (n-- > 0) { 
     *p++ = c; 
    } 
} 

Il vero memset restituisce anche s e c è un int, ma questa versione è più pulito per me.

Non è chiaro se al compilatore sia consentito ottimizzare questa funzione per scrivere più di un byte alla volta, quindi se l'array è molto grande potrebbe essere un po 'lento.

+1

grazie per questo snippet! –