Hallo Leute, nun ist mal der Fall eingetreten, dass ich mit Google keine Lösung gefunden habe. Ich habe zwei funktionierende Programme und möchte diese zusammenfügen. Dabei handelt es sich um fertige Programme die ich angepasst habe und Funktionen hinzugefügt habe. Die beiden Programme haben jedoch das gleiche Grundgerüst und haben einige Definitionen, Funktionen und Variablen die den gleichen Namen haben, aber unterschiedlich sind. Wie mache ich das denn nun am besten? Ich habe mir überlegt ein Programm durch den Präprozessor zu jagen und diesen dann in das andere einzufügen, aber nun weiß ich nicht wie ich das im AVR Studio 4 mache. Ich habe zwar schon rausgefunden, dass man das mit "-E" macht, aber wo trage ich das denn ein? Grobe Funktion: Wird beim Programmstart eine Taste gedrückt meldet sich der µC als Virtual-Com am PC an, ansonsten als HID-Eingabegerät. Meine erste Hoffnung war das eine Programm in den Bootsektor zu stecken, aber da bekomme ich nicht alle Funktionalitäten unter :-( Das ganze soll am Ende auf einen Atmega168. Schonmal Danke im Vorraus!
Kopiere den Inhalt der Quellcode-Datei des einen Programms in die Quellcode.Datei des anderen Programmes (mit einem Texteditor). Wenn das nicht geht bzw. das Ergebnis nicht funktioniert, geht es mit dem Präprozessor auch nicht.
Dr. Sommer schrieb: > Kopiere den Inhalt der Quellcode-Datei des einen Programms in die > Quellcode.Datei des anderen Programmes (mit einem Texteditor). Wenn das > nicht geht bzw. das Ergebnis nicht funktioniert, geht es mit dem > Präprozessor auch nicht. Bevor Du den richtigen Ansatz durchführst ersetze in einem der beiden zusammenzuführenden Programmtexte die identischen Variablen und Funktionen gegen neue, wenn's schön macht von mir aus auch i2, i3 und i4 :-P Du sparst Dir eine Menge arbeit damit ;-)
Du hast jetzt also quasi zwei "main"-Funktionen. Mach doch einfach eine "start_hid()" und eine "start_vcp()" draus. Dann machst du ein neues Projekt mit einer "main" wo du dann den Taster abfragst und je nach Zustand des Tasters "start_hid" oder "start_vcp" startest.
Die meisten Compiler haben Schalter, die die Ausgabe der verwendeten Namen, Labels usw. aus dem Sourcecode erzwingen. Am besten lädst Du dazu die zu ändernde Datei in die Entwicklungsumgebung und lässt Dir dann die jeweils existenten Referenzen eines Namens anzeigen um diese zu ändern. Manche Editoren bieten nämlich die Möglichkeit alle Referenzen zu einem angegebenen Namen aufzulisten. Auch die in inkludierten Dateien.
Probleme mit den Namen lassen sich natürlich durch massive Umbennungen realisieren. Ob nun per Präprozessor, oder manuell. Eine Alternative wäre freilich, den Kram kaum verändert als C++ zu übersetzen und die beiden Teile in getrennte Namespaces zu verpacken. Was zuverlässig verhindert, dass du die Programme ohne Arbeit einfach nebeneinander klebst, sind jedoch die Interrupts. Denn einen IRQ-Handler gibts pro Quelle nur einmal. Mindestens dort hast du Arbeit, um jeden einzelnen Vektor in die beiden eigentlichen Handler weiterzuvermitteln.
Ich würde auch darauf tippen das du mit den beiden mains Probleme bekommst, gerade wenn irgendwo in den beiden Programmen eine Entlosschleife ist. Ich würde die nötigen Teile zusammenkopieren und dann die Schleifen in der main entsprechend anpassen.
erstmal danke für die vielen Antworten! Ich war heute in einem Funkloch bei den Schwiegereltern ;-) Wie es aussieht werde ich wohl an der Fleißarbeit nicht vorbeikommen. Das umschalten im Main ist nicht das Problem, das habe ich schon im ersten Arbeitseifer zusammengefügt mit nem if und else. Das mit den Endlosschleifen ist kein Problem, da immer nur beim Start entschieden wird welcher Teil ausgeführt werden soll, dann bleibt das gewählte Programm bis die Betriebsspannung wieder weg ist. Wie schon gesagt, die beiden Programme sind fast identisch, aber werden so konfiguriert das einmal ein HID-Gerät und einmal eine COM-SS entsteht. Das ist echt eine Schweinearbeit bei der ich mich bei den vielen Suchtreffern schon 1 2 mal im Kreis gedreht habe... Ich habe mir das so vorgestellt dass der Präprozessor bei einem Programm alle Definitionen in die richtige Stelle einsetzt und ich dass dann an die richtigen Stellen im zweiten Programm reinkopieren kann. Hat denn nicht noch jemand eine rettende Idee für mich? :-) Oder hat es jemand schonmal geschafft die Interrupt-Vektoren so zuverändern, dass ich die Programme an verschiedene Stellen im µC laden kann und die Interrups trotzden funktionieren? Eigentlich gibt es ja nur die Bits zum Umschalten der Vektoren auf den Bootsektor.... So wollte ich das Problem ursprünglich lösen, aber leider bin ich da gescheitert... In den Bootsektor passt das ganze leider nicht.
André C. schrieb: > Oder hat es jemand schonmal geschafft die Interrupt-Vektoren so > zuverändern, dass ich die Programme an verschiedene Stellen im µC laden > kann und die Interrups trotzden funktionieren? Eigentlich gibt es ja nur > die Bits zum Umschalten der Vektoren auf den Bootsektor.... So wollte > ich das Problem ursprünglich lösen, aber leider bin ich da > gescheitert... In den Bootsektor passt das ganze leider nicht. Die Vektoren kannst du nicht beliebig verändern. Nur App/Boot. Wie lang ist denn das kleinere der beiden Programme? Der Bootsektor des 328 ist doppelt so groß wie der des 168. Also 4K. mfg.
Sehr viel Arbeit wirst Du wohl auch in die Unikate stecken müssen. Manche Schnittstellen, Ports oder Unterbrechungen gibt’s nun mal nicht im Doppelpack. Ob Du dann tatsächlich Zeit, gegenüber dem Neuschreiben des Zusatzes, gespart hast, ist eine ganz andere Frage. Ich zumindest schaue beim Programmieren danach, was zur Verfügung steht und nicht danach, was ich jemand anderen übrig lassen kann. Wenn ich also zwei Zeiten benötige und zwei Timer habe, so nutze ich diese und versuche nicht einen für beide Zeiten zu verwenden.
Also die Idee mit dem Atmega328 hat mich ja kurzzeitig jubeln lassen, aber leider hat dann meine Recherche nicht das gleiche ergeben :-( (http://www.rn-wissen.de/index.php/Atmel_Controller_Mega48_Mega88_Mega168) Die Bootsektorgröße wird leider fast nie erwähnt und die eine Quelle die ich gefunden habe spricht auch von 2kB... was hat er nun? ... 4k würden mir lässig reichen, habe meinen Code schon dank Pointer auf 2073Byte reduziert, aber mehr war nich drin und mir sind schonwieder Funktionen eingefallen die ich noch vergessen habe...
André C. schrieb: > Die Bootsektorgröße wird leider fast nie erwähnt und die eine Quelle die > ich gefunden habe spricht auch von 2kB... was hat er nun? Dann guck doch einfach mal ins Datenblatt - der Geheimtip! Im Abschnitt 27.8.16 ATmega328 and ATmega328P Boot Loader Parameters steht, dass der Bootbereich sich zwischen 256 Worten und 2048 Worten einstellen läßt, was dann nach Adam Riese auf 4kB hinausläuft.
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.