Hallo Zusammen Möchte auf meinem Atmel8051 einen Teil eines Programmes in C schreiben. Die Daten die ich in dem C Teil bearbeiten möchte liegen im externen Speicher. Leider habe ich noch nicht herausgefunden wie ich die Daten in ein Array bekomme um mit ihnen zu arbeiten.Kann mir da jemand weiterhelfen? Gruß Daniel
Ich bin zwar kein Softwarefreak, aber ich würde es mal mit einem Pointer auf die betreffende Speicheradresse versuchen ;-)
OK werde das mal versuchen. Noch ein Problem. Möchte den in C geschriebenen Teil von meinem Hauptprogramm aus aufrufen. Also ne A51 Datei daraus machen und einbinden. Das mit der A51 Datei bekomme ich hin. Aber normalerweiße beginne ich meine "Unterprogramme" ja mit z.B. berechnung: und beende sie mit ret muß ja so was Ähnliches jetzt auch in mein C-Teil einbauen was mir aber nicht richtig gelingen mag. OK das mit dem pointer hätte mir selber einfallen können muß ich schon zugeben.
Das Programm ist noch in Arbeit. Bin am testen wie ich wenn ich aus dem C Programm eine A51 Datei gemacht habe diese mit einem lcall aufrufen kann. Habe schon viel versucht aber das richtige war noch nicht dabei. Zum Pointer ist mir auch noch was eingefallen. Die Daten liegen im eingebauten 2k Speicher (externer Speicher) dieser ist wenn ich mich nicht irre Adressparallel zum Internen. In Assembler muß ich ja auch mit movx arbeiten. Also wie sage ich dem Pointer das er auf den externen Speicher zeigt. Gruß
Beide Speicher fangen bei 00h an und werden durch die Art des zugriffs Unterschieden intern mit mov externer Speicher mit movx.
Les doch einfach mal die Doku zu deinem Compiler/Linker. Deine Fragen sollten darin beantwortet werden, wenn nicht such dir einen Compiler/Linker mit anständiger Dokku. Generell gesagt musst du dich bei C nicht um Speicherzuweisungen, ret, Registerrettung,... kümmern. Das macht der Compiler. Es gibt schon Spezialfälle wo du es doch tun musst, aber 99,x% deines C-Codes haben mit solchen Dingen nichts zu tun. Ansonsten könntest du ja auch bei Assembler bleiben. Ich würde das ganze anderst angehen. ==> Das ganze Programm in C und nur die wenigen direkten Hardwarezugriffe die unumgänglich sind in Assembler. Und da wenn möglich InlineAssembler.
Leider geht das nicht habe einen großteil meiner Unterprogramme schon fertig. Alles in Assembler (mit Keil uVision3). Hatte mir das am Anfang mit C überlegt. Da ich meine Datenerfassung am Port zeitlich an ein paar Steuersignale koppeln musste und das Timing ziemlich eng ist habe ich mich für Assembler entschieden weil ich nicht wußte wie das C Programm umgesetzt wird und ob die laufzeit dann passt damit ich kein Signal verpasse.Jetzt muß ich versuchen mit einem C File eine A51 Datei zu erstellen die ich dann einbinden kann und mit LCALL aufrufen kann. Weiß nicht genau wie das geht. Muß ja irgendwo im C File was stehen haben das mein Hauptprogramm findet und dorthin springt. Also so wie bei den anderen Unterprogrammen name: und dann mit ret beendet. Das nächste Problem ist mein Externer Speicher muß in C den 16Bit Datenpointer meinés Atmel 8051 ansprechen weil dort meine Messdaten liegen.Keine Ahnung wie das geht. Also einen normalen Pointer bekomme ich schon hin haber eben keine Ahnung wie das mit dem dptr geht. Gruß
Wieder einer der glaubt besser in Assembler zu sein als ein C-Compiler! Der Keil-C ist echt gut. Leider den Ansatz falsch gewählt. So wird das mühsam bis unmöglich.
Daniel schrieb: > Leider geht das nicht habe einen großteil meiner Unterprogramme schon > fertig. Dann hast du dein Projekt schlecht geplant. ZU früh mit dem Coden angefangen, zu wenig Überlegung in die Vorbereitung gesteckt. Lehrgeld, das wir alle zahlen mussten und müssen. Jetzt bist du drann mit Lehrgeld zahlen. > Alles in Assembler (mit Keil uVision3). Hatte mir das am Anfang > mit C überlegt. Da ich meine Datenerfassung am Port zeitlich an ein paar > Steuersignale koppeln musste und das Timing ziemlich eng ist habe ich > mich für Assembler entschieden weil ich nicht wußte wie das C Programm > umgesetzt wird und ob die laufzeit dann passt damit ich kein Signal > verpasse. Das wäre mit einiger Sicherheit in C genauso machbar gewesen. Warum hast du keine Vorversuche in C gemacht? Aber selbst dann hättest du dein Programm in C machen sollen und die eventuell zeitkritischen Dinge, so sie in C tatsächlich nicht machbar wären, in Assembler auslagern. > Jetzt muß ich versuchen mit einem C File eine A51 Datei zu > erstellen die ich dann einbinden kann und mit LCALL aufrufen kann. > Weiß nicht genau wie das geht. Muß ja irgendwo im C File was stehen > haben > das mein Hauptprogramm findet und dorthin springt. Also so wie bei den > anderen Unterprogrammen name: und dann mit ret beendet. Du zäumst das Pferd falsch auf. C ist darauf angewiesen, dass der µC beim Hochfahren bestimmte Dinge tut. Da müssen Sachen initialisiert werden. Da müssen Funktionsaufrufkonventionen eingehalten werden, da müssen Registerkonventionen eingehalten werden. Unter der Motorhaube muss der Compiler für Ordnung in seinem Abreitsbereich sorgen. Er tut dies, indem er sich streng an gewissen Konventionen hält. Es ist schon unangenehm genug, sich an diese Konventionen zu halten, wenn Assembler Routinen von C aus aufgerufen werden. Aber umgekehrt, von einem Assemblerprogramm aus die Umgebung zu herzustellen, dass die C-Funktion übernehmen kann, das kann sich zu einer Sysiphusarbeit ausarten.
Das kann sein das es nicht gerade Optimal geplant war. Hatte mega Ärger mit der Hardware und stand bzw. stehe unter Zeitdruck aber so richtig unter Zeitdruck. Naja wußte wie ich aus dem C File eine A51 Datei mache nur der Aufruf von meinem Hauptprogramm mit LCALL war unklar. Aber: Ich Trottel hab doch dann ne A51 Datei und kann doch da noch was einfügen und die dann einbinden.
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.