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:
1 | 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:
>
1 | > #define LED_ADRESSE 0x1181
|
2 | > #define Led_AD (*(volatile uint8_t *)0x1181)
|
3 | >
|
Macht die libc auch so:
1 | /* Aus avr/sfr_defs.h */
|
2 |
|
3 | /* Je nach Controller: */
|
4 | #define __SFR_OFFSET 0x20
|
5 | #define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
|
6 | #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.