www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik #pragma wird ignoriert


Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute hoffe mir kann jemand Helfen

Habe folgenden code von einem anderen (also nicht AVRGCC) compiler:
#define LED_ADDRESSE          0x1181  // externes Register für Led 9


#pragma location=LED_ADDRESSE
__no_init uint8 ui8_Led_AD;                  // LED 9

wie kann ich das in AVRGCC übersetzen?

Ich kriege immer 1 warnung dass #pragma ignoriert wird

und einen Fehler

Expected '=',',',';' ... before 'uint8'

Hoffe jemand weiß bescheid.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pragma sind Kompilerdirektiven, die dürfen von jedem Kompiler nach 
belieben bewertet oder ignoriert werden (bis auf die paar 
Fließkomma-Pragmas in C99).

Bei dir bemängelt der Kompiler, dass "__no_init" nicht definiert wurde. 
Was das "location"-Pragma bewirken soll, weiß ich nicht, aber wie man 
eine Variable an eine bestimmte Stelle im RAM/SFR verankert, ist den 
libc-Headern in aller Ausführlichkeit zu entnehmen.

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in welchen Headern???
wo finde ich sie?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was du willst, ist übrigens die section .noinit.

Die Zuordnung zu den Speicherstellen macht der Linker, nicht der
Compiler, daher muss man auch diesem mitteilen, wenn man bestimmte
Dinge an bestimmten Stellen im Speicher haben will.  Der Compiler
hat darauf keinen Einfluss.

Wenn man aber ein externes Register anspricht, ist es allemal das
Einfachste, dass man das über einen entsprechenden Zeiger macht:
#define LED_ADRESSE 0x1181
#define Led_AD (*(volatile uint8_t *)0x1181)

Das spart den ganzen Zirkus mit dem Linker und ist noch dazu sogar
zwischen den Compilern praktisch portabel.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch wrote:
> Was du willst, ist übrigens die section .noinit.
Womit er immer noch keinen Schritt weiter ist. So geht das mit AVR-GCC:
uint8 ui8_Led_AD __attribute__ ((section (".noinit")));

Wobei ich mir mit "uint8" auch nicht sicher bin, zum Standard gehört das 
jedenfalls nicht, da heißt das "uint8_t", also mit _t hinten dran.

> Die Zuordnung zu den Speicherstellen macht der Linker, nicht der
> Compiler, daher muss man auch diesem mitteilen, wenn man bestimmte
> Dinge an bestimmten Stellen im Speicher haben will.  Der Compiler
> hat darauf keinen Einfluss.
Der Linker bindet den Kram zusammen und verteilt automatisch Code auf 
Code-(Text-)Segmente und Daten auf Datensegmente, jo. An welchen 
(numerischen) Adressen der Programmierer in seinem Code aber rumwerkelt, 
ist dem Linker ziemlich wurscht, weil der nur Speicherstellen nur dann 
zuordnen kann, wenn er sie auch kennt, sie also Namen haben.

> Wenn man aber ein externes Register anspricht, ist es allemal das
> Einfachste, dass man das über einen entsprechenden Zeiger macht:
>
> #define LED_ADRESSE 0x1181
> #define Led_AD (*(volatile uint8_t *)0x1181)
> 

Macht die libc auch so:
/* Aus avr/sfr_defs.h */

/* Je nach Controller: */
#define __SFR_OFFSET 0x20
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
#define PORTB  _SFR_IO8(0x18)

> Das spart den ganzen Zirkus mit dem Linker und ist noch dazu sogar
> zwischen den Compilern praktisch portabel.
Wie gesagt, wenn du numerische Adressen angibst, geht das den Linker 
garnichts an.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.