Forum: Mikrocontroller und Digitale Elektronik PIC32MX664F128H / DP83848 Link Error: Could not allocate section .bss


von David H. (davidm)


Lesenswert?

Ich habe hier den DP83848 als externen Ethernet Chip.

Wie kommt es zu diesem Fehler?

build/default/production/_ext/867694782/ETHPIC32IntMac.o: Link Error: 
Could not allocate section .bss, size = 15608 bytes, attributes = bss
 Link Error: Could not allocate data memory
collect2: ld returned 1 exit status
make[2]: *** [dist/default/production/pm-eth.X.production.hex] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2



Ich hab schon ne Menge raus genommen in der TCP config aber in den PIC32 
muss doch mehr rein passen als in den PIC18F97J60 :-)

von David H. (davidm)


Angehängte Dateien:

Lesenswert?

Was mich auch wundert das er _inline_ nicht kennt, wo wird das 
normalerweise eingestellt?

von David H. (davidm)


Lesenswert?

Was mich echt wundert der selbe Stack passt in einen PIC18F97J60 mit 
gerade mal ~3k SRAM aber nicht in einen PIC32 mit 65k SRAM ?

Gibt es hier irgendwelche Schalter etc... die hier was optimieren?
Dazu musste ich einen HEap Speicher beim Linker eingeben, wieviel 
benötige ich da und vorallem auch für was wird dieser im TCP Stack 
verwendet?


Das hier alleine gab mir 16kb Speicher
//#define STACK_USE_DYNAMICDNS_CLIENT

Kann ich irgendwie sehen in welchen Dateien soviel Speicher benötigt 
wird?

von Stampede (Gast)


Lesenswert?

Schau mal in der TCPIP STack Guide nach, da gibt ein Kapitel zu.

von David H. (davidm)


Lesenswert?

Da gibts sogar optionen fuer den Linker, aber er generiert einfach keine 
Map file.

In welcher TCP Stack Hilfe? der Helpfile? der AN833?

The map file shows information relating to where objects were positioned 
in memory. It
is useful for confirming that user-defined linker options were correctly 
processed, and
for determining the exact placement of objects and functions.
The option to create a map file in the linker is -Map file (or 
-Wl,-Map=file if
passed to the driver),

von David H. (davidm)


Lesenswert?

Ich hab mir mal PIC18 Projekte angesehen da wird das so gemacht:

-m"$(BINDIR_)$(TARGETBASE).map"

mich wundert nur das es der XC8 macht aber der XC32 scheinbar nicht.

Es muss irgendwo eine Einstellung dafür geben


also gut es ist einfach nur -M dann schreibt ers aus.
1
kseg1 Boot-Memory Usage
2
section                    address  length [bytes]      (dec)  Description
3
-------                 ----------  -------------------------  -----------
4
.reset                  0xbfc00000          0x1f4         500  Reset handler 
5
.bev_excpt              0xbfc00380           0x10          16  BEV-Exception 
6
         Total kseg1_boot_mem used  :       0x204         516  44.2% of 0x490
7
        --------------------------------------------------------------------------
8
         Total Program Memory used  :      0xc004       49156  35.4% of 0x21e00
9
        --------------------------------------------------------------------------
10
11
12
kseg1 Data-Memory Usage
13
section                    address  length [bytes]      (dec)  Description
14
-------                 ----------  -------------------------  -----------
15
.eh_frame               0xa0000000           0x20          32   
16
.persist                0xa0000020            0x8           8   
17
.sdata                  0xa0000028           0x14          20  Small init data 
18
.sbss                   0xa000003c           0xe8         232  Small uninit data 
19
.bss                    0xa0000124          0x158         344  Uninitialized data 
20
.bss                    0xa000027c         0x3c60       15456  Uninitialized data 
21
         Total kseg1_data_mem used  :      0x3edc       16092  49.1% of 0x8000
22
        --------------------------------------------------------------------------
23
            Total Data Memory used  :      0x3edc       16092  49.1% of 0x8000
24
        --------------------------------------------------------------------------
