ungültige Konvertierung von volatile uint8_t* zu uint8_t*
Ich versuche eine Bibliothek in C++ für den AVR. Die Idee ist, eine einfache Möglichkeit zu konfigurieren, welche pins du nutzen, auf jedem Gerät.
Dies ist die Bibliothek:
class PINS{
public:
//ATTRIBUTES
uint8_t* DDRaddr;
uint8_t* PORTaddr;
uint8_t* PINaddr;
int pinnum;
//METHODS
void usepin(volatile uint8_t *pin, int num);};
void PINS::usepin(volatile uint8_t *pin, int num){
this->pinnum=num;
if(pin==&PORTB){
this->DDRaddr=&DDRB;
this->PINaddr=&PINB;
this->PORTaddr=&PORTB;}
if(pin==&PORTC){
this->DDRaddr=&DDRC;
this->PINaddr=&PINC;
this->PORTaddr=&PORTC;}
if(pin==&PORTD){
this->DDRaddr=&DDRD;
this->PINaddr=&PIND;
this->PORTaddr=&PORTD;}
return;}
Und das ist, was es fordert:
PINS RS;
RS.usepin(&PORTC, 0);
Nun, das ist, wie ich dachte, dass es funktionieren würde:
- Schreiben z.B. "PINS RS;" erstellen Sie eine Instanz der Klasse STIFTEN; eine neue pin mit der Bezeichnung RS.
- Schreiben "RS.usepin(PORTB,0);" konfigurieren der RS-pin auf PORTB0 der MCU.
- Mit RS.DDRaddr für die DDR, RS.PINaddr für PIN und RS.PORTaddr für PORT-register
- Mit RS.pinnum für die pin-Nummer; z.B.: RS.DDRaddr|=(1<
Wenn ich versuche, es zu bauen, im Atmel Studio habe ich die folgende Fehlermeldung für jede Zeile wie diese: "this->DDRaddr=&DDRB;" Die Fehlermeldung lautet:
Fehler 1 ungültige Konvertierung von volatile uint8_t* zu uint8_t*
Es verwendet, um zu arbeiten, bevor ich aus uint8_t* DDRaddr eine Klasse Mitglied. Ich kann nicht verstehen, was das problem ist, ich konnte nicht eine Aussage von ähnlich - aber nicht ganz das gleiche - Fragen.
Gibt es jemanden, wer könnte eine Idee haben, was ist falsch an diesem code?
- Warum kannst du nicht erklären die Mitglieder
volatile
wie gut? - Genau wie du kann nicht implizit entfernen constness, das gleiche gilt für die Volatilität.
- Nicht zu vergessen sind "Schnappschüsse" der flüchtige pins. Der Begriff
volatile
H. die Werte ändern sich mit der Mittel außerhalb der Programmsteuerung. - Durch die Art und Weise, können Sie einige text-Raum und die Eingabe mit dem Zugriff auf die Elemente direkt anstatt mit den
this->
syntax. - Ich verstehe nicht, was Ihr Ziel! Ich finde DDRn, PINn-und PORTn sehr klar. Was ist ein Beispiel für die Funktionalität Ihrer Klasse bieten? Ich denke, dass AVRs sind micros und jede Funktion wird eingeführt in eine FW verwendet Speicher, die verwendet werden könnten, zu verwalten, die Funktionalität, die wir wollen, zu entwickeln. Die Einführung von Funktionen, die die Verwendung von Sequenzen, wenn und Zweig, neben der Verschwendung von Speicher, kann zu Verzögerungen führen. AVRs sind nicht 64-bit-CPU mit 4 Gb Arbeitsspeicher!!! 🙂
- Sie können direkt über die Speicher-Abfälle Sergio, es wird sich zeigen, in progress... Alles, was ich tun sollte, ist eine elegante Möglichkeit der Einrichtung die AVR pins man verwenden für ein externes Gerät. Ich konnte einfach #define RSport PORTB, #define RSpin PINB und so weiter... Einfach Experimentieren, wenn es gibt ein einfacher Weg...
- vielen Dank für all die Hinweise. Ja das problem war die Volatilität. Ich erklärte den Mitgliedern, wie volatil es jetzt funktioniert.
- Matthews: habe ich gemacht, danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Offenbar
DDRB
ist der Typvolatile uint8_t
, aber Sie versuchen, ordnen Sie seine Adresse in einuint8_t*
. Das ist nicht erlaubt -volatile
folgt den gleichen Regeln wieconst
in dieser Hinsicht.Wenn Sie beabsichtigen, zu verwenden, die Mitgliedern wie dieses, haben Sie zu erklären, Sie als Hinweise auf
volatile
:"flüchtig" bedeutet, dass das Lesen oder schreiben eines Werts, ist ein Nebeneffekt, der nicht optimiert werden entfernt. Lesen oder schreiben einer volatile-Wert beeinflussen könnten einige hardware, kann es passieren, dass der Wert geändert werden, in unterschiedlicher Weise als Sie denken, und so weiter. Als Ergebnis, Annahmen, dass der compiler normalerweise (wenn Sie store-x auf eine variable und dann Lesen Sie es wieder, wird das Ergebnis x, und so weiter) sind falsch.
Wenn Sie weggeworfen werden, das flüchtig-seins, dann wird der compiler code generieren könnte, das falsch ist. Daher, Sie müssen diese explizit und nicht implizit.