[En-Nut-Discussion] Suggestion for C++ initialisation change.

Phil Maker pjm at gnu.org
Fri Feb 25 01:31:53 CET 2005


G'day,

The problem:

	malloc/new inside C++ constructors always return 0 since they
	are not initialised. e.g.

	class V {
	  float *p;
	public:
	  V(int n) {
	    p = malloc(sizeof(float)*n);
	  }
        };

	V x(10);

The answer, I think (whence this message):   

	Modify avr_nutinit.c so we initialise the Heap before 
	calling the constructors. I've done this by breaking 
	the NutInit function into NutInitHeap and NutInit and putting
	them in separate init sections, i.e.


void NutInitHeap(void) __attribute__ ((naked)) __attribute__ ((section(".init5")));
void NutInit(void) __attribute__ ((naked)) __attribute__ ((section(".init8")));

void NutInit(void)
{
    /*
     * We can't use local variables in naked functions.
     */
#ifdef NUTDEBUG
    outp(7, UBRR);
    outp(BV(RXEN) | BV(TXEN), UCR);
#endif

    /* Create idle thread
     */
    NutThreadCreate("idle", NutIdle, 0, NUT_THREAD_IDLESTACK);
}

void NutInitHeap(void)
{

    /* If we have external RAM, initialize stack pointer to
     *  end of external RAM to avoid overwriting .data and .bss section
     */
    SP = (u_short)(NUTMEM_END);

    /* Then add the remaining RAM to heap.
     *
     * 20.Aug.2004 haraldkipp: This had been messed up somehow. It's nice to have 
     * one continuous heap area, but we lost the ability to have systems with
     * a gap between internal and external RAM.
     */
    if ((u_short)NUTMEM_END - (u_short) (&__heap_start) > 384) {
        NutHeapAdd(&__heap_start, (u_short) NUTMEM_END - 256 - (u_short) (&__heap_start));
    }
}

	The alternative would be to move the whole initialisation process
into a lower number init segment. 

	Any comments/thoughts from the gentle audience.



More information about the En-Nut-Discussion mailing list