Forum: Mikrocontroller und Digitale Elektronik Problem mit Modulo-Funktion "__udivmodqi4"


von Dieter (Gast)


Lesenswert?

Hallo,

ich benötige in meinem Programm eine modulo-Operation und verwende dafür 
die Funktion "__udivmodqi4".

typedef struct
{
   uint8_t quot; /* Quotient */
   uint8_t rem;  /* Rest */
} udiv8_t;

extern udiv8_t udiv8 (uint8_t, uint8_t) __asm__("__udivmodqi4");

...
udiv8_t daten;
daten = udiv8(GlobalArray[i],16);
...

Der berechnete Quotient und Rest stehen im Register r24,r25. Aber die 
Ergbnisse werden nicht in die Struktur "daten" geschrieben. Wieso nicht?
In "daten" steht immer 0 und 1 drin (r30, r31).
Ich benutze das AVRStudio 4.18.

Kann mir da jemand bitte weiterhelfen, wieso das so ist?

mfg

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Kann ich nicht nachvollziehen bzw. bei mir stimmt es mit 
WinAVR-20071221.

Vollständiges Beispiel
(Ersatz der beiden undefinierten Variablen GlobalArray und i durch 
eine Konstante. Die Berechnung wird weiterhin zur Laufzeit vorgenommen)

1
#include <avr/io.h>
2
3
typedef struct
4
{
5
   uint8_t quot; /* Quotient */
6
   uint8_t rem;  /* Rest */
7
} udiv8_t;
8
9
extern udiv8_t udiv8 (uint8_t, uint8_t) __asm__("__udivmodqi4");
10
11
int main(void)
12
{
13
  udiv8_t daten;
14
  daten = udiv8(240,16);
15
  asm volatile("nop"); // Breakpoint für Watch 'daten'
16
}

Relevanter Ausschnitt aus dem Disassemblat

1
14: daten = udiv8(240,16);
2
+00000037: LDI     R22,0x10   Load immediate
3
+00000038: LDI     R24,0xF0   Load immediate
4
+00000039: RCALL   PC+0x000D  Relative call subroutine
5
+0000003A: STD     Y+2,R25    Store indirect with displacement
6
+0000003B: STD     Y+1,R24    Store indirect with displacement
7
15: asm volatile("nop"); // Breakpoint für Watch 'daten'
8
+0000003C: NOP                      No operation

Für mich sieht das korrekt aus. Die beiden Zeilen mit STD speichern das 
Ergebnis in die Variable daten.

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.