Tipps uns Tricks zu Komponenten

Umgang mit PSoC Logikkomponenten
Reiner W.
Beiträge: 112
Registriert: Di 7. Apr 2015, 11:43

Re: Tipps uns Tricks zu Komponenten

Beitrag von Reiner W. » Mi 4. Nov 2015, 02:10

Hi Ralf,
UnusedFunction bezieht sich auf statische Funktionen (also "static void FuncBlabla(void)". Nicht statische Funktionen sind immer öffentlich und daher kann GCC (mit den Standardeinstellungen) wohl nicht ermitteln, ob sie nicht doch verwendet werden (keine Ahnung warum) und spuckt deswegen keine Warnung aus.
Ja, das habe ich auch gelesen und es deswegen nicht weiterverfolgt, da ich zumindest sicher war, dass unused-functions gelöscht werden (wenn die compiler/linker Einstellungen gesetzt sind)
Dein Link aber ist klasse.
Mit der Linker Option -Wl,--print-gc-sections kann man gut improvisieren;-)
Anzeige unused-functions.jpg
Anzeige unused-functions.jpg (324.34 KiB) 6608 mal betrachtet
Die erscheinen zwar alle als Fehler, es wird aber trotzdem kompiliert.
Als dauerhafte Einstellung ist das eher verwirrend, um aber mal gezielt nach unused-functions zu fahnden ist das sehr gut.
Reiner W.

RA1981
Beiträge: 38
Registriert: Do 23. Apr 2015, 07:54

Re: Tipps uns Tricks zu Komponenten

Beitrag von RA1981 » Mi 4. Nov 2015, 09:47

Ja, zum Aufspüren bestimmt sehr gut geeignet. Man müsste mal rausfinden, was im Link damit gemeint ist, dass irgendwas aufgebläht bzw langsamer wird. Wenn ich raten müsste würde ich sagen, dass sich das auf den Build und dessen (temporäre) Daten und nicht auf das eigentliche Programm bezieht.

Ralf

Reiner W.
Beiträge: 112
Registriert: Di 7. Apr 2015, 11:43

Re: Tipps uns Tricks zu Komponenten

Beitrag von Reiner W. » Mi 4. Nov 2015, 10:35

sich das auf den Build und dessen (temporäre) Daten und nicht auf das eigentliche Programm bezieht
Am Programm konnte ich nichts feststellen. Kann mir auch nicht recht vorstellen, wie das größer werden sollte. Aber natürlich wird der Buildlauf länger dauern auch wenn das bei meinem kleinen Testprogramm nicht ins Gewicht fällt.
Was aber natürlich (unangenehm) auffällt, ist die Tatsache, dass die Log-Ausgabe immens aufgebläht wird (sieht man gut im Bild). Der überwiegende Teil der unused-functions stammt ja aus den diversen APIs. Da sieht man schnell den Wald vor lauter Bäumen nicht.
Hätte mir die ursprüngliche Frage eigentlich auch logisch beantworten können;-) Würden alle unused API-funktioncs gelinkt, wäre das API-Konzept ansich fast unbrauchbar. Wann baucht man schon mal alle API-functions einer Komponente.
Nur so sind eigentlich Multifunktions-Komponenten sinnvoll.
Übrigens die Build Einstellung Debug spielt da keine Rolle
Mir ging es eigentlich darum, festzustellen, was mit Funktionen passiert, die ich bei Manipulation in der Komponente selbst "unused" gemacht habe, indem ich sie ersetzt habe. Da ist es nützlich festzustellen, ob die obsolete function tatsächlich 'unused' ist und nicht etwa noch von anderen API-functions ausgerufen wird.
Beispiel: Ich schreibe eine eigene Ini-Function, die bestimmte Parameter nicht mit dem bei der Komponente hinterlegten Wert initialisiert, sondern mit einer eigenen Variable (z.B. IDAC - polarity). Würde die Ini dann noch von anderer Stelle aus aufgerufen werden, würde sie meine eigenen Einstellungen wieder überschrieben.
So kann ich mit der gefundenen Einstellung schnell überprüfen, ob die Original-Ini nun tatsächlich "unused" ist.

Ich danke dir nochmal für die Hilfe.
Reiner W.

RA1981
Beiträge: 38
Registriert: Do 23. Apr 2015, 07:54

