Heap and FreeRtos new

wiwix wrote on Monday, May 01, 2017:

Hi,

I’m facing strange issues in initialization phasis which begins to go out of my field of expertise. I searched for any recommandations on FreeRtos website about C++ integration but I didn’t find any good information about my issue (if it exists please point me to the right direction).

The fact is that when I use a C++ “new” statement, the constructor runs (checked with debugger), but several instructions latter (for instance after having build a parent class), I suddenly see the members to change value.

I think something is badly configured with my memory management, but I can’t figure out what. Could anyone help ?

I’m using heap_1.c and I have overloading the new operators like this :

void * operator new( size_t size )
{
    return pvPortMalloc( size );
}

void * operator new[]( size_t size )
{
    return pvPortMalloc(size);
}

void operator delete( void * ptr )
{
    vPortFree ( ptr );
}

void operator delete[]( void * ptr )
{
    vPortFree ( ptr );
}

I also have made a call to __libc_init_array() see my reset handler :

void Reset_Handler(void)
{
	uint32_t *pSrc, *pDest;

	/* Initialize the relocate segment */
	pSrc = &_etext;
	pDest = &_srelocate;

	if (pSrc != pDest) {
		for (; pDest < &_erelocate;) {
			*pDest++ = *pSrc++;
		}
	}

	/* Clear the zero segment */
	for (pDest = &_szero; pDest < &_ezero;) {
		*pDest++ = 0;
	}

	/* Set the vector table base address */
	pSrc = (uint32_t *) & _sfixed;
	SCB->VTOR = ((uint32_t) pSrc & SCB_VTOR_TBLOFF_Msk);

	if (((uint32_t) pSrc >= IRAM0_ADDR) && ((uint32_t) pSrc < NFC_RAM_ADDR)) {
		SCB->VTOR |= (1UL) << SCB_VTOR_TBLBASE_Pos;
	}

    SystemInit();

    // Set Systick to 1ms interval, common to all SAM3 variants
    if (SysTick_Config(SystemCoreClock / 1000))
    {
      // Capture error
      while (1);
    }

    // Initialize board
    init();

    //Wait 1 ms
    uint32_t start = GetTickCount();
    do {
        yield();
    } while (GetTickCount() - start < 1);

    // Initialize C library
    __libc_init_array();

	/* Branch to main function */
	main();

	/* Infinite loop */
	while (1);
}

edwards3 wrote on Monday, May 01, 2017:

heap_1 has no free(), so if you have descructors use heap_4.