Forum: Mikrocontroller und Digitale Elektronik Beim AVR-Studio zwei Projekte "verschmelzen"


von Nico (Gast)


Lesenswert?

Hallo,
beim AVR-Studio sollen zwei C-Projekte zusammengefasst werden.

Der Übersichlichkeit halber habe ich die Main-Datei vom kleineren 
Projekt in den Ordner "Source Files" vom größeren Projekt gepackt und 
die Main-Datei vom kleineren Projekt in
1
int projekt_klein(void)    //vorher: int main(void)
umbenannt.

Wenn ich aber
1
projekt_klein(void);
von der Main-Datei aus dem größeren Projekt aufrufe, wird die nicht 
ausgeführt.
Woran kann das liegen?

(es sind nebenbei gesagt auch noch zwei h.Dateien beteiligt)

von Theor (Gast)


Lesenswert?

Es wird vermutlich hilfreich sein, falls Du die Projektdatei in einem 
neuen Beitrag anhängst, sowie die evtl. Fehlermeldungen und Warnungen, 
die beim Compilieren auftreten.

"AVR-Studio" nannte die Projektdateien "*.aps".

Ich verweise ausdrücklich auf das von Dir in der Überschrift genannte 
"AVR-Studio", denn ich weiß nicht, wie das aktuellere "Atmel Studio" 
seine Projektdateien nennt. (Ich habe allerdings auch keinen 
Anhaltspunkt, dass die Dateiendung geändert wurde).

von Nico (Gast)


Lesenswert?

Fehlermeldungen und Warnungen beim Compilieren gibt es nicht, da ist 
alles ok.

Ich habe die main.c-Datei (nach Umbenennung in ber_uart.c) und die 
zugehörige.h Datei (ohne Umbenennung) vom kleineren Projekt in den 
Projektordner vom größeren Projekt kopiert und dann nach Starten der 
.apd-Datei vom größeren Projekt in dieses die beiden Neulinge 
eingebunden:


Kleines Projekt:
main.c -umbenannt-> ber_uart.c
uart.h

Dann die beiden Dateien in den Projektordner vom großen Projekt 
verschoben.

Dann das große Projekt gestartet und dort folgendes eingebunden:
ber_uart.c in Source Files (dort ist auch die main.c vom großen Projekt 
untergebracht)
uart.h in Header Files


Code hier veröffentlichen geht leider nicht ohne weiteres, bin nur 
Teilautor.

von Theor (Gast)


Lesenswert?

Nico schrieb:
> Fehlermeldungen und Warnungen beim Compilieren gibt es nicht, da ist
> alles ok.

Aha. OK. Nur der Vollständigkeit halber die Frage, welchen Warnlevel Du 
eingestellt hast. Am besten wäre m.M.n. "-wall".

> [...]

> Code hier veröffentlichen geht leider nicht ohne weiteres, bin nur
> Teilautor.

Das macht die Sache nun nicht gerade einfacher. :-)

Irgendwelche konkreten Anhaltspunkte (jenseits der bloßen Namen der 
Dateien) sind aus meiner Sicht notwendig.
Das soweit von Dir geschilderte Vorgehen allein kann eine Fehlfunktion 
jedenfalls nicht erklären.

Allenfalls könnte man vermuten, dass beide "Teilprogramme" jeweils die 
gleichen Peripherieeinheiten benutzen oder zwar verschiedene, aber 
solche deren Funktion sich ggs. beeinflusst.

Aber auch die beschreibung: "... wird die [Funktion] nicht ausgeführt." 
ist nicht hilfreich. Zumal das prinzipiell eher fragwürdig ist. Eine CPU 
kann sich nicht "weigern" eine Funktion auszuführen.

von Theor (Gast)


Lesenswert?

Ein Ansatzpunkt wäre noch, das Programm im Simulator zu untersuchen. 
Oder, falls vorhanden, mit einem Emulator wie "Atmel ICE".

von Stefan F. (Gast)


Lesenswert?

Nico schrieb:
> von der Main-Datei aus dem größeren Projekt aufrufe, wird die nicht
> ausgeführt.

Was genau heißt "wird die nicht ausgeführt"? Wenn das Programm 
compilierbar ist, dass ist der Code auch ausführbar. Es sei denn, du 
hast einen Fehler der dazu führt, dass das Programm vorher hängen bleibt 
oder eine Bedingung (if) die nie erfüllt wird.

von Nico (Gast)


Lesenswert?

Hier schon mal Danke für deine Hilfe!

Theor schrieb:
> Aha. OK. Nur der Vollständigkeit halber die Frage, welchen Warnlevel Du
> eingestellt hast. Am besten wäre m.M.n. "-wall".

-Wall ist eingestellt.


Theor schrieb:
>> Code hier veröffentlichen geht leider nicht ohne weiteres, bin nur
>> Teilautor.
>
> Das macht die Sache nun nicht gerade einfacher. :-)

Allerdings. Das größere Programm ist zudem noch sehr umfangreich.


Aber grundsätzlich ist an der oben beschriebenen Vorgehensweise schon 
mal nichts auszusetzen, wenn ich das richtig verstehe?!


