Forum: Mikrocontroller und Digitale Elektronik Code banked


von Max D. (jimbo)


Lesenswert?

hallo zusammen,

ich entwickle auf einen cc2431 von chipcon mit einem 8051 prozessor.
in meinem projekt verwende ich als code model = banked.
so was ich noch nicht ganz verstanden habe ist der unterschied zwischen
ROOT und _near_func.
Mit ROOT kann ich funktionen in meine ROOT-bank reinlegen, das heist
diese sind immer erreichbar und müssen nicht nachgeladen werden!
zumindest habe ich das so verstanden.
=> non-banked
jetzt habe ich gelesen das ich Interrupts und funktion die die overlay
calling conventions verwenden mit __near_func deklariert werden müssen,
 so das diese funktionen in der ROOT-bank liegen.

=> Wo liegt aber jetzt der unterschied zwischen ROOT und __near_func


gruß

jimbo

von Peter D. (peda)


Lesenswert?

Das ist ne Compiler spezifische Sache, d.h. man müßte erstmal wissen,
welchen Compiler Du verwendest.


Ein Tip:

Es reicht aber völlig aus, sich erst dann mit dem Banking zu
beschäftigen, wenn der Code wirklich größer als 64kB wird (entspricht
Hexfile >160kB).

Vor allem ist man dann schon mit dem Copiler warm geworden und hat
schon ne Menge lauffähigen Code.


Noch Tip:

Jeder MC-Programmierer sollte unbedingt den C51-Primer lesen, damit man
nicht explodierenden (auf die Größe bezogen) und schneckenlahmen Code
schreibt.


Peter

von Max D. (jimbo)


Lesenswert?

hallo peter,

erstmal danke.
ich verwende den icc8051 compiler.
tja, werd wohl nicht daran vorbei kommen das zu lesen.

gruß

jimbo

von Peter D. (peda)


Lesenswert?

"tja, werd wohl nicht daran vorbei kommen das zu lesen."


Wieviel Monate programmierst Du denn schon, daß bereits 64kB voll sind
?

Hast Du den C51-Primer gelesen, mit dessen Tips kann man bestimmt
einige 10kB einsparen.


Ich hab noch nie Banking benötigt.

Mit dem ICC kenne ich mich nicht aus, ich verwende den Keil.


Peter

von Max D. (jimbo)


Lesenswert?

geht eigentlich nicht darum das der speicher voll ist, sondern dass das
ein etwas größeres projekt wird in dem ich auch solche sachen wie
routingtabellen abspeichern will usw..
also wollt ich gleich von anfang an schauen das ich speicher sparen
kann.

ne das c51-primer hab ich noch nicht gelesesn, mach ich aber gerade
:-)

jimbo

von Tobias (Gast)


Lesenswert?

> C51-Primer

Kann mir jemand sagen, wo ich das finde? Auf der Seite von Hitex
scheint es das nicht mehr zu geben.

Vielen Dank!

von Peter D. (peda)


Lesenswert?

@jimbo

"also wollt ich gleich von anfang an schauen das ich speicher sparen
kann."


Nicht böse gemeint, aber das ist Quatsch mit Soße.

Banking spart keinen Speicher, sondern verbraucht mehr Speicher (Flash
und SRAM) und CPU-Zeit.


Eine Funktion in einer anderen Bank kann man nicht mehr mit LCALL
(3Byte) aufrufen, sondern man muß erst die 3Byte-Adresse in eine
Variable laden und dann die Switcher-Funktion aufrufen, kostet statt 3
Byte also 12 Byte.

Und die Switcher-Funktion muß natürlich noch die 3Byte-Returnadresse
sichern, kostet also statt 2 Byte dann 5 Byte vom Stack.

Das kann nun wiederum dazu führen, daß man Variablen aus DATA/IDATA in
XDATA auslagern muß, um den nötigen Stackplatz zu haben. Kostet also
nochmal Flash, da XDATA-Zugriffe umständlicher sind.

Und wenn man konstante Daten oder Funktionspointer Bankübergreifend
haben will, hat man das gleiche Dilemma.


Es kann also durchaus sein, daß ein 64kB Programm nach der Umstellung
auf Banking gleich 74kB groß ist.


Wie gesagt, ich würde nicht gleich mit dem Schwierigsten anfangen,
sondern erstmal versuchen überhaupt Fuß zu fassen, also das Banking
erstmal völlig links liegen lassen.


Auch wird der Linker erstmal soviel wie möglich in das gemeinsame
Segment (z.B. 32kB) zu legen versuchen, d.h. unter 32kB Codegröße
merkst Du garnicht, ob die Bankumschaltung überhaupt richtig
funktioniert.


Ich würde nicht unter 50..60kB Gedanken an das Banking verschwenden.


Peter

von Peter D. (peda)


Lesenswert?


von A.K. (Gast)


Lesenswert?

Wenn man mit 51-ern anfängt und das ganze dann langsam wächst und
gedeiht, oder man schon zig Jahre dabei ist und alle Werkzeuge und
Erfahrung damit hat - dann verstehe ich 51er mit >64KB Code.

Aber muss man sich ausgerechnet unter 51-er umtun, wenn man schon
vorneweg annimmt, dass 64KB viel zu wenig sind? Die wurden Ende der
70-er Jahre für 8KB ROM und 256 Byte RAM geschaffen und das merkt man
deutlich. Es gibt reichlich Alternativen die damit weit besser zurecht
kommen.

von Max D. (jimbo)


Lesenswert?

hallo zusammen,

ja das mag schon alles richtig sein. aber ich verwende für mein projekt
den ieee 802.15.4 standard und diese applikation hat alleine schon 90KB.

also wird mir wohl nichts anderes übrig bleiben oder?

ich muss dazu sagen ich bin ziemlich neu auf dem gebiet der
hw-programmierung!

kenne mich zwar gut mit c aus, aber eben nicht mit dem 8051.

zusätzlich verwende ich eine hw-location-engine und die befindet sich
halt, so weit ich weiß, nur auf den cc2431 und dieser verwendet nur den
8051 als cpu.

also ich wäre sehr dankbar für weitere tipps.

peter: habe schon angefangen das c51primer paper zu lesen, hat mir bis
jetzt sehr weiter geholfen. also nochmals danke für den tipp.

gruß

jimbo

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.