prog_uint8_t

Gast #3982609
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
};
#3982717
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.
Moderator Persönliche Seite #3982728
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.
(Firma: Brainit GmbH) #3982739
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.)
#3982760
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
Gast #3982775
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
Gast #3982786
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren