#define USART0_RX_vect_num 20 #define STR(x) #x #define VVV STR(_vector ## USART0_RX_vect_num) Warum USART0_RX_vect_num wird nicht durch 20 esetzt? Hintergrund: static void ISR_USART_RX_Callback() \ __asm__(VVV)__attribute__((_signal_, _used_, _externally_visible_)); Vielen Dank voraus!
>Warum USART0_RX_vect_num wird nicht durch 20 esetzt?
Weil der Präprozessor nur einen Textersatz macht (und das nicht
rekursiv).
Das Ergebins von VVV ist "_vectorUSART0_RX_vect_num"
Ich nehme an, du möchtest als Ergebnis aber "_vector20" haben ?
Dann mußt du das so schreiben:
1 | #define USART0_RX_vect_num 20
|
2 | #define STR(x) #x
|
3 | #define _concat(x,y) x##y
|
4 | #define concat (x,y) _concat(x,y)
|
5 | #define VVV STR(concat(_vector, USART0_RX_vect_num))
|
concat übergibt einfach die Tokens an _concat, also: _concat(abc,def) Beim Aufruf _concat schaut der Präprozessor nach ob abc oder def schon definiert ist und ersetzt es gegebenenfalls. Wenn es nicht definiert ist, bleibt der Name und wird nicht ersetzt). _concat fügt die Parameter dann zusammen und übergibt dieses neue Token STR, was dann einen String daraus macht.
Danke! aber leider funzt nicht, irgendwie kommt Prä nicht weiter. Fehler: Severity Code Description Project File Line Error junk at end of line, first unrecognized character is `(' I2C_lib home_control\prozessorblock\atm_home_cpp\atm_home_cpp\Debug\USART.s 1010 irgendwo im _asm_ oder geschachteltem Klasse bleibt hängen. #define USART0_RX_vect_num 20 #define STR(x) #x #define _concat(x,y) x##y #define concat (x,y) _concat(x,y) #define VVV STR(concat(_vector, USART0_RX_vect_num)) class USART { volatile unsigned int buffercounter; char usart_rx_buffer[BUFFER_SIZE]; char *rx_buffer_pointer_in; char *rx_buffer_pointer_out; class usartInterrupt { // pointer to ownwer static USART *ownerUSART; // ServiceRoutine die bedient den timer (interrupt) //TODO Bennenung vom Interrupt benutzen static void ISR_USART_RX_Callback() \ __asm__(VVV)__attribute__((_signal_, _used_, _externally_visible_)); public: static void record(USART *ownerTimer); }; struct { volatile unsigned char usart_ready:1; volatile unsigned char usart_rx_ovl:1; volatile unsigned char usart_disable:1; //benötigt für ftp2com }usart_status ;
.lss datei zeigt .size _ZN5USART12ISR_USART_RXEv, .-_ZN5USART12ISR_USART_RXEv .global concat(_vector, USART0_RX_vect_num) .type concat(_vector, USART0_RX_vect_num), @function concat(_vector, USART0_RX_vect_num):
na endlich. Affenmethode hat funktioniert (wenn man blöd ist .-))
1 | #define USART0_RX_vect_num 20
|
2 | #define STR(x) #x
|
3 | #define XSTR(x) STR(x)
|
4 | #define _glue(x,y) x ## y
|
5 | #define glue(x,y) _glue(x,y)
|
6 | #define _vector_xx glue(__vector_,USART0_RX_vect_num)
|
7 | |
8 | class usartInterrupt |
9 | {
|
10 | // pointer to ownwer
|
11 | //static USART *ownerUSART;
|
12 | // ServiceRoutine die bedient den timer (interrupt)
|
13 | //TODO Bennenung vom Interrupt benutzen
|
14 | static void ISR_USART_RX_Callback() __asm__(XSTR(_vector_xx)) __attribute__((__signal__, __used__, __externally_visible__)); |
15 | //public:
|
16 | //static void record(USART *ownerTimer);
|
17 | };
|
18 | |
19 | void usartInterrupt::ISR_USART_RX_Callback() |
20 | {
|
21 | |
22 | |
23 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.