> Allenfalls könnte man vermuten, dass beide "Teilprogramme" jeweils die
> gleichen Peripherieeinheiten benutzen oder zwar verschiedene, aber
> solche deren Funktion sich ggs. beeinflusst.

Gute Frage. Ein paar include#-Dateien sind doppelt, das bügelt der 
Compiler normalerweise einfach weg.


> Aber auch die beschreibung: "... wird die [Funktion] nicht ausgeführt."
> ist nicht hilfreich. Zumal das prinzipiell eher fragwürdig ist. Eine CPU
> kann sich nicht "weigern" eine Funktion auszuführen.
Kurz gesagt habe ich in der "main-Funktion" des kleineren Projekts alles 
deaktiviert, was mit Berechnungen zu tun hat und darauf reduziert, dass 
nach dem Aufruf nur eine Variable als Endlosschleife über den UART 
ausgegeben wird und sich eine LED einschaltet. Das passiert aber nicht. 
Daher gehe ich davon aus, dass die Funktion gar nicht erst aufgerufen 
wird.

von Stefan F. (Gast)


Lesenswert?

Nico schrieb:
> -Wall ist eingestellt.

Und, wie lauten die Warnungen?

> Ein paar include#-Dateien sind doppelt, das bügelt der
> Compiler normalerweise einfach weg.

Wie bitte? Woher soll der Compiler wissen, welche der doppelten Dateien 
die richtigen sind?

> Kurz gesagt

Das geht so nicht. Lege uns den ganzen Quelltext vor, so dass wir das 
Problem nachvollziehen können.

von Theor (Gast)


Lesenswert?

Nico schrieb:
> Hier schon mal Danke für deine Hilfe!
>
> Theor schrieb:
>> Aha. OK. Nur der Vollständigkeit halber die Frage, welchen Warnlevel Du
>> eingestellt hast. Am besten wäre m.M.n. "-wall".
>
> -Wall ist eingestellt.
>
>
> Theor schrieb:
>>> Code hier veröffentlichen geht leider nicht ohne weiteres, bin nur
>>> Teilautor.
>>
>> Das macht die Sache nun nicht gerade einfacher. :-)
>
> Allerdings. Das größere Programm ist zudem noch sehr umfangreich.
>
>
> Aber grundsätzlich ist an der oben beschriebenen Vorgehensweise schon
> mal nichts auszusetzen, wenn ich das richtig verstehe?!
>
>
>> Allenfalls könnte man vermuten, dass beide "Teilprogramme" jeweils die
>> gleichen Peripherieeinheiten benutzen oder zwar verschiedene, aber
>> solche deren Funktion sich ggs. beeinflusst.
>
> Gute Frage. Ein paar include#-Dateien sind doppelt, das bügelt der
> Compiler normalerweise einfach weg.

"Wegbügeln" in gewissen Fällen schon. Aber was nicht per 
Sprachdefinition redundant ist oder sich auslöscht, sollte, falls etwa 
widersprüchliche Deklarationen vorliegen, zu Warnungen führen.

>
>> Aber auch die beschreibung: "... wird die [Funktion] nicht ausgeführt."
>> ist nicht hilfreich. Zumal das prinzipiell eher fragwürdig ist. Eine CPU
>> kann sich nicht "weigern" eine Funktion auszuführen.
> Kurz gesagt habe ich in der "main-Funktion" des kleineren Projekts alles
> deaktiviert, was mit Berechnungen zu tun hat und darauf reduziert, dass
> nach dem Aufruf nur eine Variable als Endlosschleife über den UART
> ausgegeben wird und sich eine LED einschaltet. Das passiert aber nicht.
> Daher gehe ich davon aus, dass die Funktion gar nicht erst aufgerufen
> wird.

OK. Das ist aber im Grunde eine "Vermutung".
Und selbst wenn Du diese Vermutung für realistisch hältst, hilft Dir 
das nicht weiter. Du musst ja offenbar den Code an irgendeiner Stelle 
ändern, damit sich das Programm wie gewünscht verhält. Und weder für die 
Stelle dieser Änderung noch für die Art der Änderung ergibt Deine 
Beschreibung einen Anhalstpunkt.

Ein klarer Beleg für die Vermutung wäre, falls die Funktion tatsächlich 
nicht aufgerufen wird. Das könntest Du belegen, in dem Du in der 
aufzurufenden Funktion einen Breakpoint im Simulator setzt.

von Nico (Gast)


Lesenswert?

Jedenfalls hier die Main-Funktion vom größeren Programm, teilweise 
schematisch.
1
int main 
2
{
3
    //jede Menge Initialisierungskram/Konfigurierungskram/Registerzieherei
4
5
    while(1) //Hauptprogrammschleife
6
    {
7
         // *** alles andere hier in der Hauptprogrammschleife deaktiviert
8
        int projekt_klein(void); //hier wird die Hauptfunktion im anderen c-Sheet aufgerufen
9
        _delay_ms(100);
10
    }
11
12
return 0 ;
13
}

von Stefan F. (Gast)


Lesenswert?

Nico schrieb:
> int main {...}

So fäng keine main Funktion an.

