реклама на сайте
подробности

 
 
> функция sprintf() и компилятор arm-none-eabi-gcc, не компилирует... вылетает ошибка...
Посторонним В...
сообщение Jan 26 2013, 06:59
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 2-08-12
Пользователь №: 72 984



In function `_sbrk_r': sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk' collect2.exe: error: ld returned 1 exit status

поиск по гуглю показал что при компиляции надо указать какой то ключ то ли написать свои функции `_sbrk_r' и еще там парочка... и править ld файл
скомпилить функцию под gcc для msp430 - все скомпилилось отлично

кто то решал такую проблему???

где копать код???
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Посторонним В...
сообщение Jan 26 2013, 11:30
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 2-08-12
Пользователь №: 72 984



меня смущает существующая секция...

/* 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
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 26 2013, 12:14
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Посторонним В... @ Jan 26 2013, 17:30) *
это одно и то же или я ошибаюсь???

Это не совсем одно и то же. Первый кусок просто проверяет, что после распределения всех переменных в ОЗУ осталось место для стека и кучи (Min_Heap_Size + _Min_Stack_Size).
Второй кусок - даёт имена началу и концу куска ОЗУ, предназначенного для кучи.
Цитата(Посторонним В... @ Jan 26 2013, 17:30) *
можно ли тогда функцию переписать вот так???
Код
caddr_t _sbrk(int incr)
{
...
//    if ( nextHeap >= ( (caddr_t)(&_eheap) ) )
    if ( nextHeap >= ( (caddr_t)(&_end) ) )
    {
...
}

_eheap и _end - это разные адреса. _eheap - это конец кучи, а _end - её начало (то есть конец секции bss).
ЗЫ. Используйте для оформления кода кнопку [cоde]


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Посторонним В...
сообщение Jan 26 2013, 12:28
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 2-08-12
Пользователь №: 72 984



Цитата(AHTOXA @ Jan 26 2013, 13:14) *
Это не совсем одно и то же. Первый кусок просто проверяет, что после распределения всех переменных в ОЗУ осталось место для стека и кучи (Min_Heap_Size + _Min_Stack_Size).
Второй кусок - даёт имена началу и концу куска ОЗУ, предназначенного для кучи.

_eheap и _end - это разные адреса. _eheap - это конец кучи, а _end - её начало (то есть конец секции bss).
ЗЫ. Используйте для оформления кода кнопку [cоde]



все понятно...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Посторонним В...   функция sprintf() и компилятор arm-none-eabi-gcc   Jan 26 2013, 06:59
- - AHTOXA   Вот тут решение.   Jan 26 2013, 07:17
|- - Посторонним В...   Цитата(AHTOXA @ Jan 26 2013, 07:17) Вот т...   Jan 26 2013, 08:01
|- - AHTOXA   Надо определить функцию putChar(). (См. ф-ю _write...   Jan 26 2013, 08:15
|- - Посторонним В...   Цитата(AHTOXA @ Jan 26 2013, 08:15) Надо ...   Jan 26 2013, 08:18
|- - AHTOXA   _heap и _eheap должны быть определены в скрипте ли...   Jan 26 2013, 08:25
|- - Посторонним В...   нашел другую немного реализацию syscalls.c : с ни...   Jan 26 2013, 08:34
- - Посторонним В...   http://we.easyelectronics.ru/STM32/primene...-v-st...   Jan 26 2013, 09:45
- - Посторонним В...   блин... теперь размер проджекта с 16кб вырос до ...   Jan 26 2013, 14:06
|- - _Артём_   Цитата(Посторонним В... @ Jan 26 2013, 16...   Jan 26 2013, 14:28
|- - Посторонним В...   Цитата(_Артём_ @ Jan 26 2013, 15:28) Можн...   Jan 26 2013, 14:30
|- - AHTOXA   Например, вот здесь.   Jan 26 2013, 14:46
|- - Посторонним В...   Цитата(AHTOXA @ Jan 26 2013, 15:46) Напри...   Jan 26 2013, 15:50
|- - Сергей Борщ   QUOTE (Посторонним В... @ Jan 26 2013, 17...   Jan 26 2013, 19:41
- - juvf   а при чём тут scmRTOS?   Mar 24 2013, 17:12


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 03:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01375 секунд с 7
ELECTRONIX ©2004-2016