|
Coocox настройка heap? |
|
|
|
Apr 16 2016, 14:51
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008

|
Не получается настроить кучу в coocox. По тем пример что на форуме http://www.coocox.org/forum/viewtopic.php?f=2&t=917 у меня не получилось. Во первых потому, что они с ошибками, а во вторых там не указано куда именно в файле *.ld нужна сделать вставку. В общем я сделал по другому: 1. В файле startup добавил Код /*----------Heap Configuration-----------------------------------------------*/ #define HEAP_SIZE 0x00001000 __attribute__ ((section(".heap"))) unsigned long pulHeap[HEAP_SIZE]; 2. В файле ld перенес сектор .heap который там уже был, под сектор .co_stack Код /* .stack_dummy section doesn't contains any symbols. It is only * used for linker to calculate size of stack sections, and assign * values to stack symbols later */ .co_stack (NOLOAD): { . = ALIGN(8); *(.co_stack .co_stack.*) } > ram
.heap (COPY): { __end__ = .; _end = __end__; end = __end__; *(.heap*) __HeapLimit = .; } > ram /* Set stack top to end of ram , and stack limit move down by * size of stack_dummy section */ __StackTop = ORIGIN(ram ) + LENGTH(ram ); __StackLimit = __StackTop - SIZEOF(.co_stack); PROVIDE(__stack = __StackTop); /* Check if data + heap + stack exceeds ram limit */ ASSERT(__StackLimit >= __HeapLimit, "region ram overflowed with stack") В файле syscalls.c вообще ничего не менял. Вот map файл который получился, и как видно из скриншота, функция calloc возвращает указатель именно из области сектора .heap Но только не пойму как работает ограничение, когда вылезаем за размеры кучи. Дело в том, что даже если я ставлю HEAP_SIZE 0x00000010. Программа работает но там явно память выделяется за границами кучи.
Сообщение отредактировал maxntf - Apr 16 2016, 15:02
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
|
Apr 16 2016, 15:40
|

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

