Forum: Mikrocontroller und Digitale Elektronik #define (wie kann ich vektor erstellen.


von maxx (Gast)


Lesenswert?

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

von Präprozessor (Gast)


Lesenswert?

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

von maxx (Gast)


Angehängte Dateien:

Lesenswert?

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 ;

von maxx (Gast)


Lesenswert?

.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):

von maxx (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.