Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Локальный массив - не выделяется память?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Vladimir Prokofiev
функция:

Код
void TestSD( void ){
  uint8_t buf[5000];
  
  for( i = 0; i < 1024; i++ ){
    buf[i] = 5;
  }


После этих строк я вижу, что моя "5" появилась в чужих переменных. Как такое может быть, я же ему явно указал его размер?
И как в иаре узнать сколько памяти сейчас выделено/осталось?
Еще вопрос не в тему, кто-то говорил, что для определенных задач выделение памяти во время исполнения считается плохим тоном. Не могу придумать чем это плохо, если правильно делать
KnightIgor
Переменная выделяется в стеке (sub sp, sp, #5000). У Вас его размер достаточен для размещения почти 5 кило?
_4afc_
Цитата(Vladimir Prokofiev @ Apr 4 2012, 18:33) *
После этих строк я вижу, что моя "5" появилась в чужих переменных.
Как такое может быть, я же ему явно указал его размер?


1. Переполнение стэка.
2. Новые чужие переменные не имеют значения по умолчанию.

Дурной тон - это при религиозном взгляде на программирование.
Если у вас однозадачная система и нет рекурсивных вызовов - какая разница?
А следить за тем чтоб память не кончилась желательно всегда!
Vladimir Prokofiev
Цитата(KnightIgor @ Apr 4 2012, 18:47) *
Переменная выделяется в стеке (sub sp, sp, #5000). У Вас его размер достаточен для размещения почти 5 кило?

Да, спасибо, кажется это ответ. Я Сделал CSTACK больше и вроде сработало. А как узнать какой размер выделить под стеки?
Можно еще вопросов глупых позадовать:
1. Память, выделяемая динамически, как то malloc тоже выделяется в стеке CSTACK?
2. Если используем, например, FreeRtos, то переменные, которые я объявляю внутри задачи где хранятся?
aaarrr
Цитата(Vladimir Prokofiev @ Apr 4 2012, 18:57) *
1. Память, выделяемая динамически, как то malloc тоже выделяется в стеке CSTACK?

Нет, выделяется из кучи (heap).

Цитата(Vladimir Prokofiev @ Apr 4 2012, 18:57) *
2. Если используем, например, FreeRtos, то переменные, которые я объявляю внутри задачи где хранятся?

На стеке задачи.
RabidRabbit
Ещё добавлю (вредным тоном), что все локальные переменные в функциях, которые будут вызываться из главной функции задачи (и все вложенные вызовы), тоже будут жрать стек задачи. wink.gif
KnightIgor
Цитата(Vladimir Prokofiev @ Apr 4 2012, 15:57) *
Да, спасибо, кажется это ответ. Я Сделал CSTACK больше и вроде сработало. А как узнать какой размер выделить под стеки?

Я порекомендую подход, как это делалось в DOS: под приложение выделялось 64К памяти, а стек устанавливался на самый верх. Применительно к программам на ARM/Cortex я также загружаю в стековый регистр верхний адрес имеющегося RAM, - и понеслась. По крайней мере, поначалу не нужно думать, хватит его или нет. Конечно, размахнувшись в программе широко можно выгрести всю память, и стек налезет когда-нибудь на область переменных, но тут уж надо следить: карту памяти поглядывать, что компоновщик выдает, ну и вообще быть в курсе, что программа делает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.