Forum: Mikrocontroller und Digitale Elektronik Fragen zum Compiler des SILABS ARM3-µC


von Peter D. (peter9)


Lesenswert?

Tach auch,

ich arbeite seit ca. 2 Jahren mit dem SDK "Precision32" von SILABS für 
einen ARM3-(CORTEX-M3)-Prozessor "SIM3U166".

Das funktioniert soweit ganz gut, aber ich vermisse so ein paar 
Tools/Funktionen, die es bei anderen modernen Compilern gibt (evtl. habe 
ich es nur nicht gefunden?).

Bei einem Projekt komme ich mittlerweile an die Resourcen-Grenzen (RAM, 
32kB) und gelegentliche "merkwürdige" Effekte lassen mich befürchten, 
dass irgendwo im RAM (HEAP und STACK) sich etwas überschneidet.

Zusätzlich verwende ich zur Laufzeit die Funktionen "malloc" und "free".

Gibt es Möglichkeiten bei dieser GCC-Variante ("arm-none-eabi-gcc" 
zusammen mit REDLIB) sowas wie:

- Stack-Überlauf-Schutz (temporär wegen Performance) zu aktivieren?
- detaillierte Auflistung, wie groß der maximal Stack-Bedarf ist?
- andere Hilfemittel zum Aufspüren o.a. "Fehler"?

Beim guten alten 8051 (KEIL-Compiler) gab es das auch nicht, aber die 
MAP-Datei war m.E. schon recht ausführlich und hat mir oft "den Weg 
gezeigt", um Fehler bei der Speicher-Aufteilung zu finden. Der Linker 
hat auch sofort gemeckert, wenn zuwenig Speicher (idata) verfügbar ist.

Beim ARM3 habe ich mir zum Testen mal die höchste Adresse, die beim 
"malloc" auftritt, ausgegeben, so dass ich ungefähr sehe, was da 
dynamisch "verbraucht" wird. Aber so richtig aussagekräftig scheint mir 
das nicht zu sein.

Viele Grüße
Peter

von Jim M. (turboj)


Lesenswert?

Peter D. schrieb:
> - Stack-Überlauf-Schutz (temporär wegen Performance) zu aktivieren?

Könnte man eventuell durch geschickte Verwendung der MPU hinbekommen.

> - detaillierte Auflistung, wie groß der maximal Stack-Bedarf ist?

Geht nicht ohne weiteres, da der Cortex M3 verschachtelte Interrupts 
kennt, und in den Handlern auch weitere Funktionen aufrufen kann. Das 
kann den Stack Bedarf ganz schön in die Höhe treiben.

> Zusätzlich verwende ich zur Laufzeit die Funktionen "malloc" und "free".

Das sollte man auf einem µC besser bleiben lassen. Meistens sind 
statisch allokierte Puffer besser geeignet. Dynamischer Heap hat 
außerdem einen Overhead, den man bei 32kB RAM nicht wirklich haben will.

Wenn das RAM Problem wirklich sooo groß wird: Schau Dir mal die EFM32GG 
Serie, ebenfalls von Silabs, an. Die haben 128 KB RAM und bis 1 MB Flash 
on Chip.

von Peter D. (peter9)


Lesenswert?

Hallo Jim,

danke für deine schnelle Antwort.

"malloc" setze ich auch nur ein, da ich Texte (verschiedener Länge) von 
einer SD-Karte laden und dann im RAM ablegen muss. Das mache ich auch 
nur einmal beim Start des µC, so dass ein "dauerndes" umallokieren nicht 
stattfinden sollte.

Wer ein bessere Idee als "malloc" hat, bitte melden!

Anderer Chip ist immer eine gute Idee, wenn man noch die Wahl hat. In 
meinem Fall exisitiert die Schaltung wie sie ist!

Den µC, den Du vorgeschlagen hast, ist auch für ein Redesign im 
Gespräch. Aber alles noch Zukunfts-Musik...

Viele Grüße
Peter

von Peter D. (peter9)


Lesenswert?

Ach ja, noch einen weiteren "Speicherfresser" habe ich gefunden und noch 
nicht beheben können (z.B. mit pragmas).

Beispiel:

C-Datei:
1
static char c1;
2
static char c2;
3
static char c3;
4
static char c4;
5
static char c5;
6
static char c6;
7
static char c7;
8
static char c8;

Schaue ich dann in der MAP-Datei nach (editiertes Beispiel):
1
 .bss.c1        0x200011cf        0x1 ./src/c.o
