меня смущает существующая секция...
/* User_heap_stack section, used to check that there is enough RAM left */ ._user_heap_stack : { . = ALIGN(4); PROVIDE ( end = . ); PROVIDE ( _end = . ); . = . + _Min_Heap_Size; . = . + _Min_Stack_Size; . = ALIGN(4); } >RAM
и вот это определение
PROVIDE ( _heap = _ebss ); PROVIDE ( _eheap = ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 - _Min_Stack_Size , 8) );
это одно и то же или я ошибаюсь???
можно ли тогда функцию переписать вот так???
caddr_t _sbrk(int incr) { extern char end asm ("end"); /* Defined by the linker. */ extern char _end asm ("_end"); /* Defined by the linker. */
caddr_t prevHeap; caddr_t nextHeap;
if (heap == NULL) { // first allocation // heap = ((caddr_t)(&_heap)); heap = ((caddr_t)(&end)); }
prevHeap = heap;
// Always return data aligned on a 8 byte boundary nextHeap = (caddr_t) (((unsigned int) (heap + incr) + 7) & ~7);
// Check enough space and there is no collision with stack coming the other way // if stack is above start of heap // if ( nextHeap >= ( (caddr_t)(&_eheap) ) ) if ( nextHeap >= ( (caddr_t)(&_end) ) ) { errno = ENOMEM;
return (NULL); // error - no more memory } else { heap = nextHeap;
return ((caddr_t)(prevHeap)); } }
Сообщение отредактировал Посторонним В... - Jan 26 2013, 11:31
|