Forum: Compiler & IDEs Zwei Programme zusamenfügen - über Präprozessor?


von André C. (clausi)


Lesenswert?

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!

von Dr. Sommer (Gast)


Lesenswert?

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.

von cppler (Gast)


Lesenswert?

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 ;-)

von Timmo H. (masterfx)


Lesenswert?

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.

von Amateur (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von hmm.. ? (Gast)


Lesenswert?

"zusamenfügen" ?

von Mirco C. (Firma: s@Td) (mcontroller)


Lesenswert?

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.

von André C. (clausi)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von Amateur (Gast)


Lesenswert?

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.

von André C. (clausi)


Lesenswert?

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...

von Werner M. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.