Перейти к содержанию
    

Освоение ARM контроллеров

Как Вы смотрите бинарник? Как там видите адреса?

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

Изменено пользователем maxntf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это смотря какой режим - не только на кортексах свет клином сошелся.

Здесь сошёлся. По некоторым признакам, у него Cortex-M4. Если ему ещё про что-то другое вещать, совсем зависнет :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Афаик нужно после смены адреса таблицы прерываний надо всадить DSB для повышения кошерности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я отлаживаю в кейле. Там можно подключить скрипт отладчика. В скрипте пишу

SP = *(int*)0x08001000;
PC = *(int*)0x08001004;

И всё.

А где именно это можно сделать, можно подробнее?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А где именно это можно сделать, можно подробнее?

В свойствах проекта во вкладке "отладчик" можно указать файл скрипта инициализации. Можно назвать файл "debug.ini", и в нём всё это написать.

У меня линия RESET от отладчика к МК не подключена, поэтому я вместо загрузчика ставлю заглушку типа "while (1) {}". После сброса МК втыкается в эту заглушку, потом подключается отладчик и принимает дела.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подключил FreeRTOS, пока практически пустой проект 3 задачи для теста - 1-я контроль кнопки, 2-я передача строки "Hello World" в UART и 3-я мигание индикаторами.

Хотя в FreeRTOSConfig.h и стоит #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 75 * 1024 ) ) , но в SRAM забрало очень много места, почти 60% всей ОЗУ.

Program Size:

12440 28 79288 91756 1666c main.elf

text data bss dec hex filename

Подскажите почему так? Смотрел в map файле я так понимаю что все жрет heap_2.c

*fill* 0x200001aa 0x6

.bss 0x200001b0 0x12c14 ..\obj\heap_2.o

*(COMMON)

COMMON 0x20012dc4 0xe ..\obj\main.o

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блин сам и напоролся. Смотрел конфиг из чужого проекта, там было #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) ). А то что у меня 75 стоит и не обратил внимания!

 

Изменено пользователем maxntf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрел в map файле я так понимаю что все жрет heap_2.c

Вообще в идеале heap должен занимать ВООБЩЕ ВСЮ свободную память. Посему любые константные дефиниции его размера в корне порочны. Следует слегка постараться и отдавать хипу всю память от конца статически распределенной компилятором до конца памяти контроллера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Следует слегка постараться и отдавать хипу всю память от конца статически распределенной компилятором до конца памяти контроллера.

 

Интересно, каким способом???

Я например точно знаю что GCC не умеет считать размер стека прерываний в режиме перепроцессора. Уже потом в отладке, фоновым процессом самого отладчика контролируется нижняя граница, и только в одном режиме ядра - для ос это уже недоступно. Копал долго и упорно, но возможно что-то упустил.

 

Для себя эту проблему решил простым способом: heap условно растёт в верх, на встречу стеку. Условно, потому-что свой heap, для gcc он нулевой, используется только точка старта. При заполнении всей памяти - новые задачи и новый маллок морозится, пока жирность не спадёт. Очень удобно однако.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Интересно, каким способом???

Как и любое выделение памяти.

Я например точно знаю что GCC не умеет считать размер стека прерываний в режиме перепроцессора. Уже потом в отладке, фоновым процессом самого отладчика контролируется нижняя граница, и только в одном режиме ядра - для ос это уже недоступно. Копал долго и упорно, но возможно что-то упустил.

Подумате головой и выделите именно стеку фиксированный размер памяти. Отдавать стеку ВСЕ свободное пространство, причем НИКАК его размер не контролировать в надежде, что хватит, это безумие.

Для себя эту проблему решил простым способом: heap условно растёт в верх, на встречу стеку.

Навстречу чему, это уже зависит только от Вас, поскольку где Вы расположите стеки(и) там они они и будут.

У меня системные стеки внизу.

Условно, потому-что свой heap, для gcc он нулевой, используется только точка старта.

Нулевой это перебор. Можно указать в для статической линковки какой-то минимальный размер для старта системы. Потом уже при запуске узанать верхнюю границу памяти и сказать мереждеру, что от начала статически слинковоного блока и до конца свободной памяти все его.

Пример распределения памяти для ARM7

define symbol Code_start = 0x00000000;

// Memory Regions -----------------------------------------------------------
// 256K ROM memory
define symbol ROM_start   = 0x00000000;
define symbol ROM_end	 = 0x00007FFF;
// 16K RAM memory
define symbol RAM_start   = 0x40000000;
define symbol RAM_end	 = 0x40001FFF;

// Memory Block Sizes
define symbol SIZE_CSTACK	= 0x20;	 // Dummy System/User Stack Size (Not Used!)
define symbol SIZE_SVCSTACK  = 0x180;	// Supervisor Mode (Main Work Mode)
define symbol SIZE_IRQSTACK  = 0x200;
define symbol SIZE_FIQSTACK  = 0x40;	 //
define symbol SIZE_XXXSTACK  = 0x20;   	 // 32bytes Shared Stack for Abort/Undefined Instruction	and IAP Buffer
define symbol SIZE_HEAP_RTOS = 0x400; 	 // 1Kb - Dummy _minimal_ space for Memory Manager

define memory mem with size = 4G;
define region ROM   	   = mem:[from ROM_start to ROM_end];
define region RAM   	   = mem:[from RAM_start to RAM_end - SIZE_XXXSTACK];
define region RAM_endblock = mem:[from RAM_end - SIZE_XXXSTACK + 1 to RAM_end];

define block CSTACK	with alignment=8, 	size = SIZE_CSTACK { };
define block SVC_STACK with alignment=8, 	size = SIZE_SVCSTACK { };
define block IRQ_STACK with alignment=8, 	size = SIZE_IRQSTACK { };
define block FIQ_STACK with alignment=8, 	size = SIZE_FIQSTACK { };
define block HEAP_RTOS with alignment=8, 	size = SIZE_HEAP_RTOS { };
define block XXX_BLOCK with alignment=8, 	size = SIZE_XXXSTACK { };
define block CHECKSUM { readonly section .checksum };

initialize by copy { readwrite };
do not initialize  { section .noinit };

place in ROM { readonly section .intvec };
place in ROM { readonly };
place in ROM { block CHECKSUM };

place in RAM { readwrite,
			 	block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK };
place in RAM { block HEAP_RTOS  };

place in RAM_endblock {
		   block XXX_BLOCK };

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как и любое выделение памяти.

 

Нулевой это перебор. Можно указать в для статической линковки какой-то минимальный размер для старта системы. Потом уже при запуске узанать верхнюю границу памяти и сказать мереждеру, что от начала статически слинковоного блока и до конца свободной памяти все его.

 

Ну я и вижу как вы мучаетесь, в ручном режиме считая байты.

Нижняя граница свободной памяти равна стартовому адресу heap, этого более чем достаточно для моего менеджера памяти.

 

Хотя я надеялся увидеть хитрую трёхэтажную запись мнемониками перепроцесора самого GCC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну я и вижу как вы мучаетесь, в ручном режиме считая байты.

Это Вы маятесь дурью НЕ задавая размера стека в безосновательной надежде, на то, что он не наедет на кучу.

Хотя я надеялся увидеть хитрую трёхэтажную запись мнемониками перепроцесора самого GCC.

Надежды на чудесные, но нереальные решения и прочие авось, не к лицу инженерам. Размеры стеков придется придется оценивать, указывать и контролировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это Вы маятесь дурью НЕ задавая размера стека в безосновательной надежде, на то, что он не наедет на кучу.

 

Желаю вам научится читать чужие сообщения.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Желаю вам научится читать чужие сообщения.

Именно по тому, что не только читал, но и ПОНЯЛ, и написал, что Ваш "метод" не решает ничего. И в примере своем не просто так ARM7 привел с его множеством стеков (то же самое и старшие кортексы) при котрых Ваша идея, что размер стека сам собой устаканитися и думать о его размере не надо, вообще не пригодна в принципе. Собственно все у Вас работает только по причине что У Вас пока явный избыток памяти всегда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...