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
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.
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 |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.