Easyelectronics.ru

Электроника для всех
Текущее время: 10 апр 2020, 15:34

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
 Заголовок сообщения: Программа на С,переполнение стека
СообщениеДобавлено: 20 фев 2010, 14:48 
Заглядывает иногда

Зарегистрирован: 02 фев 2010, 02:47
Сообщения: 156
Имеется программа:
Код:
main()
{
//сдесь обьявляются много переменных
int a1;
int a2;
int a2;
//....
tlc_test();
}
void tlc_test()
{
void f1();
}

void f1()
{
LedOn();
}

Так вот программа не работает.Но если начать убирать обьявления переменных вначале то убрав несколько штук начинает работать.Я думаю что проблема в том что происходит переполнение стека и просто не вызываются фукции. Возможно ли такое?Я программирую для dsp30f2010 это пик.При компиляции пишется что программа занимет 87% памяти.Мне не понятно компилятор учитывает размер стека или нет?

ну если это пик, то зачем создавать в ветке авр? xrayman


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа на С,переполнение стека
СообщениеДобавлено: 20 фев 2010, 19:41 
Заглядывает иногда

Зарегистрирован: 02 фев 2010, 02:47
Сообщения: 156
это не важно какой пик.для любого процессора это актуально.а в авр я запостил так ка больше народу там.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа на С,переполнение стека
СообщениеДобавлено: 20 фев 2010, 20:01 
Старожил
Аватара пользователя

Зарегистрирован: 26 янв 2010, 21:48
Сообщения: 3965
Откуда: Звенигород
Sh@dow писал(а):
это не важно какой пик.для любого процессора это актуально.а в авр я запостил так ка больше народу там.

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

_________________
От Парижа до Находки с водкой лучше, чем без водки!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа на С,переполнение стека
СообщениеДобавлено: 20 фев 2010, 20:15 
Администратор
Аватара пользователя

Зарегистрирован: 16 янв 2010, 06:09
Сообщения: 6285
Откуда: Челябинск
А насколько у тебя глубоки вложения функций? У пика там как то стремно со стеком. Чуть ли его вообще нету.

_________________
Хозяин дома


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа на С,переполнение стека
СообщениеДобавлено: 20 фев 2010, 20:26 
Заглядывает иногда

Зарегистрирован: 02 фев 2010, 02:47
Сообщения: 156
Собственно код в первом посте.Только я сейчас его немного изменил:
Код:
main()
{
//сдесь обьявляю массив
float ar[100];
//....
tlc_test();
}
void tlc_test()
{
void f1();
}

void f1()
{
LedOn();
}

Функция вызывает функцию которая вызывает функцию:tlc_test->f1->LedOn :)
Прикол в том что если выделить например float ar[10]; то работает если float ar[100]; то нет.
Я не удивлен что стек переполняется меня напрягает что MPLAB никак не сообщает об этом.Размер программы после компеляции не меняется не зависимо от того выделяем 10 элементов или 100. кампайлер видимо считает только глобальные переменные а float ar[100]; будет размещятся уже в стеке как я понимаю вот оно и переполняет,только как узнать об этом :D


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа на С,переполнение стека
СообщениеДобавлено: 20 фев 2010, 23:39 
Старожил

Зарегистрирован: 29 янв 2010, 00:34
Сообщения: 818
Откуда: Санкт-Петербург
Sh@dow писал(а):
это не важно какой пик.для любого процессора это актуально.
У pic16 8-уровневый аппаратный стек, у PIC18 уже 32 уровня (с доступом к нему), у dsPIC по-поему вообще программный. Так что разница есть, но компилятор должен учитывать особенности модели. Вообще у старших моделей по-моему есть регистр, который сигнализирует о том, что произошло переполнение стека, можно проверить.

DI HALT
Цитата:
У пика там как то стремно со стеком. Чуть ли его вообще нету.
У 16-го семейства пика 8 уровней, мне пока хватало с моими запросами =)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа на С,переполнение стека
СообщениеДобавлено: 28 фев 2010, 00:31 
Заглядывает иногда

Зарегистрирован: 02 фев 2010, 02:47
Сообщения: 156
А что такое софтварный стек и чем он отличается от хардварного?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа на С,переполнение стека
СообщениеДобавлено: 28 фев 2010, 11:07 
Заглядывает иногда

Зарегистрирован: 27 янв 2010, 00:24
Сообщения: 52
Откуда: Киров
Програмный стек находится в оперативе с конца, по идее может занимать бОльшую ее часть и поэтому может быть очень большим (AVR), у пика же аппаратный стек - то есть спец регистры, его минус - размер стека жестко задан. А минус програмного стека в том, что при переполнении он может потереть данные в оперативе и вызвать полный сбой программы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа на С,переполнение стека
СообщениеДобавлено: 28 фев 2010, 14:42 
Только пришел
Аватара пользователя

