Probleme bei Adressenauswahl von einem Makro



  • Hallo ich habe beim Schreiben eines Treibers folgendes Problem:

    /*
    ** Pointers to process data, messages and registers.
    */
    
    #ifdef ABCC_PARALLEL_DIRECT_ACCESS_THROUGH_PTR
      [b] UINT16* const         piWritePD    = (UINT16*)( ABCC_PARALLEL_BASE_ADDRESS + 0x3800 );[/b]
       UINT16* const         piReadPD     = (UINT16*)( ABCC_PARALLEL_BASE_ADDRESS + 0x3900 );
       ABP_MsgType* const    psWriteMsg   = (ABP_MsgType*)( ABCC_PARALLEL_BASE_ADDRESS + 0x3B00 );
       ABP_MsgType* const    psReadMsg    = (ABP_MsgType*)( ABCC_PARALLEL_BASE_ADDRESS + 0x3D00 );
       volatile UINT8* const pbControlReg = (UINT8*)( ABCC_PARALLEL_BASE_ADDRESS + 0x3FFE );
       volatile UINT8* const pbStatusReg  = (UINT8*)( ABCC_PARALLEL_BASE_ADDRESS + 0x3FFF );
    #else
       UINT16                aiWritePDBuffer[ 2 ];
       UINT16                aiReadPDBuffer[ 2 ];
       UINT16* const         piWritePD    = aiWritePDBuffer;
       UINT16* const         piReadPD     = aiReadPDBuffer;
       ABP_MsgType           sMsgBuffer;
       ABP_MsgType* const    psWriteMsg   = &sMsgBuffer;
       ABP_MsgType* const    psReadMsg    = &sMsgBuffer;
    #endif
    

    **--> Hier sieht man Zeiger (Pointer) wie zB. piWritePD. Diese zeigen auf eine zusammengesetze Adresse.

    Durch diese Adresse wird die jeweilige Steuerleitung angesprochen.

    In meinen System ist dies durch eine Makro umgesetzt, so dass ich diese statt einer Adresse verwenden muss.

    Es lautet:

    #define wrlmode(adr,val)  (outword (MOD1ADR+0x10,(adr)),outword (MOD1ADR+0x008,(val)))
    

    Gibt es nun eine Möglichkeit die Adresse von wrlmode irgendwie auszulesen und auf eine Variable zu übertragen,damit dies dann die feste Adresse im Zeiger (Pointer) piWritePD darstellt.**
    **
    Würde mich über eure Antworten freuen.Danke.**



  • Guiekalle schrieb:

    Gibt es nun eine Möglichkeit die Adresse von wrlmode irgendwie auszulesen und auf eine Variable zu übertragen...

    so erstmal nicht. makros haben keine adressen. du könntest aber eine funktion aus dem makro machen und dann die adresse dieser funktion in einen function pointer stecken.
    🙂



  • **Danke für deine Idee.Weiß nur noch nicht wie es geht.Vielleicht kannst du/ihr mir helfen ?

    Den Makro in eine Funktion einbauen ?
    **

    void Write ()
    
    {
    
    wrlmode(0x3800,0x11);
    
    }
    

    **Oder wie zaubere ich aus dem Makro eine Funktion ?

    Und danach ? Wie läuft das mit dem Pointer:**

    uint16 (*pointer)(uint16);
    
    pointer= & Write;
    

    **Und wie geht es weiter ?

    Danke schon mal...** 😕



  • ^^so z.b:

    // funktion für das makro
    void wrlmode_function (UINT16 adr, UINT16 val)
    {
       wrlmode(adr,val);
    }
    ...
    // neuer typ für den function pointer
    typedef void (*fptr)(UINT16, UINT16); 
    ...
    // einen function pointer anlegen
    fptr func;
    ...
    // ...die funktion da rein ...
    func = wrlmode_function;
    ...
    // ... und aufrufen  
    func1 (1,2);
    

    🙂



  • Vielen Dank.

    Kann es einigermaßen nachvollziehen, nur beim Aufrufen

    // ... und aufrufen  
    func1 (1,2);
    

    frage ich mich warum func1 steht und was die Bedeutung von (1,2) ist.

    Sehe ich das richtig,dass func dann der Funktionspointer ist und im weiteren Verlauf mir immer die Adresse liefert ?

    Werde es am Montag gleich am System testen. Danke. Werde mich noch mal melden.

    Hut ab. 👍



  • Habe die Funktion für das Makro eingebunden,und am System kompiliert.

    // funktion für das makro
    void wrlmode_function (UINT16 adr, UINT16 val)
    {
       wrlmode(adr,val);
    }
    ...
    // neuer typ für den function pointer
    typedef void (*fptr)(UINT16, UINT16);
    ...
    // einen function pointer anlegen
    fptr func;
    ...
    // ...die funktion da rein ...
    [b]func = wrlmode_function;[/b]
    ...
    // ... und aufrufen  
    func1 (1,2);
    

    ⚠ Folgender Fehler wird angezeigt:

    Error at line 14: function body for non-function
    Error at line 14: unable to recover from syntax error

    Nicht anwendbar ?

    😞



  • seltsam, bei mir geht's. in der letzten zeile muss 'func1' natürlich 'func' heissen. das war'n tippfehler.
    sehen für deinen compiler function pointer vielleicht so aus:

    typedef (void *fptr)(UINT16, UINT16);
    

    😕
    🙂



  • Danke für deine Mühe...Hmmm...

    // funktion für das makro
    void wrlmode_function (UINT16 adr, UINT16 val)
    {
       wrlmode(adr,val);
    }
    ...
    // neuer typ für den function pointer
    typedef void (*fptr)(UINT16, UINT16);
    ...
    // einen function pointer anlegen
    fptr func;
    ...
    // ...die funktion da rein ...
    [b]func = wrlmode_function;[/b]
    ...
    // ... und aufrufen  
    func (1,2);
    

    ⚠ Fehlermeldung:

    Error at line 14 : syntax error near `void`
    Error at line 14: function body for non-function
    Error at line 14: unable to recover from syntax error

    😕



  • welchen compiler benutzt du?
    🙂



  • Benutze 80C196 C Compiler v5.0



  • welcher hersteller? keil? tasking?
    ach ja, und du postest immer mein beispiel. zeig doch mal den originalcode, den du versuchst, dem compiler aufs auge zu drücken.
    🙂



  • Hersteller (C)1996 Tasking Software BV

    Mein Code:

    #define wrlmode(adr,val)  (outword (MOD1ADR+0x10,(adr)),outword (MOD1ADR+0x008,(val)))
    
    #ifdef ABCC_PARALLEL_DIRECT_ACCESS_THROUGH_PTR
    
    void wrlmode_function (uint16 adr, uint16 val)
    
    {
    
    wrlmode(adr,val);
    
    }
    
    typedef void (*fptr)(uint16,uint16);
    
    fptr func;
    
    func = wrlmode_function;
    
    func (1,2);
    
    #else
    
     UINT16	 aiWritePDBuffer[2];
     UINT16  aiReadPDBuffer[2];
     UINT16* const piWritePD  = aiWritePDBuffer;
     UINT16* const piReadPD   =  aiReadPDBuffer;
    
    #endif
    

    --> steht alles am Anfang,also nicht in main ()



  • aber mindestens das hier:

    fptr func;
    func = wrlmode_function;
    func (1,2);
    

    muss in eine funktion rein (z.b. in die main).
    🙂



  • oben:

    #define wrlmode(adr,val)  (outword (MOD1ADR+0x10,(adr)),outword (MOD1ADR+0x008,(val)))
    
    #ifdef ABCC_PARALLEL_DIRECT_ACCESS_THROUGH_PTR
    
    void wrlmode_function (uint16 adr, uint16 val)
    
    {
    
    wrlmode(adr,val);
    
    }
    
    typedef void (*fptr)(uint16,uint16);
    
    #else
    
     UINT16     aiWritePDBuffer[2];
     UINT16  aiReadPDBuffer[2];
     UINT16* const piWritePD  = aiWritePDBuffer;
     UINT16* const piReadPD   =  aiReadPDBuffer;
    
    #endif
    

    unten (Ablauf):

    void task2(void)	
    
    {
      register uint16 tl,th;
      register uint8  temp;
    
      taskinit ();
    
      firsttime  = 1;
      pbinitdone = 0;
    
    [b]fptr func;
    
    func = wrlmode_function;
    [/b]
    
    func (1,2);
    
    }
    

    ⚠ für unten:

    Error at line 15 : syntax error near `func`
    Error at line 15 : undefined indentifier: func
    Error at line 18 : undefined indentifier: func
    Error at line 18: incompatible types

    [b]typedef void (*fptr)(uint16,uint16);[/b]
    

    --> nach unten ?

    😕



  • ich weiss echt nicht, was du da anstellst. nimm mal diese zeilen:

    void wrlmode_function (unsigned short adr, unsigned short val)
    {
    }
    
    typedef void (*fptr)(unsigned short, unsigned short);
    
    void f(void)
    {
      fptr func;
      func = wrlmode_function;
      func (1,2);
    }
    

    erstelle ein neues .c file und kopier das da unverändert rein. nichts hinzufügen und nichts weglassen. ...und dann füttere deinen compiler mal damit.
    🙂



  • Prima das geht schon mal... 👍 ,

    Jetzt muss ich es nur wieder richtig einbauen...

    Habe es eingebaut.Geht auch. 😋 👍

    Jetzt fehlt aber oben noch die Anweisung in

    void wrlmode_function (unsigned short adr, unsigned short val)
    {
    
    [b]wrlmode(adr,val); [/b]...Oder ?
    
    }
    


  • Guiekalle schrieb:

    Jetzt fehlt aber oben noch die Anweisung in
    void wrlmode_function (unsigned short adr, unsigned short val)
    {
    }

    das war auch nur ein testcode, ob dein compiler z.b. mit dieser function-pointer syntax klar kommt, etc. ich hab' bewusst alles weggelassen, wofür du irgendwas hättest #includen müssen. wenn jetzt noch irgendwas zickt, dann solltest du deine c-kenntnisse mal auffrischen.
    🙂



  • Du hast es echt drauf...wäre froh wenn ich einen Syntax kennen würde...und du spielst damit rum...klasse... 👍

    Da hast du recht meine Kenntnisse machen mir Angst...he he... 🙄

    #define wrlmode(adr,val)  (outword (MOD1ADR+0x10,(adr)),outword (MOD1ADR+0x008,(val)))
    #define rdlmode(adr)  (outword (MOD1ADR+0x10,(adr)),inword  (MOD1ADR+0x108))
    
    void wrlmode_function (unsigned short adr, unsigned short val)
    
    {
    
    wrlmode(0x3800,0x11); /*Schreibe Wert 11 in Speicher 3800*/
    
    }
    
    typedef void (*fptr)(unsigned short, unsigned short);
    
    void f(void)
    
    {
      fptr func;
      func = wrlmode_function;
      func (1,2);
    }
    

    So jetzt muss ich mir den Wert ausgeben lassen...und testen 👍

    Das passiert hier:

    MWA_Block = rdlmode(0x3800); /Auslesen von Speicher 3800 in Variable  MWA_Block*/
    
    putshex(ZS(21,00),MWA_Block,NORML(BLK,WHT)); /*Anzeigen der Variable MWA_Block*/
    


  • Guiekalle schrieb:

    ...wäre froh wenn ich einen Syntax kennen würde...und du spielst damit rum..

    wenn du ein bisschen länger mit C rumfummelst, kannst du das auch.
    🙂



  • Hallo ich bins noch mal:

    Also es ergeben sich keine Fehler,jedoch wollte ich nun func für einen Schreibvorgang weiterverwenden,und da scheint es noch nicht zu stimmen.

    Möchte zu Testzwecken den Wert 11 in den Speicher 3800 schreiben.

    #define wrlmode(adr,val)  (outword (MOD1ADR+0x10,(adr)),outword (MOD1ADR+0x008,(val)))
    #define rdlmode(adr)  (outword (MOD1ADR+0x10,(adr)),inword  (MOD1ADR+0x108))
    
    void wrlmode_function (UINT16 adr,UINT16 val)
    
    {
    
    wrlmode(0x3800,0x11); 
    
    }
    
    typedef void (*fptr)(UINT16,UINT16);
    
    void f(void)
    
    {
      fptr func;
      func = wrlmode_function;
      func (1,2);
    }
    
    #ifdef ABCC_PARALLEL_DIRECT_ACCESS_THROUGH_PTR
    
    UINT16* const  piWritePD   = (UINT16*)(func); 
    
    /*anstelle von  UINT16* const piWritePD = (UINT16*)( ABCC_PARALLEL_BASE_ADDRESS + 0x3800 ); */
    
    #else
    
     UINT16	 aiWritePDBuffer[2];
     UINT16  aiReadPDBuffer[2];
     UINT16* const piWritePD  = aiWritePDBuffer;
     UINT16* const piReadPD   =  aiReadPDBuffer;
    
    #endif
    
    #define WriteParallel(func,adr,val)
    
    void task2(void)
    
    {
    
      register uint16 tl,th;
      register uint8  temp;
    
       taskinit ();
    
       firsttime  = 1;
       pbinitdone = 0;
    
       WriteParallel(piWritePD,0x3800,0x11); /*Schreiben von Wert 11 in 0x3800*/
    
       pbtim = ticks(1500000); /*delay*/
    
       while(pbtim);
    
       MWA_Block = rdlmode(0x3800); /*einlesen*/
    
       putshex(ZS(21,00),MWA_Block,NORML(BLK,WHT)); */ausgeben*/
    

    Dachte func verhält sich nun wie eine Variable... 😕


Log in to reply