2
 .bss.c2        0x200011d0        0x1 ./src/c.o
3
 *fill*         0x200011d1        0x1 00
4
 .bss.c3        0x200011d2        0x1 ./src/c.o
5
 .bss.c4        0x200011d3        0x1 ./src/c.o

Des Weiteren sortiert der Linker andere globale Variablen zwischen die 8 
o.a. Beispiel-Variablen (c1..c8).

Wieso macht der das? Und wie schließt man diese Lücken?

Das ist zwar jetzt keine Riesenmenge an RAM, aber es ist schade drum ;)

Grüße
Peter

von W.S. (Gast)


Lesenswert?

Peter D. schrieb:
> Das ist zwar jetzt keine Riesenmenge an RAM, aber es ist schade drum ;)

Und warum müllst du dir dann den RAM mit Texten von einer SD-Karte zu? 
So eine Karte ist doch schnell genug, um Texte nur bei Bedarf von dort 
zu holen. Alternativ pack deine Texte in den Flash, da kosten sie 
wenigstens keinen RAM.

W.S.

von Peter D. (peter9)


Lesenswert?

W.S. schrieb:
> Peter D. schrieb:
>> Das ist zwar jetzt keine Riesenmenge an RAM, aber es ist schade drum ;)
>
> Und warum müllst du dir dann den RAM mit Texten von einer SD-Karte zu?
> So eine Karte ist doch schnell genug, um Texte nur bei Bedarf von dort
> zu holen. Alternativ pack deine Texte in den Flash, da kosten sie
> wenigstens keinen RAM.
>
> W.S.

Hallo W.S.,

noch ist es nicht notwendig gewesen. Im Moment reicht das RAM ja noch, 
ich möchte halt nur wissen, wo es bleibt und wie man es optimieren kann.

Von der SD-Karte laden geht nur solange gut, solange die SD-Karte 
einwandfrei funktioniert. Es handelt sich dabei um Texte, die auf einem 
Display dargestellt werden und da möchte ich nicht, dass es "ruckelt", 
wenn irgendwelche Seiten mit Text gefüllt werden.

Flash ist leider auch schon ziemlich voll.

Grüße
Peter

von W.S. (Gast)


Lesenswert?

Ruckelt?
Betreibst du das Teil mit men 32kHz Uhrenquarz-Takt?

Peter D. schrieb:
> Wer ein bessere Idee als "malloc" hat, bitte melden!

So, du lädtst diesen ominösen Text einmal am Start in den RAM. Wozu 
brauchst du für diesen einmaligen Vorgang dann malloc und Konsorten? 
Stelle einfach fest, wie groß dein Text ist und fertig. Alternativ 
verfrachte ihn in den Flash. Ich suche jetzt nicht nach deinem µC im 
Inet, um herauszukriegen, wieviel Flash er hat, aber bei 32 K RAM 
schätze ich mal kühn, daß er wohl jenseits von 256 K Flash liegen 
dürfte.

Und wenn er von deinem Programm schon "ziemlich voll" ist, dann überlege 
dir erstmal, was du dort an überflüssigem Ballast alles drin hast. 
Dusselige Pseudo-Treiber wie die ST-Lib bei ST? Oder uneffektiv codierte 
Fonts? Oder noch uneffektiver codierte Grafiken? Oder sowas wie zlib? 
Geh einfach mal mit der Machete durch deine Zubehör-Quellen.

W.S.

von Peter D. (peter9)


Lesenswert?

Hallo W.S.,

> Peter D. schrieb:
>> Wer ein bessere Idee als "malloc" hat, bitte melden!
>
> So, du lädtst diesen ominösen Text einmal am Start in den RAM. Wozu
> brauchst du für diesen einmaligen Vorgang dann malloc und Konsorten?
> Stelle einfach fest, wie groß dein Text ist und fertig. Alternativ
> verfrachte ihn in den Flash. Ich suche jetzt nicht nach deinem µC im
> Inet, um herauszukriegen, wieviel Flash er hat, aber bei 32 K RAM
> schätze ich mal kühn, daß er wohl jenseits von 256 K Flash liegen
> dürfte.

er hat 256k, wovon aber schon 128 für die Applikation benötigt wird. 
Etwas Reserve hatte ich bei Vergrößerung der Applikation eingeplant, so 
dass ich aktuell nur 64k für Daten verwende und die sind auch schon zu 
80% belegt.

Da könnte ich aber für die Texte noch was abknappsen, was ich jetzt auch 
machen werde...

Grüße
Peter

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.