Forum: Mikrocontroller und Digitale Elektronik 8051 und float


von Lothar (Gast)


Lesenswert?

Musste ein Projekt wegen M4F Nichtverfügbarkeit auf einen C8051 
portieren und habe gedacht, ich muss float durch Fixed Point ersetzen.

Aber alles funktioniert auch so und ist schnell genug. Im Debugger sieht 
man was z.B. bei einer float Division passiert, die beiden float werden 
in jeweils 4 Register gepackt, damit ist alles voll, und dann kommt ein 
FPDIV, das ohne mein zutun gelinkt wurde. Kann man so lassen :-)

von Peter D. (peda)


Lesenswert?

Wenn der Divisor eine Konstante ist, kann man auch mit dem Kehrwert 
multiplizieren. Ist etwa 4* schneller.

von Heizer (Gast)


Lesenswert?

Lothar schrieb:
> Musste ein Projekt wegen M4F Nichtverfügbarkeit auf einen C8051
> portieren und habe gedacht, ich muss float durch Fixed Point ersetzen.
>
> Aber alles funktioniert auch so und ist schnell genug. Im Debugger sieht
> man was z.B. bei einer float Division passiert, die beiden float werden
> in jeweils 4 Register gepackt, damit ist alles voll, und dann kommt ein
> FPDIV, das ohne mein zutun gelinkt wurde. Kann man so lassen :-)

sorry, vielleicht bin ich etwas Hirnlahm am Montag Morgen. Aber was ist 
die Information bzw. Neuigkeit: "Ein Compiler [C-Compiler? Welcher? 
Welche Version?] für den 8051 ist in der Lage halbwegs effizient Float 
zu berechnen und linkt dafür selbstständig benötigte Libs?"

Habe ich etwas übersehen?

Gruß

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Lothar schrieb:
> Aber alles funktioniert auch so und ist schnell genug.
Gut. Fertig! Nächstes Problem, bitte.

von Schon Immer (Gast)


Lesenswert?

Die freudige Botschaft kommt 30 Jahre zu spät.

Wie groß ist das Programm? 16k, 32k oder etwa noch mehr?
Wenn ein M4F durch einen 8051 ersetzt werden kann, gab es vorher 
vermutlich kein gravierendes Problem bei der Ausführungsgeschwindigkeit.

von Georg A. (georga)


Lesenswert?

Naja, schon der ZX81 (vor 40 Jahren, OMG) mit 8KB ROM hatte einen 
FPU-Emulator im Basic ;)

von Olaf (Gast)


Lesenswert?

> Habe ich etwas übersehen?

Wie koennten jetzt einfach mal behaupten das sowas mit einem
MCS48 unmoeglich gewesen waere. Dann springen sofort zehn Opas
aus dem Gebuesch und beweisen das Gegenteil. :-D

> gab es vorher vermutlich kein gravierendes Problem bei der
> Ausführungsgeschwindigkeit.

Genau. Solange man kein Zeitprobleme hat und man genug Speicher fuer
die Libarie ist das doch Spielkram.
Es kann aber natuerlich sein das die Schaltung dann nicht mit
mit einer CR2032 funktioniert sondern zwei Monozellen braucht weil
eine moderne CPU halt 90% im Sleepmode rumhaengen kann wo so eine
alte Schnoerkel-MCU 100% schwitzt.

Olaf

von PittyJ (Gast)


Lesenswert?

Georg A. schrieb:
> Naja, schon der ZX81 (vor 40 Jahren, OMG) mit 8KB ROM hatte einen
> FPU-Emulator im Basic ;)

War auch mein erster Gedanke. Ich hatte sogar einen ZX81. Und er konnte 
auch gleichzeitig noch einen Fernseher bedienen.

Was ist jetzt also das aufregende an eine FP-Library für den 8051?

von Cartman (Gast)


Lesenswert?

> Was ist jetzt also das aufregende an eine FP-Library für den 8051?

Ein LC-Meter nach dem Verstimmungsprinzip passt in einen kleinen 2051.
Falls der dir "altersbedingt" nicht sagt: 2 kByte Flash.

von Lothar (Gast)


