Hallo zusammen,
ich habe ein paar Fragen in Bezug auf die Einbindung von Assembler in
ein c Programm. Ich benutze das Atmel Studio 6 und programmiere einen
ATMega32U4. Hier die, zum besserem Verständnis, gekürzen Programme:
c-Programm:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | extern void servoinit(void);
|
4 | extern void pulsinit(void);
|
5 |
|
6 |
|
7 | int main(void)
|
8 | {
|
9 |
|
10 | servoinit();
|
11 |
|
12 | {
|
13 |
|
14 | }
|
15 | }
|
16 |
|
17 |
|
18 | ISR (TIMER0_OVF_vect)
|
19 | {
|
20 | pulsinit();
|
21 | }
|
asm-Programm:
1 | #define _SFR_ASM_COMPAT1
|
2 | #define __SFR_OFFSET 0
|
3 | #include <avr/io.h>
|
4 |
|
5 |
|
6 | .data
|
7 | servodata: .BYTE 64
|
8 |
|
9 | .text
|
10 |
|
11 | .global servoinit, pulsinit
|
12 |
|
13 |
|
14 | servoinit:
|
15 |
|
16 | // asm code
|
17 |
|
18 | ret
|
19 |
|
20 |
|
21 | pulsinit:
|
22 |
|
23 | // asm code
|
24 |
|
25 | ret
|
Nun meine Fragen dazu:
1. Da ich bis jetzt hauptsächlich asm programmiert habe, bin ich es
gewohnt den Stackpointer einzurichten. Brauche ich dies nun nicht mehr
zu machen? Bzw. wie kann ich diesen einrichten?
2. pulsinit: wird durch einen timer Interrupt aufgerufen. Kann ich dies
irgendwie direkt tun oder muss ich hier wirklich den Umweg über eine
Funktion machen?
3. Stimmt bei pulsinit: der Rücksprung Befeht ret oder müsste ich hier
reti hinschreiben? Beides funktioniert bei meinem Programm.
4. Ich adressiere den Anfang von 64 Bytes im SRAM, wie kann ich sicher
gehen dass, wenn ich z.B. weiteren c Code einfüge, diese nicht
überschrieben werden?
5. Wie kann ich eines der 64 SRAM Daten direkt aus c beschreiben (z.B.
Byte 30)? Oder muss ich hier den umweg über eine asm Funktion gehen?
Das sind viele Fragen aber ich hoffe einige können gelöst werde können.
Leider habe ich dazu nicht sehr viel im Internet gefunden oder einfach
falsch gesucht. Über Lektüre über dieses Thema würde ich mich freuen.
Grüße, Marco