25
26
27
Dynamic Data-Memory Reservation
28
section                    address  length [bytes]      (dec)  Description
29
-------                 ----------  -------------------------  -----------
30
heap                    0xa0003ee0           0x40          64  Reserved for heap 
31
stack                   0xa0003f38         0x40b8       16568  Reserved for stack 
32
33
        --------------------------------------------------------------------------

Man beachte wieviel er hier belegt:
.bss                    0xa000027c         0x3c60       15456 
Uninitialized data

von David H. (davidm)


Lesenswert?

Was ich hier einfach nicht verstehe warum der TCP Stack in einen kleinen 
PIC18F97J60 passt, und ein bei einem großen PIC32 auf einmal nicht mehr.

Ich kann irgendwie auch nur die ersten 50% belegen, danach nicht mehr, 
irgendwie verwendet er nur den "near" Speicher.

Beim 16 Bit compiler konnte man noch das Speicher Model ändern, nur das 
kann man beim XC32 nicht mehr.

Gerade der PIC32MX664 wäre doch komplett nutzlos wenn nichtmal der TCP 
Stack rein passt. Geschweige den von der USB Lib

von David H. (davidm)


Lesenswert?

Also ich bin ein Tick weiter, scheinbar kann man die Vitrual Memory Map 
Umstellen das mehr near speicher zur Verfügung steht.


Es muss doch da irgend wer eine Idee haben.

von Klaus (Gast)


Lesenswert?

David Mueller schrieb:
> mehr near speicher zur Verfügung steht.

Gibt es das Konzept "near" bei einer MIPS-Architektur überhaupt?

MfG Klaus

von Flo (Gast)


Lesenswert?

Servus David,

benutzt Du die aktuellste IDE mit aktuellstem Compiler?

Vielleicht hilft es, die Heap-Size zu verkleinern, so dass mehr RAM 
übrig bleibt (bei mir reichen 1024)

Sonst würde ich mal die Optionen "Remove unused sections" und "Allow 
overlapped sections" ausprobieren.

Evtl. schaust Du mal in das Linker File unter
C:\Program 
Files\Microchip\xc32\v1.21\pic32mx\lib\proc\32MX664F128H\procdefs.ld

oder erstellst eine Kopie und gibts das unter "Linker Files" an.

Bei kseg1_data_mem sollte  0x8000 stehen (also 32k RAM)..

Sonst fällt mir vorerst auch nichts mehr ein..

Viele Grüße
Florian

von Flo (Gast)


Lesenswert?

anyway: Mein RAM ist mit TCP/IP Stack, USB und ein bisschen Drumherum 
bei 0x7FBC, also in Deinem Fall wäre das schon am Anschlag..

Das Map-File wird wohl erst nach erfolgreichem Linken generiert, dafür 
brauche ich zumindest keine Extra-Option.

von David H. (davidm)


Lesenswert?

Flo schrieb:
> Bei kseg1_data_mem sollte  0x8000 stehen (also 32k RAM)..

ja Das steht da, hab auch schon versucht die procdefs.ld zu kopieren und
darin rum zu spielen aber ohne Erfolg.


> Vielleicht hilft es, die Heap-Size zu verkleinern, so dass mehr RAM
> übrig bleibt (bei mir reichen 1024)

Ich habe bei Heap nur 64 in den Einstellungen in MPLABX eingetragen.


Das kann doch nicht sein das ich erst den TCP Buffer verkleinern muss 
damit das funktioniert und compiled.

TCPIPConfig.h...
1
//  #define TCP_PIC_RAM_SIZE (16384ul)
2
  #define TCP_PIC_RAM_SIZE (2048ul)

nur noch 2kb Buffer für nen PIC32?

Da wären doch die PIC32MX664 viel zu klein um da jemals TCP und USB 
gemeinsam nutzen zu können, aber für irgendwas müssen die dinger doch 
verkauft werden ??


Ich habe gesehen das es ein Virtuellen speicher gibt den man sich 
umgestalten kann, z.B. mit BMX..... Register.

Aber kann das echt sein das ich da erst so ein Aufwand treiben muss um 
einfach nur TCP da rein zu bekommen?

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.