Зарегистрирован: 27 янв 2010, 22:19
Сообщения: 7
Откуда: Vladivostok
Sh@dow, размер программного стека можно задать, аппаратного -- нет. В программный стек программист может выпихнуть байт, в аппаратный -- нет. Аппаратный стек доступен лишь ядру МК.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа на С,переполнение стека
СообщениеДобавлено: 28 фев 2010, 15:40 
Старожил

Зарегистрирован: 29 янв 2010, 00:34
Сообщения: 818
Откуда: Санкт-Петербург
Electroniq писал(а):
у пика же аппаратный стек - то есть спец регистры, его минус - размер стека жестко задан. А минус програмного стека в том, что при переполнении он может потереть данные в оперативе и вызвать полный сбой программы.
У pic24 уже программный стек, к примеру. А переполнится может и аппаратный стек так же, например при превышении числа "вложений".

Цитата:
Аппаратный стек доступен лишь ядру МК.
У pic18 он аппаратный на 32 уровня, но к нему уже есть доступ (в отличие от pic16, где действительно стек полностью недоступен).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа на С,переполнение стека
СообщениеДобавлено: 28 фев 2010, 21:46 
Только пришел
Аватара пользователя

Зарегистрирован: 27 янв 2010, 22:19
Сообщения: 7
Откуда: Vladivostok
A-10, совсем уже зарапортавался: в форуме по Пикам пальцы гну, в которых ни в зуб ногой...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа на С,переполнение стека
СообщениеДобавлено: 28 фев 2010, 22:45 
Администратор
Аватара пользователя

Зарегистрирован: 16 янв 2010, 06:09
Сообщения: 6285
Откуда: Челябинск
" А минус програмного стека в том, что при переполнении он может потереть данные в оперативе и вызвать полный сбой программы."

Но по крайней мере у программного стека в запасе дофига ячеек ОЗУ и если делать с запасом это это не грозит. А вот продавить аппаратный стек нефиг делать. 8 вложений и привет.

_________________
Хозяин дома


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа на С,переполнение стека
СообщениеДобавлено: 01 мар 2010, 00:10 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:08
Сообщения: 7549
Откуда: Алма-ата
Цитата:
Но по крайней мере у программного стека в запасе дофига ячеек ОЗУ и если делать с запасом это это не грозит. А вот продавить аппаратный стек нефиг делать. 8 вложений и привет.

А нафига больше - то? Мне 8 уровней за глаза всегда хватало (если только не на FORTе писать). А при сбое программы программный стек никакие размеры на спасают - ОЗУ будет затерто однозначно, независимо от размера стека.
Кстати, нормальные компиляторы (например, от МикроЭлектроники) в статистике выдают количество вложений для разных процедур, функций, прерываний, и программы в целом. Например, у меня в ходовом контроллере максимум 4. А без рекурсии на микроконтроллерах (и не только), вполне можно обойтись, при грамотном алгоритме.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа на С,переполнение стека
СообщениеДобавлено: 01 мар 2010, 00:41 
Администратор
Аватара пользователя

Зарегистрирован: 16 янв 2010, 06:09
Сообщения: 6285
Откуда: Челябинск
Ну мало ли как алгоритм завернет :)

_________________
Хозяин дома


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа на С,переполнение стека
СообщениеДобавлено: 16 мар 2010, 21:26 
Здравствуйте!

Зарегистрирован: 16 мар 2010, 21:24
Сообщения: 4
SWG писал(а):
Цитата:
А без рекурсии на микроконтроллерах (и не только), вполне можно обойтись, при грамотном алгоритме.


Не просто при грамотном алгоритме, а при любом. Есть вполне определенные методы, как превратить любую рекурсию в цикл (или вложенный цикл), и наоборот - цикл в рекурсию.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа на С,переполнение стека
СообщениеДобавлено: 18 мар 2010, 13:28 
Только пришел
Аватара пользователя

Зарегистрирован: 26 янв 2010, 17:16
Сообщения: 29
А я люблю рекурсию ^_^
При программировании для ПК приходится частенько применять, особенно при работе с различными деревьями


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Программа на С,переполнение стека
СообщениеДобавлено: 19 мар 2010, 09:00 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 27 янв 2010, 18:55
Сообщения: 163
Откуда: Томск
в языке программирования Haskell в основном только рекурсия и используется :)
если грамотно поставить точку останова в рекурсии, иногда такой алгоритм оказывается даже быстрее
это уже отклонение от темы пошло)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB