Mika, Using a heap in a small embedded device is usually regarded as unwise and not appreciating the limitations of small embedded devices. A microcontroller is no PC.
SDCC supports some targets which can have 64k of ram or even more, but I've never heard of any PIC14 or PIC16 that can. I admit I know very little about the PICs so I might be wrong. But are you sure you want to use the heap in such a small device? Wouldn't you better use static allocation and save the code and memory costs of malloc and friends? Greetings, Maarten > Hi, > > Thank you very much. This really helped a lot :) > > -Mika > > > Hi Mika, > > > >> Managed to compile a sample code below with sdcc, but the xdata > >> definition can not be found from header files (except from testfwk.h). > > > > The PIC architectures do not offer anything like external data memory; > > so either just > > #define xdata __data > > or replace it (as you did). > > > >> What would be the correct way to introduce the heap ? > >> data char heap[256]; > > > > That looks pretty good, __data instead of data is safer, though. > > > >> // data char heap[512]; This gives linker error, do not know why > > > > The reason for the linker error is that the PIC organizes its memory in > > banks of 256 bytes each. You cannot declare structures/arrays larger > > than that unless you know what you are doing and modify the .lkr script > > (combine two adjacent banks (END address of first = START address of > > second - 1), i.e., turn > > > > DATABANK NAME=gpr1 START=0x100 END=0x1FF > > DATABANK NAME=gpr2 START=0x200 END=0x2FF > > > > into > > > > DATABANK NAME=gpr1 START=0x100 END=0x2FF > > > > Save the modified 18f4550.lkr in your project directory and add > > -Wl,-s,18f4550.lkr to sdcc's command line (or -s 18f4550.lkr to gplink's > > command line, depending on your build system/style) to use it. > > > > Make sure, though, that you *always* statically allocate the heap of at > > least 256 bytes if you do this, otherwise a random multi-byte entity (an > > int, a struct, ...) might be placed across the bank boundaries, which > > breaks compiler assumptions about BANKSEL placement and might cause > > accesses to the entity to fail (read/write in the wrong bank, good luck > > hunting such bugs!). > > > > Also, make sure to add > > #pragma stack 0x300 0x100 > > to your main() file to move the stack from its standard location > > (0x200-0x2FF) to 0x300-0x3FF. You might also reduce the stack size > > (0x100 => 256 bytes, 0x80 => 128 bytes *might* suffice, you could try). > > > > Note that using a 512 byte heap and a 256 byte stack leaves 'just' 160 > > byte of the 4550 available for other stuff. > > > > Hope that helped, > > Raphael ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ Sdcc-user mailing list Sdcc-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sdcc-user