Forum: Compiler & IDEs prog_uint8_t


von Uwe (Gast)


Lesenswert?

Hi,

kann ich sowas machen, oder handele ich mir damit Probleme ein?
1
typedef uint8_t prog_uint8_t;
2
3
4
prog_uint8_t can_filter[] =
5
{
6
  // Group 0
7
  MCP2515_FILTER(0),        // Filter 0
8
  MCP2515_FILTER(0),        // Filter 1
9
  
10
  // Group 1
11
  MCP2515_FILTER_EXTENDED(0),    // Filter 2
12
  MCP2515_FILTER_EXTENDED(0),    // Filter 3
13
  MCP2515_FILTER_EXTENDED(0),    // Filter 4
14
  MCP2515_FILTER_EXTENDED(0),    // Filter 5
15
  
16
  MCP2515_FILTER(0),        // Mask 0 (for group 0)
17
  MCP2515_FILTER_EXTENDED(0),    // Mask 1 (for group 1)
18
};

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Solange du uns nicht verrätst, was MCP2515_FILTER und 
MCP2515_FILTER_EXTENDED macht, wird dir das keiner beantworten können...

: Bearbeitet durch User
von Uwe (Gast)


Lesenswert?

Michael Reinelt schrieb:
> Solange du uns nicht verrätst, was MCP2515_FILTER und
> MCP2515_FILTER_EXTENDED macht, wird dir das keiner beantworten können...

Mir geht um prog_uint8_t, was unter Atmel Studio nicht vorhanden ist. 
Der Rest ist erstmal irrelevant.

prog_uint8_t ist doch auch ein uin8_t, oder nicht?

von Grml .. (grml)


Lesenswert?

Uwe schrieb:
> Michael Reinelt schrieb:
> Solange du uns nicht verrätst, was MCP2515_FILTER und
> MCP2515_FILTER_EXTENDED macht, wird dir das keiner beantworten können...
>
> Mir geht um prog_uint8_t, was unter Atmel Studio nicht vorhanden ist.
> Der Rest ist erstmal irrelevant.
>
> prog_uint8_t ist doch auch ein uin8_t, oder nicht?

Ja das ist ein Datentyp mit dem gleichen Wertebereich. Solltest du 
allerdings einer uint8_t Variable einen prog_uint8_t Wert zuweisen gibt 
es je nach Compilereinstellung mindestens mal ne Warnung.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Grml ... schrieb:
> Solltest du allerdings einer uint8_t Variable einen prog_uint8_t Wert
> zuweisen gibt es je nach Compilereinstellung mindestens mal ne Warnung.

Warum?

@TE: wofür brauchst du den typedef denn überhaupt?  Was mindestens
noch fehlt ist das "const" bei der Definition.

Aber sinnvoller wäre es, stattdessen dann gleich __flash zu benutzen,
wenn du sowieso einen hinreichend neuen Compiler benutzt.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Uwe schrieb:
> prog_uint8_t ist doch auch ein uin8_t, oder nicht?

Ja, aber einer der im Flash liegt:

typedef uint8_t PROGMEM prog_uint8_t;

ist allerdings schon lange deprecated:
1
The typedef is only visible if the macro __PROG_TYPES_COMPAT__
2
   has been defined before including <avr/pgmspace.h> (either by a
3
   #define directive, or by a -D compiler option.)

von Grml .. (grml)


Lesenswert?

Jörg Wunsch schrieb:
> Grml ... schrieb:
> Solltest du allerdings einer uint8_t Variable einen prog_uint8_t Wert
> zuweisen gibt es je nach Compilereinstellung mindestens mal ne Warnung.
>
> Warum?

Das hat etwas mit Typsicherheit zu tun, da der typdef nur eine Aussage 
über die Speichergröße und Wertebereich/Präzision gibt. Ein Beispiel ist 
boolean in c (auch eine Variable mit 8bit). Siehe auch Misra Rule 10.1.


Grml ... schrieb:
> ...gibt
> es je nach Compilereinstellung mindestens mal ne Warnung.

Falsch ausgedrückt. Muss heißen gibt bei entsprechender 
Compilereinstellung eine Warnung

: Bearbeitet durch User
von Uwe (Gast)


Lesenswert?

Habe es nun folgendermaßen:
1
can_static_filter(const uint8_t PROGMEM *filter_array);
2
3
prog_uint8_t can_filter[] =
4
{
5
  // Group 0
6
  MCP2515_FILTER(0),        // Filter 0
7
  MCP2515_FILTER(0),        // Filter 1
8
  
9
  // Group 1
10
  MCP2515_FILTER_EXTENDED(0),    // Filter 2
11
  MCP2515_FILTER_EXTENDED(0),    // Filter 3
12
  MCP2515_FILTER_EXTENDED(0),    // Filter 4
13
  MCP2515_FILTER_EXTENDED(0),    // Filter 5
14
  
15
  MCP2515_FILTER(0),        // Mask 0 (for group 0)
16
  MCP2515_FILTER_EXTENDED(0),    // Mask 1 (for group 1)
17
};
Die typedef habe ich nun entfernt und fühle mich sicherer :-)

http://gcc.gnu.org/onlinedocs/gcc/Named-Address-Spaces.html#AVR%20Named%20Address%20Spaces

von Dr. Sommer (Gast)


Lesenswert?

Grml ... schrieb:
> Das hat etwas mit Typsicherheit zu tun, da der typdef nur eine Aussage
> über die Speichergröße und Wertebereich/Präzision gibt.
Quatsch. Ein typedef ist einfach nur ein Typ-Alias. Deswegen ist 
folgender Code auch kein Problem und gibt keine Warnung:
1
typedef int foo;
2
3
int main () {
4
  foo x;
5
  x = 7;
6
  return 0;
7
}
Die 7 ist zwar vom Typ "int", aber x ist vom Typ "foo" - trotzdem keine 
Warnung, da "foo" und "int" das selbe ist.

Millionen Zeilen Code verlassen sich darauf dass typedef einfach nur ein 
Alias ist und man beliebig zuweisen kann...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Grml ... schrieb:
> Muss heißen gibt bei entsprechender Compilereinstellung eine Warnung

Nein, gibt es nicht, und darf es nicht geben.

prog_uint8_t war pure Augenauswischerei, und genau deshalb ist er auch
entsorgt worden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.