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...
Momentan habe ich das Microsoft Visual Studio 2005 zur verfügung...
Florian wrote: > Momentan habe ich das Microsoft Visual Studio 2005 zur verfügung... Und da kann man wirklich als Target den 8051 auswählen? Peter
moin moin, @Florian, poste mal die C-Function, mal sehen wozu die notwendig ist. Pieter
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
Klingt nach ner Geschwindigkeitsmessung, wo eine Zeit für einen Weg von 200 ermittelt wird und das dann auf km/h umgerechnet werden soll....
Und warum willst du gerade DAS STÜCK in C schreiben? Ich vermute, du programmierst den Rest ja auch in ASM...
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 hin http://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.
Okee, danke für die Antworten. Werde es mal so probieren=) Gruss
@ 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.
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.