Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры 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. Просмотров 3521. Ответов 9
Метки нет (Все метки)

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

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

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

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

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

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

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

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

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

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

Из malloc-free в new delete
Есть код с выделением памяти с помощью malloc, надо сделать с new delete Вроде сделал,...

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
30.03.2013, 16:37
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
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2013, 18:29

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

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

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


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

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

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