Hallo miteinander, ich schreibe momentan ein Programm in 8051 Assembler
auf den C509 Mikrocontroller.
Nun möchte ich fragen ob ich in diesem Assembler Programm eine C++
Routine einbauen kann??
Wäre froh wenn ihr mir helfen könnt.
Gruss und Danke
Euer Florian
Im Prinzip ja, aber ...
Es wäre einfacher, von einem C-Programm Assembler-Routinen aufzurufen.
Wenn Du es dennoch probieren willst, lasse Dir aus Deinen C-Routinen
nicht den Code sondern einen Assembler Quellcode erzeugen, den Du dann
einbinden und mit übersetzen lassen kannst.
Du mußt aber beachten, daß Stack und andere Speicherbereiche von Deiner
Assemblerquelle zur Verfügung gestellt und initialisiert werden müssen.
Am einfachsten wird es sein, wenn Du ein C-Programm schreibst, das
sofort Deinen Assembler-Code aufruft. Dann sind alle Initialisierungen
für Deine C-Routine erledigt und kannst sie später bedenkenlos aufrufen.
Aber mal eine Frage: Welchen Compiler willst Du denn nutzen? Ich frage,
weil Du C++ und nicht C nutzen willst. Ich kenne keinen vernünftigen
C++-Compiler für 8051...
Habe die C-Routine noch nicht geschrieben, aber ich möchte eigentlich
nur eine Zahl (200) durch einen gemessenen Wert (0.1 - 200) dividieren
und dann das Resultat mit 3.6 multiplizeren.
Habe keine Ahnung ob das mit einer C-Routine funktionieren könnte..
Gruss
Wie du schon mitgekriegt haben wirst, ist das Einbinden einer
C-Funktion in ein Assembler Programm nicht so das wahre
(wenn ich mal die Methode "den Compiler ein Assemblerlisting
generieren lassen und dann abtippen" ausser acht lasse).
Anders rum ist das meist einfacher: Ein C Programm schreiben,
das in manchen Stellen auf Assembler Funktionen zurückgreift.
Allerdings erhebt sich bei mir bei deiner Aufgabenstellung
die Frage: Wozu brauchst du da überhaupt Assembler?
Matthias Lipinsky wrote:
> Und warum willst du gerade DAS STÜCK in C schreiben? Ich vermute, du> programmierst den Rest ja auch in ASM...
Hehe :-)
Meine Kristallkugel sagt: Weil er sich die Matheroutinen
ersparen will :-)
Mein Ausbildner wollte dass ich das ganze in Assembler schreibe, weil
ich bei meiner Teilprüfung in 2 Monaten auch Assembler programmieren
muss.
Eigentlech habe ich das ganze Programm, Geschwindigkeit an LCD anzeigen
und Zeit messen, in Assembler, aber die Berechnung kriege ich einfach
nicht genau hin, deshalb habe ich mir jetzt überlegt ob man das mit
einer C-Funktion machen kann.
Gruss
Wenn du y= 200 / x * 3.6 rechnen willst, mit x = 0.1 ... 200
würde ich folgendes Vorschlagen:
y = 7200 / x mit x= 1..2000
Damit umgehst du numerische PRobleme, sowie Kommazahlen.
Bei Anzeigen machst du einfach einen Punkt vor die letzte Stelle.
ZUr Rechnung kannst ja mal in den Anhang dieses Links gucken:
Beitrag "Re: Schnelle(re)s Quadrieren??"
Da nimmst du die Div Routine, rüfst die mit 7200 und x auf und fertig.
Florian wrote:
> Eigentlech habe ich das ganze Programm, Geschwindigkeit an LCD anzeigen> und Zeit messen, in Assembler, aber die Berechnung kriege ich einfach> nicht genau hinhttp://home.tiscali.de/peterd/appl/soft/arithmet/index.htm
Peter
Florian wrote:
> Mein Ausbildner wollte dass ich das ganze in Assembler schreibe, weil> ich bei meiner Teilprüfung in 2 Monaten auch Assembler programmieren> muss.> Eigentlech habe ich das ganze Programm, Geschwindigkeit an LCD anzeigen> und Zeit messen, in Assembler, aber die Berechnung kriege ich einfach> nicht genau hin, deshalb habe ich mir jetzt überlegt ob man das mit> einer C-Funktion machen kann.
Na ja. Das ist aber dann geschummelt.
Denn dein Ausbildner möchte dann ja haben, dass du ihm zeigst
dass du 16 Bit Arithmetik machen kannst.
> aber ich möchte eigentlich> nur eine Zahl (200) durch einen gemessenen Wert (0.1 - 200)> dividieren und dann das Resultat mit 3.6 multiplizeren.
Du willst also berechnen
200 / x * 3.6
das stellst du gleich mal etwas um
200 * 3.6 / x
die 200 * 3.6 kannst du gleich ausrechnen: das macht 720
Du musst also rechnen: 720 / x
Jetzt denke ich aus deiner Aufgabenstellung herausgelesen
zu haben, dass du die Zeit auf 1/10 Sekunden genau misst.
Und diese Kommastelle macht Probleme. Die Lösung: Verschiebe
das Komma um 1 Stelle. Das x hat dann die Einheit 1/10 Sekunde
Ein x Wert von 125 bedeutet also 12.5 Sekunden. Damit
wird deine Berechnung zu
7200 / x
Und du kommst mit einer stinknormalen 16 Bit Division gut über
die Runden.
@ Karl Heinz
>(wenn ich mal die Methode "den Compiler ein Assemblerlisting>generieren lassen und dann abtippen" ausser acht lasse).
Man muß nichts abtippen!
Als mißtrauischer Zeitgenosse sehe ich mir hin und wider an, was der
Compiler aus meinen Geschreibe generiert. Wenn etwas nicht optimal zu
sein scheint, kann man nachträglich optimieren. Hast Du so etwas nie
gemacht?
Aber gut, die aktuelle Codeerzeugung macht "Nachoptimierungen"
heutzutage entbehrlich.
Ich hab genau das oben genannte Problem. Ich will aus einem C- Programm
eine Assemblerroutine aufrufen. Diese besitzt keinerlei
übergabeparameter.Mein problem ist jetzt unter welchem Name ist die
Routie aufrufe bzw wie ich sie in eine Header einfüge.