Hallo. Ich muss ein C-Programm für einen 8bit-Mikrocontroller schreiben, das folgendes berechnet: c = Wurzel(a*a + b*b) prinzipiell ist alles klar. nur müssen follgende bedingungen erfüllt werden: es muss die Funktion sqrt() verwendet werden da program soll mit der adresse 2000h starten die variablen a und b sollen 2 byte lang sein und im Bereich 42h-43h liegen das Ergebnis c soll 3 byte lang sein und im Bereich 44h-46h es gibt noch einen temporary Bereich für zwischenergebniss: 47h-4Fh NUn ist meine frage: wie kann ich in C die festgelegten adressen für die Variablen und Ergebnisse festlegen?
> NUn ist meine frage: wie kann ich in C die festgelegten adressen für die > Variablen und Ergebnisse festlegen? Das steht in der Doku des Compilers... BTW: Welcher ist das denn überhaupt? Du kannst natürlich auch einfach drei Zeiger verwenden, die auf diese Adressen gebogen werden. Wie das geht steht in der Doku deines Compilers... > a und b sollen 2 byte lang sein Jeweils oder insgesamt? > und im Bereich 42h-43h liegen Dann kann es eigentlich nur jeweils 1 Byte sein... > das Ergebnis c soll 3 byte lang sein und im Bereich 44h-46h Warum ist dann das Ergebnis gleich 3 mal so lang?
Für die 2 Byte Variablen geht das etwa so: short * a = (short *) 0x42; short * b = (short *) 0x44; *a = 123; *b = 312; (Wie soll man 2x 2 Byte Variablen in einen 2 Byte großen Bereich speichern ?) Wenn die dritte Variable wirklich nur 3 Byte lang sein darf muss man dann etwas tricksen. char * c = (short *) 0x...; Und dann mit Hilfe von Verschieben in c[0], c[1], c[2] speichern.
ich verwende uVision und da ist, glaube ich, C51 compiler integriert. die jeweiligen Variablen sollen 2 Byte lang sein. Ich habe da falsch aufgeschrieben. Es muss heißen: Für Variable a: 1. Byte: 40h, 2. Byte 41h Für b: 1. Byte 42h, 2 Byte 43h also, wenn man diese Zeiger verwendet, heißt das, dass man die Bytes einzeln aus dem Speicher holen muss, um die Wurzel berechnen zu lassen? Sehe ich das richtig?
Du solltest erst mal richtig C lernen, bevor du ein Programm mit
dermaßen kruden Vorgaben schreibst. (Und wenn du es gut kannst, wirst du
vermutlich von solchem Unsinn Abstand nehmen.)
> es gibt noch einen temporary Bereich für zwischenergebniss: 47h-4Fh
Wenn sqrt auch diesen temporären Bereich benutzen soll, dann wirst du
die wohl selbst schreiben müssen...
Uhu Uhuhu schrieb: > Du solltest erst mal richtig C lernen, bevor du ein Programm mit > dermaßen kruden Vorgaben schreibst. Ja, ich vermute mal das ist Informatik/Mikrocontrollertechnik im Studium, da sind solche Vorgaben schon mal sehr realistisch ;) Was die allerdings mit der heutigen Realität zu tun haben, kann (konnte) ich auch nicht nachvollziehen.
Simon K. schrieb: > Ja, ich vermute mal das ist Informatik/Mikrocontrollertechnik im > Studium, da sind solche Vorgaben schon mal sehr realistisch ;) Was die > allerdings mit der heutigen Realität zu tun haben, kann (konnte) ich > auch nicht nachvollziehen. Was sind das für Dozenten, die sich solchen Krampf ausdenken? Professionell ist das nicht. Wenn sowas tatsächlich gemacht werden muß, würde ich ASM nehmen. Da ist alles kontrollierbar.
Also wenn die Aufgabe wirklich lautet, 1. das Programm in C zu schreiben, und 2. die Variablen an bestimmten Adressen zu haben, dann hat derjenige, der die Aufgabe gestellt, den Schuß nicht mehr gehört. Abgesehen davon kann sqrt() aus der Standard-Lib nichts mit ganzen Zahlen anfangen, egal wieviele Bytes. Wie sagten mein Großeltern immer so schön: Unser Herrgott hat einen großen Tiergarten...
@UhuUhuhu & Klaus : ey, jungs! wo ist denn das problem?? OK. in assembler kann man das alles gganz gut machen. warum nicht in C? wieso darf man so was nicht ausprobieren? ich baue doch keinen raumschif ich lerne doch nur?
Ausprobieren darfst du es natürlich. Aber wenn du dann auch noch meinst, hier fragen zu müssen, dann machst du definitiv was falsch...
... da program soll mit der adresse 2000h starten ... Arbeitest du mit der EVA-Version von Keil?
Das erste Problem ist, dass man in C Variablen nicht an bestimmte Adressen legt, dafür gibt es den Compiler, dafür wurde er (unter anderem) erfunden. Und die Zeigerverbiegerei oben ist mehr ein Hack als eine Lösung und verleitet zu schlechtem Programmierstil.
metallman schrieb: > @UhuUhuhu & Klaus : > > ey, jungs! wo ist denn das problem?? > > OK. in assembler kann man das alles gganz gut machen. warum nicht in C? > wieso darf man so was nicht ausprobieren? ich baue doch keinen raumschif > ich lerne doch nur? Das war auch kein Vorwurf an dich; die Aufgabenstellung ist krank. (Es wäre ein Vorwurf an dich, wenn die Aufgabe von dir käme...) Wenn die Aufgabe nun mal so ist, habe ich auch kein Problem, wenn du hier um Rat fragst, wenn du nicht weiter kommst. Aber Mist bleibt Mist, das muß man dann auch so sagen können. Warum es Schwachsinn, hat Simon schon gesagt, außerdem die Geschichte mit sqrt(), das für double ist und nicht für ganze Zahlen.
Ich könnte ja noch verstehen, wenn sich der Lernende ein Verfahren zur Wurzelberechnung für ganze Zahlen überlegen soll. Aber so, mit diesen Vorgaben, ist das einfach nur relaitätsfremd. Die Aufgabenstellung hat so keinen praktischen Wert.
Okay, zugegeben genau das ist mir so in den 2 Semestern mit Programmierung (PC und Mikrocontrollertechnik in diesem/letzten Jahr) noch nicht passiert, aber ne Menge anderer komischen Sachen, die nicht Standardkompatibel waren oder die man ohne Probleme als Hack bezeichnen konnte. Das war Gang und gebe bei uns im vorletzten/letzten Semester und lief auch mit genau dem Compiler glücklicherweise. Als das schlimmste habe ich immer empfunden, das den Kollegen erklären zu müssen, die sich immer mal an mich gewandt haben und gefragt haben, wo der Sinn bei diesem und jenem ist. Und da ich das korrekt machen will, musste ich sie dann aufklären, was daran Hack ist, warum und wie man es besser macht. Dadurch waren die natürlich schnell überfordert und verwirrt, eben wegen meinem Drang alles möglichst korrekt machen zu wollen ;) Waren ja auch teilweise Leute die damit das Erste mal zu tun haben. Von daher ist es im Studium auf kurze Sicht gesehen besser, wenn man Hacks benutzt und den Studenten sagt "ist so". Wenn man das nicht machen würde, wäre der Stoff gar nicht zu schaffen in einem Semester. Auf lange Sicht aber haben die nichts davon. Das zu der "Notwendigkeit" von solchen komischen Sachen. Okay, mit dem Beispiel hier hat das eher nichts zu tun, aber es gibt genug andere gleichartige komische Aufgabenstellungen würde ich mal vermuten. Ich hab das Programmieren auch nicht in 6 Monaten gelernt, sondern eher in locker 6 Jahren mittlerweile (früh angefangen ;)). Wobei ich jetzt hiermit nicht behaupten möchte fertig zu sein mit dem Lernprozess. Dazu wird es nie kommen. C komplett in einem Semester zu machen ist meiner Meinung nach krank und zeugt ebenfalls von Realitätsfremdheit. Programmieren lernt man durch Programmieren und durch schauen wie andere (mit viel Erfahrung) etwas gelöst haben und dann Vergleiche zur eigenen Lösung zu ziehen. Aber was will man machen ;) Achso, man sollte auch noch dazu sagen, dass die meisten Dozenten aus der Anfangszeit der 8051er stammen. Da war das Thema Compiler ja noch nicht so ein großes Ding. Die Features eben dieser hielten sich in Grenzen, weswegen manche Sachen durchaus normal waren damals, die man heute so nie mehr machen würde, weil der Compiler bereits eigene, bessere, Funktionen/Deklarationen/Wasauchimmer zur Verfügung stellt. Ich sag nur uint8_t vs char. "Hä, char ist doch für Zeichen, wurde vorhin gesagt, wieso wird jetzt damit gerechnet?" :-( So, bisschen OT, wo waren wir :-) Wir hatten damals auch den C51 Compiler im Studium, gab es da nicht eine Möglichkeit Variablen direkt bei der Deklaration an bestimmte Adressen zu verpflanzen?
wie auch immer.. dann laß ich halt den scheiß sein. @ Simon: Wie hast du denn programmieren gelernt? Gibt es eine lernmethodik um erfolgreich C zu lernen?
metallman schrieb: > wie auch immer.. dann laß ich halt den scheiß sein. > > > @ Simon: > > Wie hast du denn programmieren gelernt? Gibt es eine lernmethodik um > erfolgreich C zu lernen? Kernighan&Ritchie lesen. Die Übungen im Buch machen. Und dann: üben, üben, üben. Nach einiger Zeit fremde Programme studieren. Richtig studieren, nicht einfach abschreiben, sondern vergleichen, die Idee hinter dem Programm rausfinden, Techniken lernen. etc. Und dann natürlich noch: üben, üben, üben
Wenn du es machen musst, also die Aufgabe dazu bekommen hast, kannst du es ja schlecht sein lassen :-) Kannst ja mit den vorhandenen Informationen erst mal selber versuchen was zusammenzustricken. Dadurch legst du mal selber Hand an und das ist der erste Schritt dazu ein Gefühl für das Programmieren zu kriegen. Wie gesagt, Um Programmieren zu lernen hilft nur Programmieren. Sich irgendwelche Aufgaben stellen und mal überlegen wie man da ran gehen könnte. Für die C Syntax und die Basics auf jeden Fall ein Buch kaufen (Den Klassiker von Ritchie und Kernighan) oder in diversen Tutorials stöbern: http://openbook.galileocomputing.de/c_von_a_bis_z/ Hauptsache du fängst irgendwie an zu programmieren. Dann mit fertigen Programmen andere Leute fragen, was man verbessern könnte. Dafür finden sich immer Leute wenn du mal hier im Forum fragst, sowas ist in der Regel kein Problem. Und wenn du dabei sagst, dass du das Programm aus eigenem Interesse "optimieren" lassen willst durch die Forumsuser, dann kommt das sicher nicht negativ rüber ;) Es kommt jedenfalls besser rüber, als nach der Lösung eines Problems zu fragen, ohne mal selber sich Gedanken gemacht zu haben (Ist jetzt nicht böse gemeint. Gerade als Anfänger ist man schnell mal überfordert, habe ich ja auch gemerkt bei meinem Amt als "ehrenamtlicher Nachhilfelehrer" im Studium :-) ;)). @Karl Heinz: Sag nicht "üben", das hört sich nach Schule und unangenehmer Arbeit an ;) (Auch wenn ich jetzt kein alternatives Wort weiß :-)). Wenn das eigene Interesse am Programmieren-wollen groß genug ist, dann ist es eher einer netter Zeitvertreib und kann durchaus Spaß machen. Übrigens, Programmieren lernen geht in der Regel am PC besser, da man hier bessere Debug Möglichkeiten hat (Also der Ausführung des Programms durch den Prozessor "zuzusehen", Inhalte von Variablen zu überprüfen und dergleichen). Wenn man dann mit Mikrocontrollern anfängt sollte man eine Ahnung davon haben, wo Stolperfallen liegen, die man so ohne weiteres gar nicht so leicht finden würde auf einem Mikrocontroller. Zum Beispiel Speicherbereichsübertretungen. Der PC gibt dir sofort eine Fehlermeldung an den Kopf. Der Mikroprozessor macht nichts, macht komische Sachen oder startet neu.
Simon K. schrieb: > @Karl Heinz: Sag nicht "üben", das hört sich nach Schule und > unangenehmer Arbeit an ;) OK. Kritik angekommen :-)
Da hat der Troll metallman ja eine richtige Grundsatzdebatte losgetreten. Ob er der auch folgen 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.