void INDIRECT foo(void); //Was macht INDIRECT



  • Habe die Funktion:

    void INDIRECT foo(void);

    Was macht das INDIRECT da?



  • Es wird vermutlich beim Präprozessorlauf durch das ersetzt, als was INDIRECT #defined ist.



  • Ja auf __indirect

    Was ist das?



  • Schau in die Doku deines Compilers.



  • danke kann mir das einer erklären?

    3.9.3 FUNCTION CALLING MODES: __indirect
    Functions are default called with a single word direct call. However, when
    you link the application and the target address appears to be out of reach
    (+/- 16 MB from the callg or jg instruction), the linker generates an
    error. In this case you can use the __indirect keyword to force the less
    efficient, two and a half word indirect call to the function:
    int __indirect foo( void )
    {
    ...
    }
    With compiler option --indirect you tell the compiler to generate far calls
    for all functions.



  • 16 MB = 16 * 1024 * 1024 B = 2 hoch 24 Bytes.
    Also die max. Anzahl von Adressen in einem 24-Bit-Wort.

    Da schaust du dem Compiler ein wenig unter die Haube. Wenn die Adresse deiner Funktion weiter als 16MB vom Aufruf-Code entfernt sein wird, dann mußt du also scheinbar INDIRECT sagen. Nachdem der etwaige Fehler vom Linker kommt, geht's um die Entfernung in den Binaries, nicht im Speicher.

    Wenn du das nicht verstehst: vergiß INDIRECT einfach wieder, solange du keine 16MB Binaries hast.



  • Welche Binaries sind größer 16MB?

    Das Flash meines µC ist maximal 2MB groß.

    Aber danke für die Erklärung.



  • Und wohr kommen die 24Byte her? derµC ist 32Bit



  • Limitierungen in der Adressblidung vielleicht? Was Aehnliches hast du zB. beim ARM. Die Instruktionen sind jeweils immer 32Bit breit - klar, dass du da drin keine direkten 32Bit-Adressen unterbringen kannst.
    Genaueres kannst du bestimmt herausfinden, wenn du mal die Dokumentation des µCs, bzw. von dessen Kern durchblaetterst.



  • Welche Binaries sind größer 16MB?

    Gute Frage. Wollte ich wissen und hab bei mir nachgeschaut.

    Der einzige Treffer war eine DLL von einem technischen Rechen-Programm. Das ist aber ein recht teures Ding, das sehr viel kann.

    Also: es gibt sie, aber eher selten.

    Die Sache mit dem Adressraum ist durchaus normal:

    Wikipedia schrieb:

    The ARM2 featured a 32-bit data bus, a 26-bit (64 Mbyte) address space and sixteen 32-bit registers.



  • Ja ich denk mal so 8bit von den 32 gehen für den opcode weg. dann resultieren diese 24 bit, für die adressenbildung.

    Habe hier aber weitergesucht. Anscheinend wird __indirect verwendet um funtionen in einen schnelleren "Scratch Pad RAM" zu laden.

    Wie soll das funktionieren? Werden dann beim hochfahren Funktionen da hinkopiert?


Anmelden zum Antworten