Gerald schrieb:
> ich habe hier die Prozessoren Atmega2560 und Atmega2561 die mit meinen
> Assemblerroutinen nicht laufen wollen, da sie einen
> 3-Byte-Programmcounter haben.
>
> Wie kann ich für eine automatisierte Lösung in meinen Bibliotheken eine
> Abfrage einbauen, die erkennt ob ein 3-Byte-PC Verwendung findet?
Zunächst mal die Doku lesen, hier für die aktuelle Compilerversion:
3.17.3.3 AVR Built-in Macros
http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/AVR-Options.html
Wird ein Assembler-Modul übersetzt, dann gibt man ihm die Endung .sx
oder .S oder Assembliert per -x assembler-with-cpp so daß der
C-Präprozessor über die Assembler-Quelle läuft.
Da du nach 3-Byte PC fragst ist naheliegend
1 | #ifdef __AVR_3_BYTE_PC__
|
Falls es sich um eine echte Bibliothek handelt (libfoo.a) dann wirken
Makros natürlich nur zur Buildzeit der Lib. In dem Falle wird die Lib
abhängig von der Architektur erzeugt und gelinkt. Weil ATmega256[01] zu
-mmcu=avr6 gehören, wäre dies der Schalter der Wahl.
Übrigens kann man avr-gcc nach dem Multilib-Pfad fragen, etwa im
Makefile:
1 | LPATH = $(shell avr-gcc -print-multi-directory -mmcu=atmega2560)
|
setzt LPATH auf "avr6" oder im sh-Skript:
1 | LPATH=`avr-gcc -print-multi-directory -mmcu=atmega2560`
|
Falls es wirklich zur Laufzeit sein muss, dann tut Code wie
1 | #include <avr/io.h>
|
2 | #undef __SFR_OFFSET
|
3 | #define __SFR_OFFSET 0
|
4 |
|
5 | ;; R24 = sizeof (PC)
|
6 | sizeof_PC:
|
7 | in r24, SP
|
8 | set
|
9 | rcall 0f
|
10 | 0: brtc 1f
|
11 | clt
|
12 | in r0, SP
|
13 | sub r24, r0
|
14 | 1: ret
|