#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.