Lesenswert?

PittyJ schrieb:
> Was ist jetzt also das aufregende an eine FP-Library für den 8051?

Hatte einfach vorher noch nie auf 8051 float genutzt und war halt 
überrascht dass es geht :-) Sogar echte 32-Bit Single Precision, nicht 
sowas:

https://en.wikipedia.org/wiki/Bfloat16_floating-point_format

Schon Immer schrieb:
> Wie groß ist das Programm? 16k, 32k oder etwa noch mehr?

Ist ein C8051F580 mit 128k das Programm ist so 32k gibt aber noch so 64k 
const Tabellen. Da ich dieses 8051 Banking nicht verstehe und auch nicht 
lernen wollte, habe ich für die const Tabellen einfach ein Wrapper Makro 
gemacht ähnlich AVR pgm_read_byte_far

> Wenn ein M4F durch einen 8051 ersetzt werden kann, gab es vorher
> vermutlich kein gravierendes Problem bei der Ausführungsgeschwindigkeit

Solange der M4F lieferbar war, wusste das aber niemand :-)

von Michael F. (Firma: IAR Systems) (michael_iar)


Lesenswert?

Lothar schrieb:
> Schon Immer schrieb:
>> Wenn ein M4F durch einen 8051 ersetzt werden kann, gab es vorher
>> vermutlich kein gravierendes Problem bei der Ausführungsgeschwindigkeit
>
> Solange der M4F lieferbar war, wusste das aber niemand :-)

Moin,

Du meinst eher "Solange der M4F lieferbar war, interessierte das aber 
niemand" ;-)

Bei einem Arm Cortex-M4 sollte der SWO Pin und / oder ein ETM Interface 
zur Verfügung stehen und darüber kann man mit passendem 
Debugger-Support, bzw. passender Debug-Probe ein Profiling der 
Applikation durchführen, um zu sehen:
- wie viel Reserve man bei der Rechenleistung für spätere 
Funktionserweiterungen hat
- ob z.B. das Interrupt-Handling "auf Kante genäht" ist
- wie lange man die CPU in Sleep schicken kann, um Energie zu sparen 
(wie von Olaf bereits erwähnt)
- ...

Beim 8051 sind die Möglichkeiten des Profilings in Hardware eher 
"übersichtlich", da hier ein performantes Debug-Interface fehlt. Das C2 
des C8051F580 sollte etwas besser sein, als klassisches JTAG, aber im 
Zweifelsfall muss dann ein Simulator herhalten...

Gruß,
Michael

von Peter D. (peda)


Lesenswert?

Ich hab float auf dem AT89C2051 gerne benutzt. Die 4 Grundrechenarten 
benötigen etwa 1kB. Man hat also noch 1kB für die Applikation. Und wenns 
klemmt, der AT89C4051 hat 4kB Flash.
Und falls man den Turbo braucht, einfach den AT89LP4052 rein.

von Cartman (Gast)


Lesenswert?

> Da ich dieses 8051 Banking nicht verstehe und auch nicht
> lernen wollte

http://hcs.sourceforge.net/docs/The_Final_Word_on_the_8051.pdf

Lesen bildet!

von Lothar (Gast)


Lesenswert?

Cartman schrieb:
>> Da ich dieses 8051 Banking nicht verstehe und auch nicht
>> lernen wollte

Es gibt sogar eine App Note mit Beispielen. Davon verstehe ich das 
manuelle Banking, aber nicht das automatische Banking. Vor allem 
verstehe ich nicht, warum das automatische Banking nicht einfach so 
funktioniert:

main und Shared Libs in Bank 0 = Common Bank
Modul 1 in Bank 1
Modul 2 in Bank 2
Modul 3 in Bank 3

main startet Modul 1, das macht was es soll, und macht dann eine Art 
yield

main macht einen Context Switch und wechselt von Bank 1 nach Bank 2 und 
startet Modul 2 usw.

Also Cooperative Multitasking ohne MMU

Dann kann zwar kein Modul >32k sein, aber das ist bei vielen RTOS auch 
so.

https://www.silabs.com/documents/public/application-notes/an143.pdf

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.