Guten Tag, ich versuche momentan float oder double zahlen mit printf übern UART auszugeben (Programmiersprache C). Jedoch fängt der an zu meckern, wenn ich folgenden Programmcode anwende: [...] float floatvar; printf("T1:%f",floatvar); [...] oder [...] double doublevar; printf("T1:%Lf",doublevar); [...] Die Fehlermeldung: ------------------------------------------ c:\programme\microchip\mplab c30\bin\pic30-coff-ld.exe: Link Error: region program is full (1-Wire.cof section .text) data_init: Link Error: Could not allocate section .dinit, size = 308 PC units, attributes = code default_isr: Link Error: Could not allocate section .isr, size = 2 PC units, attributes = code Link Error: Could not allocate program memory ------------------------------------------ Meine Vermutung: Der PIC hat nicht genug Speicher für diese Convertierung in printf. Ich würde ungern auf float und double bei der Programmierung eines PICs verzichten, deshalb wäre ich für jede Hilfe dankbar! Grüße, Heos
(a) größeren PIC nehmen (welcher ist es denn momentan GENAU?) (b) nur float ODER double verwenden (c) alles per Integer oder Festkomma machen fchk
> Nimm einen PIC mit größerem Flash-ROM.
Sorry das hat natürlich gefehlt...
Es ist der dsPIC33fj12GP202. Dieser besitzt 12Kbyte Programmspeicher und
1Kbyte RAM
Für die Entwicklung und Einzelstücke nimmt man am Besten den größten, also Bei Dir den dsPIC33FJ128GP202, und schaut dann, wie viel Speicher man nachher tatsächlich braucht. Bei 12k Flash (also 4 kWorten) solltest Du Dir tatsächlich float und double verkneifen. fchk
Es ist sehr merkwürdig: Mein Kollege hat ein ähnliches Programm für diesen PIC geschrieben, jedoch hat der bei weitem mehr printf-Befehle ausgeführt und der hat sogar einen long double reingehauen und der compiliert. Ich schätze das müsste an meinen Compilereinstellungen in MPLAB liegen. Jedoch habe ich keine Ahnung was ich das umstellen soll.
Heos schrieb: > Ich würde ungern auf float und double bei der Programmierung eines PICs > verzichten, deshalb wäre ich für jede Hilfe dankbar! Dann schmeiß dieses aufgeblähte printf weg und mach's zu Fuß. Beispiel dazu findest du in der Lernbetty. W.S.
Heos schrieb: > Ich schätze das müsste an meinen Compilereinstellungen in MPLAB liegen. > > Jedoch habe ich keine Ahnung was ich das umstellen soll. Warum fragst Du nicht Deinen Kollegen und lässt Dir sein Projekt geben. Das Map-File des Linkers ist auch immer eine gute Quelle. Da steht drin, was wie viel Speicher braucht. Wenn Du wenig Speicher hast, solltest Du tatsächlich auf printf/scanf und float/double verzichten, insbesondere wenn Du keinen großen Dynamikbereich brauchst. fchk
Heos schrieb: >> Nimm einen PIC mit größerem Flash-ROM. > > Sorry das hat natürlich gefehlt... > > Es ist der dsPIC33fj12GP202. Dieser besitzt 12Kbyte Programmspeicher und > 1Kbyte RAM Hallo, ich kenne das Problem vom PIC24 (was die gleiche Lib ist). Stringfunktionen aus der PIC24/dsPIC33 Standardlib sind leider verdammt teuer. 1x sprintf %f ->ein paar kBit weg. Einfachste Lösung: Bürde die "komplexen" Sachen dem PC auf. Schicke dem die Floats roh, der muss das dann interpretieren. Der hat genug Dampf. Oder drehe mal die Optimierungen des XC16 auf: Projekt->Properties->XC16->xc16-gcc->Optimizations->Optimization level Eventuell reichts ja. Das könnte das sein, was dein Kollege gemacht hat.
Ich habe das Problem gelöst: Ich habe die Version des C30-Compilers von mir und meinem Kollegen verglichen. Das Resultat: Ich hatte eine viel zu alte Version des Compilers, der float und double in einem printf-Befehl nicht drauf hatte. Die Version 3.31 vom C30-Compiler sollte es tun. Hier zu finden: http://www.microchip.com/pagehandler/en-us/devtools/dev-tools-parts.html Vielen Dank für eure Antworten! Gruß, Heos
Somebody123 schrieb: > 1x sprintf %f ->ein paar kBit weg. Aber dafür ist der Unterschied zwischen 1x sprintf und 2x sprintf kaum noch wahrzunehmen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.