|
Сначала вот вам картинка распределения ОЗУ: - начало ОЗУ
- переменные
- переменные
- переменные
- сюда вы зачем-то засунули секцию co_stack
- начало кучи
- ↓куча растёт в сторону конца ОЗУ
- ↓куча растёт в сторону конца ОЗУ
- тут пусто
- тут пусто
- тут могут встретиться стек и ОЗУ
- тут пусто
- тут пусто
- ↑сюда растёт стек
- ↑сюда растёт стек
- начало стека (конец ОЗУ)
Теперь пояснения. секция co_stack, вероятно, фальшивая. То есть, для дела важен только её размер. Вкупе со значением HEAP_SIZE это позволяет линкеру выдать ошибку, если суммарный размер стек+куча+переменные превысит размер ОЗУ. То, что вы поместили эту секцию после секции text и перед секцией .heap, просто оставило неиспользуемый кусок ОЗУ между переменными и кучей. Размер использованной кучи, скорее всего, не проверяется (можете посмотреть на функцию _sbrk() в syscalls.c. Максимум, что обычно делается - контролируется встреча кучи и стека. (И то далеко не всегда).
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Apr 16 2016, 18:06
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008

|
Цитата(AHTOXA @ Apr 16 2016, 18:40)  - начало ОЗУ
- переменные
- переменные
- переменные
- сюда вы зачем-то засунули секцию co_stack
- начало кучи
- ↓куча растёт в сторону конца ОЗУ
- ↓куча растёт в сторону конца ОЗУ
- тут пусто
- тут пусто
- тут могут встретиться стек и куча
- тут пусто
- тут пусто
- ↑сюда растёт стек
- ↑сюда растёт стек
- начало стека (конец ОЗУ)
Во первых, огромное спасибо за наглядную картинку - сразу много вещей стало понятно! Редко на форуме понимают тех кто только начинает осваивать новое. Цитата(AHTOXA @ Apr 16 2016, 18:40)  Размер использованной кучи, скорее всего, не проверяется (можете посмотреть на функцию _sbrk() в syscalls.c. Максимум, что обычно делается - контролируется встреча кучи и стека. (И то далеко не всегда). Из вашего ответа, у меня напрашивается законный вопрос, почему на всех встречающихся примерах всегда указывается размер стека, и кучи? Честно говоря я думал что стек и куча ограничиваются размером. P.S. Цитата(AHTOXA @ Apr 16 2016, 18:40)  - сюда вы зачем-то засунули секцию co_stack
Это coocox делает по умолчанию в new_project. и GCC предлагает свой ld с таким расположением. Цитата(AHTOXA @ Apr 16 2016, 18:40)  секция co_stack, вероятно, фальшивая. Только вспомнил! По адресу 0х08000000 указан адрес 0х200055А8. То есть начало стека, так что получается что стек двигается с этого адреса в конец памяти?
Сообщение отредактировал maxntf - Apr 16 2016, 18:12
|
|
|
|
|
Apr 16 2016, 18:40
|

отэц
    
Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684

|
Цитата(maxntf @ Apr 16 2016, 21:06)  Во первых, огромное спасибо за наглядную картинку - сразу много вещей стало понятно!  Цитата Только вспомнил! По адресу 0х08000000 указан адрес 0х200055А8. То есть начало стека, так что получается что стек двигается с этого адреса в конец памяти? ..главное похвалить, а саму схему можно не читать.
--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0 SHA-256
|
|
|
|
|
Apr 16 2016, 19:04
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 13-05-09
Пользователь №: 49 008

|
Цитата(Lmx2315 @ Apr 16 2016, 21:40)   ..главное похвалить, а саму схему можно не читать. Да нет, схему я как раз понял. Только в стандартном варианте было примерно так, в понедельник точный map на работе посмотрю и покажу. Код .heap 0x200055a0 0x0 0x200055a0 __end__ = . 0x200055a0 _end = __end__ 0x200055a0 end = __end__ *(.heap*) .co_stack 0x200055a0 0x2000 ...... 0x200055a0 . = ALIGN (0x8) *(.co_stack .co_stack*) 0x200055a0 0x2000 ...... 0x200055a0 __HeapLimit = . 0x20020000 __StackTop = ....... 0x2001e000 __StackLimit = ....... Я думал что co_stack это начало стека, и адрес кучи находится там же где и начало стека. По этому и начал пытаться перенести кучу. Точнее вообще понять где она расположена, и как задать ей размер. P.S. Я подключил библиотеку декодера speex, и при его инициализации у меня программа улетала в Default_Handler. Скорее всего из за того, что происходило прерывание, обработчик которого я не включил (наверное прерывание по переполнению стека). Программа улетала, когда выполнялась calloc 3-й раз. Я увеличил значение STACK_SIZE и все пошло. Получается что calloc выделяло память из адресного пространства стека (возвращало 0x200055a8), а адрес начала стека все таки 0x200055a0? Или я все не так понял?
Сообщение отредактировал maxntf - Apr 16 2016, 19:24
|
|
|
|
Сообщений в этой теме
maxntf Coocox настройка heap? Apr 16 2016, 14:51  AHTOXA Цитата(maxntf @ Apr 16 2016, 23:06) Из ва... Apr 16 2016, 18:18 maxntf Вроде пришло понимание части вопросов! Что при... Apr 18 2016, 12:01 zltigo QUOTE (maxntf @ Apr 18 2016, 15:01) [*] Э... Apr 18 2016, 12:13  maxntf QUOTE (zltigo @ Apr 18 2016, 15:13) Разум... Apr 18 2016, 12:34   zltigo QUOTE (maxntf @ Apr 18 2016, 15:34) Тогда... Apr 18 2016, 13:47 AHTOXA Цитата(maxntf @ Apr 18 2016, 17:01) - из ... Apr 18 2016, 13:49  maxntf Цитата(AHTOXA @ Apr 18 2016, 16:49) Непон... Apr 18 2016, 15:05   AHTOXA Цитата(maxntf @ Apr 18 2016, 20:05) С эти... Apr 18 2016, 16:43 maxntf Вух!!!, вроде все понял. Много вопросо... Apr 19 2016, 09:59 AHTOXA Цитата(maxntf @ Apr 19 2016, 14:59) В ито... Apr 19 2016, 10:48  zltigo QUOTE (AHTOXA @ Apr 19 2016, 13:48) Ну чт... Apr 19 2016, 11:06  maxntf Уважаемые AHTOXA и zltigo спасибо Вам за помощь... Apr 19 2016, 13:45   zltigo QUOTE (maxntf @ Apr 19 2016, 16:45) Тогда... Apr 19 2016, 14:28    maxntf Цитата(zltigo @ Apr 19 2016, 17:28) Если ... Apr 19 2016, 15:41     zltigo QUOTE (maxntf @ Apr 19 2016, 18:41) Когда... Apr 19 2016, 15:58      maxntf Цитата(zltigo @ Apr 19 2016, 18:58) Будет... Apr 19 2016, 16:02       zltigo QUOTE (maxntf @ Apr 19 2016, 19:02) То ес... Apr 19 2016, 16:14        maxntf Цитата(zltigo @ Apr 19 2016, 19:14) Прогр... Apr 19 2016, 17:30
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|