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


von fogmaster (Gast)


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

von Warhawk (Gast)


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:
1
 
2
unsigned char g_ucLSBy[65], g_ucMSBy[65];
3
Measure(g_ucLSBy,g_ucMSBy);

Und der entsprechende ASM-Teil
1
.equ  Messpunkte,65 
2
3
4
.global Measure
5
.func Measure
6
Measure:
7
  push r26
8
  push r27
9
  push r28
10
  push r29
11
  push r30
12
  push r31
13
  push r16
14
  push r15
15
  ldi r26,Messpunkte
16
  ldi r27,0
17
  movw r28,r24
18
  movw r30,r22
19
LOOP:
20
....
21
22
  in r15,PINA
23
  st Y+,r15
24
  in r15,PINB
25
  st Z+,r15
26
27
....
28
  sbiw r26,1
29
  brne LOOP
30
31
  pop r15
32
  pop r16
33
  pop r31
34
  pop r30
35
  pop r29
36
  pop r28
37
  pop r27
38
  pop r26
39
  ret
40
.endfunc
41
.end

Ich hoff es hilft dir.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Du kannst die Adresse übergeben oder das Symbol direkt verwenden:
1
extern void foo (unsigned char);
2
3
unsigned char data[4];
4
5
void bar (void)
6
{
7
    foo (4); //data[1] = 4
8
}

Assembler
1
.text
2
.global foo
3
4
foo:
5
  sts data+1, r24
6
  ret

Natürlich geht auch
1
   ldi r30, lo8(data)
2
   ldi r31, hi8(data)
3
   std z+1, r24
4
   ; oder
5
   ldi r30, lo8(data+1)
6
   ldi r31, hi8(data+1)
7
   st  z, r24

von fogmaster (Gast)


Angehängte Dateien:

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...

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.