Den Stack brauch ich meist nicht zu initialisieren
Wenn Du C-Funktionen aufrufen willst, muß er vorher initialisiert sein.
So, Schritt für Schritt. Erstmal die einfachere Version: Asm von C aus aufrufen.
Etwas C-Syntax mußt Du sowieso lernen, wenn Du C-Funktionen aufrufen willst und wenn Du den Präprozessor schon benutzt hast, wird Dir einiges bekannt vorkommen
Ich nehme grade Studio 7, müßte aber bei den älteren Versionen nahezu identisch sein.
File → New → Project
__________ GCC C Executable Project
Projektnamen eingeben und ok
Controller ist egal, habe einen mega88pa ausgewählt, weil ich den grade auf dem Steckbrett habe.
Programm eingeben:
CodeBox C
#include <avr/io.h>
#include "test.h" // Headerdatei für Asm einbinden
uint8_t summe = 0; // Deklaration und Definition einer globalen Variablen
uint8_t summand = 0; // dito für eine Variable, die nur in Asm benutzt wird
// aussagekräftige Namen ersparen übrigens Kommentare ;)
int main(void)
{
FOREVER { // Endlosschleife
summe = addiere(summe); // Funktion mit Parameter und Rückgabewert
nacktfrosch(); // Funktion ohne Parameter und Rückgabewert
}
}
File → Save
File → New → File
__________ Assembly File
Programm eingeben:
CodeBox Assembler
// mit der Endung .S (statt .s) kann man den Präprozessor auch in asm benutzen
#define INC // wenn diese Anweisung auskommentiert wird, wird dekrementiert
//← diese C-Kommentare werden vom Präprozessor entsorgt
.extern summand ; globale Variable, im C-Programm definiert
.func addiere
.global addiere
addiere:
lds r16, summand
add r24, r16 ; Summe wird in r24 übergeben und braucht hier
ret ; deshalb nicht bekannt gemacht zu werden
.endfunc ; Rückgabewert erwartet C auch in r24
.func nacktfrosch
.global nacktfrosch
nacktfrosch:
lds r16, summand
#ifdef INC // Präprozessoranweisungen
inc r16 // mach irgendwas mit Summand
#else
dec r16 // oder mach was anderes
#endif
sts summand, r16
ret
.endfunc
File → Save as
__________________ <Pfad zum Projektordner>/
test.S
File → Move test.S into
_________ <Projektname>
File → New → File
______________ Include File
Programm eingeben:
CodeBox C
#ifndef TEST // Include-Guard, damit der Header nicht mehrfach eingebunden wird
#define TEST
#define FOREVER for (;;)
// Funktionsdeklarationen
uint8_t addiere(uint8_t var); // var wird in r24 übergeben, Rückgabewert auch in r24
void nacktfrosch(void); // nackter Funktionsaufruf, entspricht call in asm
#endif
File → Save as
___________________ <Pfad zum Projektordner>/
test.h
File → Move test.h into
__________ <Projektname>
compilieren
Simulator wählen
testen
Auf diese Art und Weise kannst Du auch fast Dein gesamtes Projekt in Assembler schreiben und nur die Aufrufe der Qtouch-Lib über die .c und .h Files machen.
Es wäre hier vielleicht die ideale Gelegenheit einen Einstieg in C zu probieren. Dies ist nur mal ein Vorschlag, vielleicht ist es ja dann so einfacher
Dem schließe ich mich an
Selbst große Assemblerprogrammteile in C einbinden finde ich einfacher.
btw: Tabs nach Text, sowohl innerhalb, als auch außerhalb von Codeboxen ist ein Krampf.
Gibt's da 'ne einfache Möglichkeit, die ich nicht gefunden habe?