-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Was bedeutet extern, global beim PIC

  1. #1
    AEWE47
    Gast

    Was bedeutet extern, global beim PIC

    Anzeige

    Hi Leutz brauche dringend eine schnelle info

    was machen und was bedeuten die Befehle extern, global, res usw also die Pseudobefehle die es sonst och gibt, bei Sprut habe ich nur wenige gefunden, hoffe ihr habt ne andere Seite für mich oder ne gute Beschreibung.

    Bitte in Zukunft kein Datum angeben. MfG stegr

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Hi, für den Prozessor bedeuten diese Befehle gar nix, das sind Kompiler-definitionen, daher steht beim Sprut nix darüber.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    AEWE47
    Gast

    Mein ich doch

    OK schon klar, dass es fürn PIC kein Befehl ist, sorry falsch ausgedrückt.

    Benötige aber trotzdem den Befehlssatz halt fürn Assembler LOL

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    14.12.2004
    Beiträge
    17

    So isses besser

    Bin nu unter meinem richtigen Namen On, sorry

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Jetzt steh' ich auf dem Schlauch: wenn's nur für den Kompiler und ggf. den Linker ist, gibt's natürlich keine Maschinenbefehle dafür.
    Was brauchst du genau ?
    mfg

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    14.12.2004
    Beiträge
    17

    Kleiner Programmauszug

    Sorry ich versuchs ma so ok, ich Teile meine Assemblerseiten verschiedenen Unterteilung ein.
    Das alles kommt dann in Source File hinein schön geordnet so und nun kommt in einem Prog so etwas vor:

    ;Externe Variablen

    extern DATA_EE_ADDR
    extern EEPROM_Daten
    extern I2C_EE_pos
    extern I2C_EE_bank
    extern pin1
    extern month
    extern day
    extern min
    extern min10
    extern hour
    extern hour10
    extern output
    extern pointstat

    ;Globale Routinen
    global I2C_liste_lesen_datensatz, I2C_liste_schreiben
    global data_read_1, data_read_2, data_read_3
    global data_read_4, data_read_5
    ;externe Routinen
    extern RS232out

    ;Variablen

    GPR1 UDATA_shr
    data_read_1 res 1
    data_read_2 res 1
    data_read_3 res 1
    data_read_4 res 1
    data_read_5 res 1


    I2C_Listen_routinen code

    I2C_liste_lesen_datensatz
    btfsc PCdata
    goto PCdatenlesen

    movlw EE_pos
    movwf DATA_EE_ADDR
    call EERead
    movfw EEPROM_Daten
    movwf I2C_EE_pos


    movlw EE_bank
    movwf DATA_EE_ADDR
    call EERead
    movfw EEPROM_Daten
    movwf I2C_EE_bank

    Nun frag ich wie und was hat es mit dem extern, global auf sich ?

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Schau, der Compiler (Assembler) fährt ja durch den Source-Code (Text) durch und kommt zu sowas wie "CALL WTLBRNFT". Er braucht an dieser Stelle aber offensichtlich eine Addresse, um den Maschinen Code herzurichten. Wo nimmt er die jetzt her ? Er merkt sich die Stelle und fährt auch durch den restlichen Code durch (Pass 1, vielleicht schon gehört). Findet er nun unterwegs einen Label "WTLBRNFT" , schreibt er sich diese Adresse auf.
    Dann fährt er nochmal durch den ganzen Code (Pass 2). Wenn er nun zu dem CALL kommt, geht's ihm gut, denn jetzt hat er ja die Adresse und kann das Statement fix und foxi in Maschinencode übersetzen.
    Jetzt hat er EIN Object-Modul fertig. voila.
    Ist aber nun "WTLBRNFT" eine Label, der in einer ANDEREN Source des Projektes definiert wird (und daher auch in einem anderen Object-Modul),
    geht das obige nicht. Damit der Compiler aber weiß, daß "WTLBRNFT" kein Schreibfehler ist, sondern nur woanders definiert ist, schreibt man "EXTERN WTLBRNFT" rein. Deswegen kann er das statement zwar auch nicht übersetzen (er hat ja die Adresse immer noch nicht), aber er schreibt in das Object Modul eine Nachricht für den Linker, daß "WTLBRNFT" noch eine Adresse braucht und WO im dem Object diese Adresse überall fehlt (kann ja öfters drinstehen)
    So.
    Jetzt kommt der Linker daher und ist verzweifelt. Er sieht, daß er die Adresse von WTLBRNFT braucht und hat keine Ahnung, in welchen Objectmodule die sein könnte.
    Wenn aber der Programmierer, der diese Funktion tatsächlich geschrieben hat, zusätzlich "GLOBAL WTLBRNFT" in die Source geschrieben hat, steht vorne im Objectmodul eine Zeile mit Namen und Adresse von dem Label.
    JETZT ist der Linker glücklich, denn überall, wo der Wert fehlt, kann er jetzt was reinschreiben und alle freuen sich.

    ALSO: der, der eine Funktion SCHREIBT, kann zusätzlich "GLOBAL" dazu sagen, dann ist die sie für alle anderen Module verwendbar.
    Und der, der diese Funktion BRAUCHT, schreibt "EXTERN" dazu.
    *schauf* klaro ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    14.12.2004
    Beiträge
    17

    Respekt

    Sauber gemacht Robert, so hat ich mir das ungefair vorgestellt
    Sau gut erklärt, selbst für die nicht sportlichen Hirne.

    Habe im MPLAB IDE unter Hilfe --- Topic... --- Assembler nach einiger Zeit genau dies gefunden aber trotz alledem sau gut erklärt, werde mir deine Passage heraus kopieren, für Azubierklärungszwecke. Für meine Azubi nachfolger thx.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    14.12.2004
    Beiträge
    17

    Kleine Hilfe

    KÖnntest du mir vielleicht noch eine kleine Erklärung zu diesem Punkt abgeben ???


    GPR1 UDATA_shr
    data_read_1 res 1
    data_read_2 res 1
    data_read_3 res 1
    data_read_4 res 1
    data_read_5 res 1

    Zum udata_shr, _ovr, acs

    ich danke dir noch ma

  10. #10
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Au weia.
    "res 1" heißt mal nur, daß data_read_1 1 Byte lang sein soll.
    (REServe 1 Byte)

    "udataXXX" sind grundsätzlich daten-Sections mit ein paar Variationen.
    Im Gegensatz zu "idata" pfeift sich kein Schwein drum, was da am Anfang drinsteht, das muß du selbst machen (auf NUL setzen z.b). Deswegen haut er dir Dinge wie "DB" etc. auch um die Ohren.

    "udata" ist sozusagen das Normale, der Compiler weiß, daß er auf die bankselection aufpassen muß
    "udata_acs" sind daten in dem speziellen "Access"-Bereich(nur f. PIC18...)
    "udata_shr" sind daten im dem RAM, wo die Bankselection keine Rolle spielt, weil eh alle Banken auf den selben bereich hingreifen.
    "udata_ovr" nimmt man, wenn man das GLEICHE Speicherbereich VERSCHIEDEN definieren will.

    WO die Schweinebacke des "access" Bereich hat, kann ich nicht sagen, da müßt ich Datashit lesen.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Seite 1 von 3 123 LetzteLetzte

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •