|
|
  |
Локальный массив - не выделяется память? |
|
|
|
Apr 4 2012, 14:33
|
Участник

Группа: Участник
Сообщений: 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] для короткого кода
|
|
|
|
|
Apr 4 2012, 14:55
|

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

|
Цитата(Vladimir Prokofiev @ Apr 4 2012, 18:33)  После этих строк я вижу, что моя "5" появилась в чужих переменных. Как такое может быть, я же ему явно указал его размер? 1. Переполнение стэка. 2. Новые чужие переменные не имеют значения по умолчанию. Дурной тон - это при религиозном взгляде на программирование. Если у вас однозадачная система и нет рекурсивных вызовов - какая разница? А следить за тем чтоб память не кончилась желательно всегда!
|
|
|
|
|
Apr 4 2012, 14:57
|
Участник

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

|
Цитата(KnightIgor @ Apr 4 2012, 18:47)  Переменная выделяется в стеке (sub sp, sp, #5000). У Вас его размер достаточен для размещения почти 5 кило? Да, спасибо, кажется это ответ. Я Сделал CSTACK больше и вроде сработало. А как узнать какой размер выделить под стеки? Можно еще вопросов глупых позадовать: 1. Память, выделяемая динамически, как то malloc тоже выделяется в стеке CSTACK? 2. Если используем, например, FreeRtos, то переменные, которые я объявляю внутри задачи где хранятся?
|
|
|
|
|
Apr 4 2012, 15:40
|
Гуру
     
Группа: Свой
Сообщений: 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, то переменные, которые я объявляю внутри задачи где хранятся? На стеке задачи.
|
|
|
|
|
Apr 4 2012, 18:23
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|