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

 
 
 
Reply to this topicStart new topic
> Локальный массив - не выделяется память?
Vladimir Prokofi...
сообщение Apr 4 2012, 14:33
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 9-03-11
Пользователь №: 63 481



функция:

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


После этих строк я вижу, что моя "5" появилась в чужих переменных. Как такое может быть, я же ему явно указал его размер?
И как в иаре узнать сколько памяти сейчас выделено/осталось?
Еще вопрос не в тему, кто-то говорил, что для определенных задач выделение памяти во время исполнения считается плохим тоном. Не могу придумать чем это плохо, если правильно делать

Сообщение отредактировал IgorKossak - Apr 4 2012, 18:46
Причина редактирования: [code] для короткого кода
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Apr 4 2012, 14:47
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Переменная выделяется в стеке (sub sp, sp, #5000). У Вас его размер достаточен для размещения почти 5 кило?

Сообщение отредактировал IgorKossak - Apr 4 2012, 18:47
Причина редактирования: бездумное цитирование
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Apr 4 2012, 14:55
Сообщение #3


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

Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565



Цитата(Vladimir Prokofiev @ Apr 4 2012, 18:33) *
После этих строк я вижу, что моя "5" появилась в чужих переменных.
Как такое может быть, я же ему явно указал его размер?


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

Дурной тон - это при религиозном взгляде на программирование.
Если у вас однозадачная система и нет рекурсивных вызовов - какая разница?
А следить за тем чтоб память не кончилась желательно всегда!
Go to the top of the page
 
+Quote Post
Vladimir Prokofi...
сообщение Apr 4 2012, 14:57
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 9-03-11
Пользователь №: 63 481



Цитата(KnightIgor @ Apr 4 2012, 18:47) *
Переменная выделяется в стеке (sub sp, sp, #5000). У Вас его размер достаточен для размещения почти 5 кило?

Да, спасибо, кажется это ответ. Я Сделал CSTACK больше и вроде сработало. А как узнать какой размер выделить под стеки?
Можно еще вопросов глупых позадовать:
1. Память, выделяемая динамически, как то malloc тоже выделяется в стеке CSTACK?
2. Если используем, например, FreeRtos, то переменные, которые я объявляю внутри задачи где хранятся?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 4 2012, 15:40
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Vladimir Prokofiev @ Apr 4 2012, 18:57) *
1. Память, выделяемая динамически, как то malloc тоже выделяется в стеке CSTACK?

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

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

На стеке задачи.
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Apr 4 2012, 17:39
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Ещё добавлю (вредным тоном), что все локальные переменные в функциях, которые будут вызываться из главной функции задачи (и все вложенные вызовы), тоже будут жрать стек задачи. wink.gif
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Apr 4 2012, 18:23
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Vladimir Prokofiev @ Apr 4 2012, 15:57) *
Да, спасибо, кажется это ответ. Я Сделал CSTACK больше и вроде сработало. А как узнать какой размер выделить под стеки?

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

Сообщение отредактировал KnightIgor - Apr 4 2012, 18:25
Go to the top of the page
 
+Quote Post

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

 


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


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