Gast
#664888
Hallo,
ich möchte einen möglichst exakten Zähler bauen, um mein Program exakt
verzögern zu können. Dazu möchte ich Inline ASM in einem C Programm
einsetzen, habe aber damit meine liebe Not.
Einer Funktion wird ein "unsigned char length" übergeben. Dieser Wert
gibt an, wie lange verzögert werden soll.
Ich habe geschrieben:
asm volatile ( " ld r2, 0" "\n\t"
"start: add r2, 1" "\n\t"
" cp r2, %e0" "\n\t"
" brge start"
:
: "e" (length)
: "r2"
);
Zunächst soll in Register r2 eine Null geladen werden, die anschließend
um eins inkrementiert wird. Anschließend soll dieser Wert mit den
übergebenen Wert (length) verglichen werden und, wenn r2 kleiner als
length ist, wieder nach oben gesprungen werden.
So verzögere ich zwei Taktzyklen pro Durchlauf mit einem "Overhead" zu
Beginn von einem Taktzyklus.
Nur leider klappt das ganze nicht s, wie ich mir das vorstelle.
AVRStudio sagt:
Build started 28.9.2007 at 16:04:42
avr-gcc.exe -mmcu=atmega32 -Wall -gdwarf-2
-DF_CPU=8000000UL -Os -fsigned-char -MD -MP -MT sequence.o -MF
dep/sequence.o.d -c ../sequence.c
C:\DOKUME~1\User\LOKALE~1\Temp/ccGZhlMJ.s: Assembler messages:
C:\DOKUME~1\User\LOKALE~1\Temp/ccGZhlMJ.s:693: Error: pointer register
(X, Y or Z) required
make: *** [prg.o] Error 1
Build succeeded with 0 Warnings...
gcc plug-in: Error: Object file not found on expected location
D:\Programmierung\Prg\default\Prg.elf
Ich bin über Hinweise, wie ich meinen Fehler korrigieren kann oder
meinen Zähler verbessern kann, dankbar :-)
Gruß
Kurt