> int projekt_klein(void); // hier wird die Hauptfunktion im anderen c-Sheet 
aufgerufen

Nein, das ist kein Funktionsaufruf.

Das Programm ist noch nicht einmal compilierbar. Warum ignorierst du die 
Fehlermeldungen des Compilers?

von Nico (Gast)


Lesenswert?

Theor schrieb:
> OK. Das ist aber im Grunde eine "Vermutung".
> Und selbst wenn Du diese Vermutung für realistisch hältst, hilft Dir
> das nicht weiter. Du musst ja offenbar den Code an irgendeiner Stelle
> ändern, damit sich das Programm wie gewünscht verhält. Und weder für die
> Stelle dieser Änderung noch für die Art der Änderung ergibt Deine
> Beschreibung einen Anhalstpunkt.
>
> Ein klarer Beleg für die Vermutung wäre, falls die Funktion tatsächlich
> nicht aufgerufen wird. Das könntest Du belegen, in dem Du in der
> aufzurufenden Funktion einen Breakpoint im Simulator setzt.

Du hast völlig recht, irgendwie muss man das Problem sicher einkreisen.

Habe noch nie mit dem Simulator gearbeitet.
https://www.mikrocontroller.net/articles/AVR-Simulation
Dann würde ich mir das hier mal anschauen.

von Stefan F. (Gast)


Lesenswert?

Simulieren ist sinnlos, solange das Programm nicht compiliert ist. Dann 
simuliert man nämlich nichts.

von Nico (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Simulieren ist sinnlos, solange das Programm nicht compiliert ist. Dann
> simuliert man nämlich nichts.

Dann gib mal Butter bei die Fische, warum ist das Programmfragment 
deiner Meinung nach nicht kompilierbar?

Mein Compiler sagt nämlich Build succeed with 0 warnings.

von Theor (Gast)


Lesenswert?

Nico schrieb:
> Theor schrieb:
>> OK. Das ist aber im Grunde eine "Vermutung".
>> Und selbst wenn Du diese Vermutung für realistisch hältst, hilft Dir
>> das nicht weiter. Du musst ja offenbar den Code an irgendeiner Stelle
>> ändern, damit sich das Programm wie gewünscht verhält. Und weder für die
>> Stelle dieser Änderung noch für die Art der Änderung ergibt Deine
>> Beschreibung einen Anhalstpunkt.
>>
>> Ein klarer Beleg für die Vermutung wäre, falls die Funktion tatsächlich
>> nicht aufgerufen wird. Das könntest Du belegen, in dem Du in der
>> aufzurufenden Funktion einen Breakpoint im Simulator setzt.
>
> Du hast völlig recht, irgendwie muss man das Problem sicher einkreisen.
>
> Habe noch nie mit dem Simulator gearbeitet.
> https://www.mikrocontroller.net/articles/AVR-Simulation
> Dann würde ich mir das hier mal anschauen.

Genau. Und da den Abschnitt über den im AVR-Studio enthaltenen 
Simulator. Vielleicht noch HAPSIM dazu, dort kannst Du sowohl den UART 
als auch die Portpins visualiseren.

Aber ACHTUNG:
Bitte kläre erstmal ob Du nun "AVR-Studio" oder "Atmel Studio" 
verwendest. Ich kenne Atmel Studio nicht. Wenn ich auch vermute, das 
vieles ähnlich ist und das nicht zwei grundverschiedene IDEs sind, kann 
es doch Unterschiede bei der Bedienung geben. Siehe auch hier: 
https://www.mikrocontroller.net/articles/Atmel_Studio

von Stefan F. (Gast)


Lesenswert?

Nico schrieb:
> Dann gib mal Butter bei die Fische, warum ist das Programmfragment
> deiner Meinung nach nicht kompilierbar?

Habe ich doch in Beitrag "Re: Beim AVR-Studio zwei Projekte "verschmelzen"" 
geschrieben.

Nico schrieb:
> Mein Compiler sagt nämlich Build succeed with 0 warnings.

Dann hast du etwas anderes compiliert, jedenfalls nicht diese Datei.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Nico schrieb:
> Aber grundsätzlich ist an der oben beschriebenen Vorgehensweise schon
> mal nichts auszusetzen, wenn ich das richtig verstehe?!

Schreibe doch ein kleines Programm, welches die Problematik zeigt aber 
vom Geheimprogramm nichts verrät. Das ist dann hoffentlich 
verständlicher als Prosa. Das Programm muss vollständig compilierbar 
sein, so dass auch ein anderer das Problem nachvollziehen kann.

von Peter D. (peda)


Lesenswert?

Man kann nicht einfach 2 Endlosschleifen hintereinander pappen.
Man muß sich schon Gedanken machen, wie man beide Tasks sinnvoll in 
Zeitscheiben unterteilt und die dann wechselseitig in einer gemeinsamen 
Endlosschleifen aufrufen.
Davor muß natürlich eine gemeinsame Initialisierung erfolgen, die keine 
sich gegenseitig widersprechende Einstellungen vornimmt.

Man kann sich ja mal das hier ansehen:

http://www.dunkels.com/adam/pt/

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.