www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik zugriff auf AVR -SRAM in ASM und C


Autor: fogmaster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich möchte eine Assembler-routine zum Empfang von DMX-daten per UART in 
mein C-programm integrieren (als separate Datei). Diese Routine 
speichert die empfangenen Daten in einen betimmten bestimmten 
Adressbereich des SRAM (0x60 bis 0x64). Mein problem ist: wie komme ich 
da jetz vom C-code aus dran? und wie kann ich dem AVR-gcc sagen das er 
diesen Bereich nicht mit anderen Werten überschreibt? Die funktion 
malloc() soll ja recht speicherintensiv sein.
Über ein par tips würde ich mich sehr freuen!
gruß fogmaster

Autor: Warhawk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich hab das selbe Problem wie folgt gelöst:

Einfach im C Teil ein entsprechend großes Array definiert, so das der 
Speicherbereich belegt war.
Anschießend hab ich die Adresse des Arrays an die ASM-Routine übergeben.
In der ASM-Routine musst du dann bloss die Adresse aus den Registern 
umspeichern um sie dann als index zum speichern zu benutzen.

Hier mal ein kleines Beispiel:

Der Aufruf im C Teil:
 
unsigned char g_ucLSBy[65], g_ucMSBy[65];
Measure(g_ucLSBy,g_ucMSBy);

Und der entsprechende ASM-Teil
.equ  Messpunkte,65 


.global Measure
.func Measure
Measure:
  push r26
  push r27
  push r28
  push r29
  push r30
  push r31
  push r16
  push r15
  ldi r26,Messpunkte
  ldi r27,0
  movw r28,r24
  movw r30,r22
LOOP:
....

  in r15,PINA
  st Y+,r15
  in r15,PINB
  st Z+,r15

....
  sbiw r26,1
  brne LOOP

  pop r15
  pop r16
  pop r31
  pop r30
  pop r29
  pop r28
  pop r27
  pop r26
  ret
.endfunc
.end


Ich hoff es hilft dir.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst die Adresse übergeben oder das Symbol direkt verwenden:
extern void foo (unsigned char);

unsigned char data[4];

void bar (void)
{
    foo (4); //data[1] = 4
}

Assembler
.text
.global foo

foo:
  sts data+1, r24
  ret

Natürlich geht auch
   ldi r30, lo8(data)
   ldi r31, hi8(data)
   std z+1, r24
   ; oder
   ldi r30, lo8(data+1)
   ldi r31, hi8(data+1)
   st  z, r24

Autor: fogmaster (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also ich hab mich mal für die zweite Variante entschieden da sie für 
mich etwas lesbarer erscheind. Trotzdem vielen Dank an euch beide!
Jetz bekomme ich allerdings dauernd die Fehlermeldung:

gcc plug-in: Error: Object file not found on expected location 
C:\Dokumente und Einstellungen\......\dmx_asm_c_test.elf

Irgendwie mag das AVR-Studio 4.14 mein Assembler-file nicht. Es ist mein
erstes Projekt in dem ich ASM und C kombinieren will.
Weis vielleicht jemand woran es liegen könnte?
Hab mal das ganze Projekt angehängt. Falls mir also jemand Starthilfe 
geben kann...

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.