www.mikrocontroller.net

Forum: Compiler & IDEs Compiler-Fehler?


Autor: Mario Boller (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein Problem mit AVR-GCC. Ich hatte schon einen Forums-Beitrag 
für die AVR-Freaks-Seite erstellt, aber die ist nicht erreichbar. Darum 
seht es mir nach, wenn es jetzt angelsächsisch wird:

I got a problem concerning GCC. I think there may be a compiler error. I 
am not good in AVR-assembler, so some help would be fine. I try to give 
all necessary information.

I try to write a little unix like device system. I will provide it as 
freeware when I get it to run. In it is some code with these 
definitions:

----------------------
struct dirs {
  char *path;
  uint8_t major;
  uint8_t minor;
};

struct dirs dir[NO_DIRE] = {
    { "tty" , 0, 0 }, // UART 0
    { "ram" , 1, 0 }, // PCF8570, address 0
    { "par1", 2, 0 }, // PCF8574, address 0
    { "par2", 2, 1 }, // PCF8574, address 1
    { "ad0" , 3, 0 }, // PCF8591, address 0, 1. A/D-converter
    { "ad1" , 3, 1 }, // PCF8591, address 0, 2. A/D-converter
    { "ad2" , 3, 2 }, // PCF8591, address 0, 3. A/D-converter
    { "ad3" , 3, 3 }, // PCF8591, address 0, 4. A/D-converter
    { "da0" , 3,32 }, // PCF8591, address 0, D/A-converter
 };

... some other code ...
for(j=0; j<NO_DIRE; j++) {
    if(! strcmp(path, dir[j].path) ) {
      filetable[i].major = dir[j].major;
      filetable[i].minor = dir[j].minor;
        cdev[filetable[i].major].pdopen(
            filetable[i].minor, mode);
        return i;
    }
}
.. even more code ...

The problem is at the call of strcmp.

"path" is a pointer to the string "tty". I execute this code in the 
AVR-Studio 3.53 simulator. At the call of strcmp not the address of the 
string value dir[j].path is transferred, but part of the string itself!

With optimization -O2 the assembler code near the strcmp looks like this 
(I provide the listing instead of the disassembly code in AVR studio for 
better readability):

 166 006a C091 0000     lds r28,dir
 167 006e D091 0000     lds r29,(dir)+1
 168                 .L17:
 169                   .stabn 68,0,60,.LM11-open
 170                 .LM11:
 171 0072 6881          ld r22,Y
 172 0074 7981          ldd r23,Y+1
 173 0076 9B2D          mov r25,r11
 174 0078 8A2D          mov r24,r10
 175 007a 00D0          rcall strcmp
 176 007c 892B          or r24,r25
 177 007e 51F0          breq .L24
 178                   .stabn 68,0,59,.LM12-open
 179                 .LM12:
 180 0080 2496          adiw r28,4
 181 0082 1F5F          subi r17,lo8(-(1))
 182 0084 1930          cpi r17,lo8(9)
 183 0086 A8F3          brlo .L17

After line 166, Y does not contain the address of dir, but the address 
of the first string. So the load operations at lines 171 and 172 do not 
load the address of the string, but part of the string itself.

At line 175, r22=r23=0x74='tt' instead of 0x006e, what would be the 
address of the string.

So what can I do? With -O0 it is just the same. The compiler installed 
is
avrgcc_freaks20011214a.exe

Bye
    Mario

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.