Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/17: Рейтинг темы: голосов - 17, средняя оценка - 4.88
pmdr_soft
0 / 0 / 0
Регистрация: 15.03.2010
Сообщений: 287
1

malloc/free

30.03.2013, 13:11. Просмотров 3223. Ответов 9
Метки нет (Все метки)

Делаю устройство.

Atmega16. Принимает пакеты по RF. Всего полезных данных передается 512 байт. Они влазят в 10 пакетов.

Знаю номер каждого пакета в посылке. При поступлении первого пакета из посылки начинаю ждать остальные. каждый проверяю crc и номер в посылке. Если что то не так, все обнуляем и ждем опять первого пакета.

При приеме первого пакета делаю malloc на весь объем данных (512 байт). Каждый раз принимая пакет выделяю память на 54 байта. там раскладываю структуру: служебные поля, номер пакета, crc и тп + данные.

Дык вот. Принимая 3 пакет все останавливается на malloc(54).

Подозреваю что все дело в heap_stort и heap_end. Научите пользоваться. Первый раз динамической памятью пользуюсь.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2013, 13:11
Ответы с готовыми решениями:

Грабли malloc/free
С динамической памятью впервой работаю, от сюда и грабли Есть структура ...

когда студия 5 то выйдет рабочая версия и она free???
будет ли она бесплатной?и я так понял в ней встроенный си компиллер будет?

ATMega8: Виснет "Free Running Mode" (решено, просто туплю)
Настраиваю АЦП: опорное AVCC, выровнить по левому краю, канал ADC5 OUTI ADMUX,...

malloc, free error
Здравствуйте. Возникла следующая проблема. Код ниже: string http_headers...

SIGABRT после free malloc
не могу почистить string array matches (2 dim) проблема возникает на линии 114...

9
_pv
0 / 0 / 0
Регистрация: 06.06.2011
Сообщений: 2,515
30.03.2013, 15:01 2
там памяти-то всего килобайт, зачем выделять её динамически???
0
soxop
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
30.03.2013, 15:46 3
http://www.nongnu.org/avr-libc/usir-manual/malloc.html

там памяти-то всего килобайт, зачем выделять её динамически???
Для удобства. Вы начали предложение так, как будто от размера памяти что-то принципиально зависит.
0
pmdr_soft
0 / 0 / 0
Регистрация: 15.03.2010
Сообщений: 287
30.03.2013, 16:37 4
[QUOTE="soxop"]http://www.nongnu.org/avr-libc/usir-manual/malloc.html

[QUOTE="Цитата:[/QUOTE]
там памяти-то всего килобайт, зачем выделять её динамически???
Для удобства. Вы начали предложение так, как будто от размера памяти что-то принципиально зависит.

Это я читал.

Линкеру скармливаю такую строку
LDFLAGS = -Wl,--gc-sections,-Map=$(OBJDIR)/$(TARGET).map,--cref,--defsym=__heap_stort=0x80062,--defsym=__heap_end=0x800400

Но malloc(1) все равно возвращает NULL
0
soxop
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
30.03.2013, 17:08 5
1. С дефолтными настройками кучи не пробовали (без указания дополнительных опций линкеру)?
2. Почему __heap_stort=0x80062? Нолик забыли?
3. Тупо память кончилась. У вас .data и .bss большие?
0
pmdr_soft
0 / 0 / 0
Регистрация: 15.03.2010
Сообщений: 287
30.03.2013, 17:13 6
Нолик забыл. Поправил - не помогло.

out/main.elf: file format elf32-avr

Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000392 00000000 00000000 00000094 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000006 00800060 00000392 00000426 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000007 00800066 00800066 0000042c 2**0
ALLOC
3 .debug_aranges 000001a0 00000000 00000000 0000042c 2**0
CONTENTS, READONLY, DEBUGGING
4 .debug_pubnames 0000030d 00000000 00000000 000005cc 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_info 00001944 00000000 00000000 000008d9 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_abbrev 00000819 00000000 00000000 0000221d 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_line 00001555 00000000 00000000 00002a36 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_frame 000002a0 00000000 00000000 00003f8c 2**2
CONTENTS, READONLY, DEBUGGING
9 .debug_str 000006ab 00000000 00000000 0000422c 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_loc 000008b1 00000000 00000000 000048d7 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_ranges 000001f0 00000000 00000000 00005188 2**0
CONTENTS, READONLY, DEBUGGING
0
soxop
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
30.03.2013, 17:17 7
На первый вопрос вы не ответили.

В указанном дампе я мало что понял, но вы уверены, что у вас куча не перекрывается с .data и .bss?
0
pmdr_soft
0 / 0 / 0
Регистрация: 15.03.2010
Сообщений: 287
30.03.2013, 17:21 8
с дефолтными тоже не работает.

не уверен что не перекрывается.

но эта строка
.data 00000006 00800060 00000392 00000426 2**0

говорит, что размер data 6 байт. Не знаю как сделать больше.
0
soxop
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 483
30.03.2013, 17:53 9
Зачем её делать больше? У вас .data занимает 00800060-00800065, .bss 00800066-0080006c, значит __heap_stort должен быть 0x80006d, а __heap_end=0x8003ff.

__heap_stort надо пересчитывать, если у вас добавляются переменные в ROM. По идее это линкер должен сам считать. Непонятно, почему по дефолту у вас ничего не работает.

__heap_end тоже надо брать меньше, ибо стек по дефолту растёт сверху вниз. Кто знает, может в старших адресах аллокатор хранит свои служебные данные, а вы их стирается при первом использовании стека. Скомпилируйте с -S, получите ассмеблерный листинг, где будет указан расход стека. Отнимите это число (лучше с запасом) от 0x8003ff.
0
pmdr_soft
0 / 0 / 0
Регистрация: 15.03.2010
Сообщений: 287
30.03.2013, 18:29 10
Цитата Сообщение от soxop
Зачем её делать больше? У вас .data занимает 00800060-00800065, .bss 00800066-0080006c, значит __heap_stort должен быть 0x80006d, а __heap_end=0x8003ff.

__heap_stort надо пересчитывать, если у вас добавляются переменные в ROM. По идее это линкер должен сам считать. Непонятно, почему по дефолту у вас ничего не работает.

__heap_end тоже надо брать меньше, ибо стек по дефолту растёт сверху вниз. Кто знает, может в старших адресах аллокатор хранит свои служебные данные, а вы их стирается при первом использовании стека. Скомпилируйте с -S, получите ассмеблерный листинг, где будет указан расход стека. Отнимите это число (лучше с запасом) от 0x8003ff.
все понял. спасибо.
0
30.03.2013, 18:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2013, 18:29

Собственная реализация malloc, free
Нужно написать собственную реализацию malloc, free без использования calloc и...

Освобождение памяти malloc free
В общем работаю над расширением для php (для тренировки в php и в c++ сразу)...

Управление памятью с использованием malloc и free
int n=3; int * v = (int*) malloc(n*sizeof(int)); // обьявил вектор из 3-х...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru