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

 
 
> STM32L151 падает при выделении памяти, Сваливается в Default_Handler() при вызове malloc()
Haamu
сообщение Feb 28 2016, 19:09
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587



Контроллер STM32L151RB, CoIDE. Создаю проект, добавляю из репозитория cmsis_boot и CMSIS_core. Собирается, отладка запускается без проблем. Добавляю строку:
Код
uint8_t * ptr = malloc(4);

Не собирается, ругается что не определена функция _sbrk(). Добавляю из репозитория C Library. Собирается. Запускаю отладку. Дохожу до вызова malloc(), и программа падает в Default_Handler(). Если определить все обработчики ошибок, то сваливается в HardFault.
Проделываю точно такую-же последовательность действий, но уже с STM32F407. Без проблем, память выделяется.
Что я делаю не так? Или может какая-то особенность есть с динамическим выделением памяти у этих STM32L151? Если все-же я что-то не так делаю, буду очень благодарен, если кто-то поделится пустой заготовкой проекта в CoIDE, чтобы нормально память выделялась.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Aaron
сообщение Mar 1 2016, 07:04
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



посмотрите ld-файлы для STM32F407 и для STM32L151 - может, у вас ссылки на heap в скриптах по-разному заданы? может, для 151 размер кучи = 0?
Go to the top of the page
 
+Quote Post
Haamu
сообщение Mar 2 2016, 06:38
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587



Цитата(Aaron @ Mar 1 2016, 10:04) *
посмотрите ld-файлы для STM32F407 и для STM32L151 - может, у вас ссылки на heap в скриптах по-разному заданы? может, для 151 размер кучи = 0?

Совпадают слово в слово. Разве что в 407 еще ram1 есть.

Все-таки посмотрел ассемблер и память, и стало более понятно.
Нашел в startup файле 151го такую особенность:
Код
void Default_Reset_Handler(void)
{
  /* Initialize data and bss */
//  unsigned long *pulSrc, *pulDest;

  /* Copy the data segment initializers from flash to SRAM */
//  pulSrc = &_sidata;
//
//  for(pulDest = &_sdata; pulDest < &_edata; )
//  {
//    *(pulDest++) = *(pulSrc++);
//  }
//
//  /* Zero fill the bss segment. */
//  for(pulDest = &_sbss; pulDest < &_ebss; )
//  {
//    *(pulDest++) = 0;
//  }

  /* Setup the microcontroller system. */
  SystemInit();
    
  /* Call the application's entry point.*/
  main();
}

Из-за этого в начале SRAM находился какой-то мусор и в процессе работы функции malloc в один момент происходило деление на 0.
Раскомментировал этот кусок. Мусор стал более системотизированным, но остался мусором (в сравнении с 407). Куда дальше копать?
И еще заметил особенность. Во всех других ARMах и не только, при инициализации структуры таким вот образом:
Код
static type struct_name = {};

все поля структуры инициализируются нулями. А тут почему-то в них тоже какой-то мусор находится.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Mar 2 2016, 09:49
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(Haamu @ Mar 2 2016, 09:38) *
Нашел в startup файле 151го такую особенность:
Код
void Default_Reset_Handler(void)
...

Удивительная штука эти кокосы...
Либо этот файл не используется, либо никто никогда не пробовал с этими исходниками работать.

Вопросы:
этот кусок вызывается? (проще всего проверить - поставить внутрь брекпоинт).
чему равны адреса _sdata, _edata, _sbss, _ebss, _sidata ? Можно посмотреть в map-файле. Заодно можно посмотреть их объявления в скрипте линкера.


PS а вообще - давно пора самый минимальный пример куда-нибудь на гугл-диск выложить...


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 11th August 2025 - 12:02
Рейтинг@Mail.ru


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