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

 
 
> Получение свободного объема кучи, В ходе работы. CrossWorks 1.7.13
YChebisheva
сообщение Mar 24 2009, 09:14
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 21
Регистрация: 9-01-09
Пользователь №: 43 070



Есть ли какие-нить макросы, чтобы в ходе работы можно было знать, к примеру, адрес начала, конца и сколько осталось свободного места в куче?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
YChebisheva
сообщение Mar 24 2009, 12:07
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 21
Регистрация: 9-01-09
Пользователь №: 43 070



Парни, у меня не стоит задача, оптимизировать работу с памятью.
Если я смотрю map-файл:

.heap 0x40002458 0x400
0x40002458 __heap_start__ = .
*(.heap)
0x40002858 . = (((__heap_start__ + __HEAPSIZE__) MAX_K .) ALIGN 0x4)
*fill* 0x40002458 0x400 00
0x40002858 __heap_end__ = (__heap_start__ + SIZEOF (.heap))
0x00000001 . = ASSERT (((__heap_end__ >= __SRAM_segment_start__) && (__heap_end__ <= (__SRAM_segment_start__ + 0x4000))), error: .heap is too large to fit in SRAM memory segment)
0x40002858 __stack_load_start__ = (__heap_end__ ALIGN 0x4)

Получается, что у меня куча начинается с 0x40002458. Объем 1 Кб. Его размер я могу поменять. Память выделяет с конца кучи к началу.
Но сразу после инициализации, я делаю так:
Код
system_init();
spi0_mem_init();
ctl_global_interrupts_enable();    
UART0Initialize(38400, InterruptCom0);
char *s = (char*) malloc(1);
printf("     %p      ", s);
free(s);

Адрес s мне показывается - 284с. А конец кучи - 2858. Вроде как 13 байт. Но почему не 16? Ведь если следом запросить, к примеру 5 байт из кучи, адрес будет - 283с.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 24 2009, 12:24
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(YChebisheva @ Mar 24 2009, 15:07) *
Если я смотрю map-файл:
0x40002858 __heap_end__ = (__heap_start__ + SIZEOF (.heap))


Если линкер поставляет Вам (компилеру)  __heap_end__ , то зачем эти пассы:

Код
char *s = (char*) malloc(1);



если можно просто s=__heap_end__;
Go to the top of the page
 
+Quote Post
YChebisheva
сообщение Mar 24 2009, 12:39
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 21
Регистрация: 9-01-09
Пользователь №: 43 070



Цитата(_Pasha @ Mar 24 2009, 15:24) *
Если линкер поставляет Вам (компилеру)  __heap_end__ , то зачем эти пассы:
Код
char *s = (char*) malloc(1);

если можно просто s=__heap_end__;

В том то и беда, что на все эти попытки, имеем одно:
Цитата
'__heap_end__' undeclared (first use in this function
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- YChebisheva   Получение свободного объема кучи   Mar 24 2009, 09:14
- - etoja   Цитата(YChebisheva @ Mar 24 2009, 12:14) ...   Mar 24 2009, 09:33
|- - FormatCft   Цитата(etoja @ Mar 24 2009, 14:33) Адрес ...   Mar 24 2009, 09:42
- - _Pasha   Цитата(YChebisheva @ Mar 24 2009, 12:14) ...   Mar 24 2009, 09:45
- - FormatCft   Цитата(YChebisheva @ Mar 24 2009, 14:14) ...   Mar 24 2009, 09:51
|- - klen   я использую FreeRTOS, там есть три реализации malo...   Mar 24 2009, 09:56
|- - FormatCft   Цитата(klen @ Mar 24 2009, 14:56) я испол...   Mar 24 2009, 10:05
|- - klen   Цитата(FormatCft @ Mar 24 2009, 13:05) Из...   Mar 24 2009, 10:12
|- - _Pasha   Цитата(YChebisheva @ Mar 24 2009, 15:39) ...   Mar 24 2009, 13:04
- - YChebisheva   _Pasha, левые адреса возвращает: printf("%p...   Mar 24 2009, 13:14
|- - FormatCft   Цитата(YChebisheva @ Mar 24 2009, 18:14) ...   Mar 24 2009, 14:01
- - _Pasha   Это я глупость сморозил, должно быть так: Кодexte...   Mar 24 2009, 14:02
- - YChebisheva   Спасибо. Всё работает   Mar 25 2009, 08:49


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 11:23
Рейтинг@Mail.ru


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