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

 
 
> Размер исполняемого файла не влез в отведённую память, что можно уменьшить?, Работаю в SDK от Xilinx, это допиленный Eclipse, как я понимаю
Krys
сообщение Dec 18 2014, 04:20
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 002
Регистрация: 17-01-06
Из: Томск, Россия
Пользователь №: 13 271



Здравствуйте. Не уверен, что выбрал правильный раздел. Если что - поправьте пожалуйста. В этом разделе в основном обсуждаются аппаратные проблемы использования встраиваемых систем, чистых программистов там мало похоже, судя по отсутствию ответов на мои вопросы начинающего. А проблема у меня чисто програмерская, нужно глубоко понимать, как что компилится и линкуется.
Я новичок в программировании под Microblaze (ARM-ядро, если не путаю), работаю в SDK от Xilinx, это допиленный Eclipse, как я понимаю. Пользоваться толком не умею, поэтому, думаю, и проблемы.
Проблема такая. На этапе компиляции всего проекта вылазят такие ошибки:

Код
fft_sp605.elf section `.text' will not fit in region `microblaze_0_i_bram_ctrl_microblaze_0_d_bram_ctrl'    fft_sp605             C/C++ Problem

region `microblaze_0_i_bram_ctrl_microblaze_0_d_bram_ctrl' overflowed by 63912 bytes    fft_sp605             C/C++ Problem


Всего мне отведено 8кБ памяти в ПЛИС. Моя программа небольшая реально, на пару страниц кода. Библиотеки почти не используются, ёмкие функции не вызываются. Почти уверен, что должна влезть в отведённую память. Ну хотя бы даже не влезть, но не в 8 же раз ей не хватает...

Начал лазить по файлам, смотреть, кто чего сколько потребил. Вот тут накопал:

файл main.o:
CODE
architecture: MicroBlaze, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000

Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000000 00000000 00000000 00000034 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000000 00000000 00000000 00000034 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000000 00000000 00000000 00000034 2**0
ALLOC
3 .rodata 00000298 00000000 00000000 00000034 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .text.main 00000f5c 00000000 00000000 000002cc 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
5 .debug_frame 00000040 00000000 00000000 00001228 2**2
CONTENTS, RELOC, READONLY, DEBUGGING
6 .debug_info 0000054d 00000000 00000000 00001268 2**0
CONTENTS, RELOC, READONLY, DEBUGGING
7 .debug_abbrev 00000130 00000000 00000000 000017b5 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_loc 0000002e 00000000 00000000 000018e5 2**0
CONTENTS, RELOC, READONLY, DEBUGGING
9 .debug_aranges 00000020 00000000 00000000 00001913 2**0
CONTENTS, RELOC, READONLY, DEBUGGING
10 .debug_ranges 00000010 00000000 00000000 00001933 2**0
CONTENTS, RELOC, READONLY, DEBUGGING
11 .debug_line 000006c4 00000000 00000000 00001943 2**0
CONTENTS, RELOC, READONLY, DEBUGGING
12 .debug_macinfo 0000eb39 00000000 00000000 00002007 2**0
CONTENTS, READONLY, DEBUGGING

13 .debug_str 00000428 00000000 00000000 00010b40 2**0


Файл platform.o
CODE
architecture: MicroBlaze, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000

Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000000 00000000 00000000 00000034 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000000 00000000 00000000 00000034 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000000 00000000 00000000 00000034 2**0
ALLOC
3 .text.enable_caches 00000040 00000000 00000000 00000034 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
4 .text.disable_caches 00000040 00000000 00000000 00000074 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
5 .text.init_uart 00000020 00000000 00000000 000000b4 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
6 .text.init_platform 00000040 00000000 00000000 000000d4 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
7 .text.cleanup_platform 00000034 00000000 00000000 00000114 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
8 .debug_frame 0000009c 00000000 00000000 00000148 2**2
CONTENTS, RELOC, READONLY, DEBUGGING
9 .debug_info 000000df 00000000 00000000 000001e4 2**0
CONTENTS, RELOC, READONLY, DEBUGGING
10 .debug_abbrev 00000041 00000000 00000000 000002c3 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_loc 000000dc 00000000 00000000 00000304 2**0
CONTENTS, RELOC, READONLY, DEBUGGING
12 .debug_aranges 00000040 00000000 00000000 000003e0 2**0
CONTENTS, RELOC, READONLY, DEBUGGING
13 .debug_ranges 00000030 00000000 00000000 00000420 2**0
CONTENTS, RELOC, READONLY, DEBUGGING
14 .debug_line 000000f3 00000000 00000000 00000450 2**0
CONTENTS, RELOC, READONLY, DEBUGGING
15 .debug_macinfo 000100c2 00000000 00000000 00000543 2**0
CONTENTS, READONLY, DEBUGGING

16 .debug_str 00000169 00000000 00000000 00010605 2**0
CONTENTS, READONLY, DEBUGGING


Тут видно, что секции debug слишком жирные.

Я честно говоря вообще толком не знаю, где что правильно посмотреть и как настроить какие размеры сегментов. Даже не знаю, как посмотреть, сколько моя программа занимает отдельно, а сколько переменные отдельно и т.п.

Логичным решением вроде является не использовать отладку, раз дебуг секция не лезет. Но, насколько я знаю, многие разработчики прекрасно отлаживаются с таким же объёмом памяти, так что проблема видимо, что я где-то что-то не так настроил.

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

Заранее спасибо.


--------------------
Зная себе цену, нужно ещё и пользоваться спросом...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Dec 19 2014, 07:31
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Чет я капитально все забыл что с микроблайзом связано, хотя это скорее к gcc
Галочки и правда нет,
Projecp propirties -> C/C++ Buil -> Settings - MicroBlaze gcc Linker
и там в секции
Miscellaneous -> Linker Flags, забил -Wl,-Map -Wl,"..путь..mem.map"

то есть фактически как вы сделал, только в другом месте флажок ставил... реальной галки нет

по поводу функции у меня была DecToHex
которая 32 битное число обрабатывала по 4 младших бита, кейзом выбирала символ от 0 до F, и сдвигало на 4 бита. Самый малая трата ресурсов, потому что иначе приходиться делить, целочисленно, но делить.

sym = Data % 10;
Data -= sym;
Data /= 10;
и кейзом выбираете символ от 0 до 9.

и таких итераций либо пока Data в 0 не уйдет либо фиксированное число. Но это по ресурсам сильно больше.

Опять же через хекс вы передаете бинарь. То есть фактически можете передать даже флоат и дабл. И можно сделать свой ком порт терминальчик который будет раскодировать числа. То есть в дебуг вывод добавляете что-то типа
#Df - дальше флотовское число
#Dd - дальше добловское
и прикладываете хекс. А ваш терминальчик парсит либо входной лог, либо сохранненый из обычного терминала и значения вида #Di0011, заменяет на 17 сразу сам. Но я обошелся без автопарсера, в отладке обычно редко надо прям следить за значениями, важно их сочетание и все... ИМХО
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 06:56
Рейтинг@Mail.ru


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