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

Jetzt setze ich die Werte dieser Array-Elemente während einer der internen Operationen auf 1.Wie setze ich flüchtiges Array mit Memset auf Null?

In einem anderen Funktionsaufruf, ich brauche auf 0. Eine Möglichkeit, alle Elemente dieses Arrays zu setzen, ist von for-Schleife, aber ich glaube bessere Weise alle Elemente des Arrays zuordnen, indem Memset

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

aber ich diesen Fehler: -

Falls "von Typ umwandeln 'volatile uint8_t * {aka volatile unsigned char *}' 'void *' Qualifier wirft weg zu geben" memset wir können hier nicht verwendet werden, ist Gibt es eine bessere Möglichkeit, alle Elemente dieses flüchtigen Arrays auf einmal zu setzen?

+6

'std :: füllen (std :: begin (reset_mask), std :: end (reset_mask), 0);' funktioniert. –

+0

@ R.MartinhoFernandes Das sollte eine Antwort sein (da es wirklich die einzig richtige Antwort ist). In C müsste er natürlich seine eigene Schleife benutzen. –

+0

Wofür verwenden Sie das flüchtige Array? Möglicherweise müssen Sie einige/alle Interrupts deaktivieren? –

Antwort

-3

Natürlich sollten Sie in der Lage sein, memset zu verwenden. Es scheint ein Problem von Typ Casting für mich. Im Vergleich zu C ist C++ ziemlich restriktiv, wenn Typen verwendet werden. Die Funktion memset erwartet ein void *, aber Sie liefern uint8_t *. Probieren Sie es aus Gießen:

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

Für weitere Informationen über Gußteile dies zu überprüfen:

Regular cast vs. static_cast vs. dynamic_cast

Grüße

EDIT: Ich habe fehlende Klammern hinzugefügt. Ich habe das trotzdem nicht getestet, obwohl ich denke, dass es funktionieren sollte.

+6

Das Wegwerfen eines "flüchtigen" Qualifiers führt zu undefiniertem Verhalten (es ist nicht schwer zu erraten, warum, wenn Sie wissen, was "volatile" tut). (Und selbst wenn es gut definiert wäre, 'static_cast' kann es nicht; Sie würden' const_cast' benötigen) –

6

Sie können memsetconst_cast mit Volatilität wegwerfen, aber es wird die volatile Semantik entfernen. Also, wenn das für dich nicht in Ordnung ist, bist du mit der Loop-Version festgefahren. Es sei denn, Ihre Implementierung gibt Ihnen eine Version von memset, die volatile * akzeptiert und für Ihre Arbeit dokumentiert ist. (Ich würde denken unwahrscheinlich außerhalb eingebettete Systeme, mich überraschen würde auch dort.)

2

Als Balog Pal sagte, Gießen volatile weg memset bricht die volatile Semantik zu nennen. Die ganze memset kann weg optimiert werden, oder undefiniertes Verhalten Schlechte passiert.

Entweder Ihre eigene Schleife schreiben das Array auf Null aus, oder verwenden Sie diese memset_volatile:

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

Die wirkliche memset kehrt auch s und c ein int ist, aber diese Version ist mir sauberer.

Es ist ziemlich unklar, ob der Compiler diese Funktion optimieren kann, um mehr als ein Byte gleichzeitig zu schreiben. Wenn das Array also sehr groß ist, könnte es etwas langsam sein.

+1

danke für dieses Snippet! –

Verwandte Themen