Re: Tipps uns Tricks zu Komponenten

Beitrag von RA1981 » Mi 4. Nov 2015, 12:29

Hi Reiner,

stimmt, ich denk auch, dass der Build eher länger dauern wird und nicht das Programm langsamer =)

Was die Logausgabe betrifft, evtl kann man ja zweigleisig fahren: wenn's nicht darum geht herauszufinden, was von wem aufgerufen wird (gibt es hierzu eigentlich nicht noch den CallStack(?)), dann kann man ja schauen, ob man diesen spezifischen Fehler in der Ausgabe unterdrücken kann.

Bzgl der APIs sprichst du hinsichtlich Speicherverbrauch etc eigentlich ein anderes, ebenfalls interessantes Thema an:
Aufgrund der Cortex-Architektur muss ja auf alles und jedes mit einem Pointer zugegriffen werden, direkte(n) Addressierung/Zugriff gibt es ja nicht. Nehmen wir nun an, man verwendet eine Komponente so oft wie es eben geht - wird dann nun die API n-mal dupliziert oder nur die API der ersten Komponente? Muss ich unbedingt mal ausprobieren, denn wenn das n-mal dupliziert wird, dann würde ich sagen, dass das API-Konzept falsch umgesetzt ist - m.E. sollte es durchaus möglich sein, nur einmal die API drin zu haben, und welche Komponente damit modifiziert wird ist dann "nur" abhängig von Pointern.

Das wird ein interessantes Experiment werden =)

Ralf

Reiner W.
Beiträge: 112
Registriert: Di 7. Apr 2015, 11:43

Re: Tipps uns Tricks zu Komponenten

Beitrag von Reiner W. » Mi 4. Nov 2015, 15:03

..Was die Logausgabe betrifft, evtl kann man ja zweigleisig fahren:..
Ja ich setz halt die Link-Option nur wenn ich sie brauche (kommt ja selten vor).
wird dann nun die API n-mal dupliziert
n-mal dupliziert. Jeweils als API der konkreten Instanz. Kannst du im "Generated_Source" sehen, wenn du z.B. mal paar Pins auf das Sheet wirfst.
Sicher könnte man da die ein oder andere API-function allgemein für alle Instanzen haben. Aber sobald konkrete Hardwareregister angesprochen werden müssen, braucht es individuelle Funktionen.
Ob man nun eine Sammlung individueller Funktionen hat, oder per einheitlichem Funktionspointer doch wieder auf individuelle Funktionen zugreift, wird Speicherplatzmäßig nicht viel ausmachen. Die Programmierung ist aber u.U. einfacher, wenn es über Funktionspointer geht.
Hatte so ein Beispiel in meiner Messschieberanzeige. 3 Messschieber werden mit je 2 Pins gesteuert. Wenn ich da mit Funktionspointern im Array/struct arbeite, lässt sich halt viel per Schleife erledigen, da der Funktionsaufruf immer gleich ist.
Reiner W.

RA1981
Beiträge: 38
Registriert: Do 23. Apr 2015, 07:54

Re: Tipps uns Tricks zu Komponenten

Beitrag von RA1981 » Do 5. Nov 2015, 10:51

Hi Reiner,
Aber sobald konkrete Hardwareregister angesprochen werden müssen, braucht es individuelle Funktionen.
Warum? Wenn die anzusprechende Hardware über ein Struct abgebildet wird, dann kann man sich selbst das sparen, denn dann gibt's den Pointer auf's entsprechende struct und dann passt das wieder.

Ralf

Reiner W.
Beiträge: 112
Registriert: Di 7. Apr 2015, 11:43

Re: Tipps uns Tricks zu Komponenten

Beitrag von Reiner W. » Do 5. Nov 2015, 11:36

Hi Ralf,
Wenn die anzusprechende Hardware über ein Struct abgebildet wird

Ja, so hab ich es auch gemacht. Hardware+indivduelle Funktionen in ein Struct. Die Structs der Instanzen in ein Array und die Instanzen als enum.
Das geht einigermaßen universell.
Ich bezog mich eher auf das bestehende API Design. Und ich gehe davon aus (hoffe mal), dass Cypress gute Gründe dafür hat;-)
Reiner W.

Antworten