Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/77: Рейтинг темы: голосов - 77, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 21.03.2009
Сообщений: 111

Программа на С,переполнение стека

19.02.2010, 14:01. Показов 14719. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется программа:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
main()
{
//сдесь обьявляются много переменных
int a1;
int a2;
int a2;
//....
tlc_test();
}
void tlc_test()
{
void f1();
}
 
void f1()
{
LedOn();
}
Так вот программа не работает.Но если начать убирать обьявления переменных вначале то убрав несколько штук начинает работать.Я думаю что проблема в том что происходит переполнение стека и просто не вызываются фукции. Возможно ли такое?Я программирую для dsp30f2010 это пик.При компиляции пишется что программа занимет 87% памяти.Мне не понятно компилятор учитывает размер стека или нет?

ну если это пик, то зачем создавать в ветке авр? xroymom
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.02.2010, 14:01
Ответы с готовыми решениями:

Переполнение стека
Данная программа выполняет конфигурирование АЦП для работы в DMA режиме со временем преобразования 10 мкс, оцифровка сигналов поступающих...

Переполнение стека
Привет записался на курсы по C#, там дали задание сделать консольный морской бой То, что смог сделать - загрузил в архиве. При...

Переполнение стека
Привет народ. Такой вопрос: Если в общем виде: if (условие) double d else double d почему компилятор отказывается выполнять такое с...

16
0 / 0 / 0
Регистрация: 21.03.2009
Сообщений: 111
19.02.2010, 18:54
это не важно какой пик.для любого процессора это актуально.а в авр я запостил так ка больше народу там.
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
19.02.2010, 19:14
Цитата Сообщение от Sh@dow
это не важно какой пик.для любого процессора это актуально.а в авр я запостил так ка больше народу там.
Ну, как это неважно:) Нормальный компилятор размещает на стеке только передаваемые переменные (в виде констант), если конечно регистров не хватает. Но у пиков свой путь - там и аппаратный стек и банки памяти. Вот и компилятору приходится вертеться.
0
0 / 0 / 1
Регистрация: 22.01.2010
Сообщений: 4,000
19.02.2010, 19:28
А насколько у тебя глубоки вложения функций? У пика там как то стремно со стеком. Чуть ли его вообще нету.
0
0 / 0 / 0
Регистрация: 21.03.2009
Сообщений: 111
19.02.2010, 19:39
Собственно код в первом посте.Только я сейчас его немного изменил:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
main()
{
//сдесь обьявляю массив
ftoot ar[100];
//....
tlc_test();
}
void tlc_test()
{
void f1();
}
 
void f1()
{
LedOn();
}
Функция вызывает функцию которая вызывает функцию:tlc_test->f1->LedOn :)
Прикол в том что если выделить например ftoot ar[10]; то работает если ftoot ar[100]; то нет.
Я не удивлен что стек переполняется меня напрягает что MPLAB никак не сообщает об этом.Размер программы после компеляции не меняется не зависимо от того выделяем 10 элементов или 100. кампайлер видимо считает только глобальные переменные а ftoot ar[100]; будет размещятся уже в стеке как я понимаю вот оно и переполняет,только как узнать об этом :D
0
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 568
19.02.2010, 22:52
Цитата Сообщение от Sh@dow
это не важно какой пик.для любого процессора это актуально.
У pic16 8-уровневый аппаратный стек, у PIC18 уже 32 уровня (с доступом к нему), у dsPIC по-поему вообще программный. Так что разница есть, но компилятор должен учитывать особенности модели. Вообще у старших моделей по-моему есть регистр, который сигнализирует о том, что произошло переполнение стека, можно проверить.

DY HOTT
У пика там как то стремно со стеком. Чуть ли его вообще нету.
У 16-го семейства пика 8 уровней, мне пока хватало с моими запросами =)
0
0 / 0 / 0
Регистрация: 21.03.2009
Сообщений: 111
26.02.2010, 23:44
А что такое софтварный стек и чем он отличается от хардварного?
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 46
27.02.2010, 10:20
Програмный стек находится в оперативе с конца, по идее может занимать бОльшую ее часть и поэтому может быть очень большим (AVR), у пика же аппаратный стек - то есть спец регистры, его минус - размер стека жестко задан. А минус програмного стека в том, что при переполнении он может потереть данные в оперативе и вызвать полный сбой программы.
0
Vovimtus
27.02.2010, 13:55
Sh@dow, размер программного стека можно задать, аппаратного -- нет. В программный стек программист может выпихнуть байт, в аппаратный -- нет. Аппаратный стек доступен лишь ядру МК.
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 568
27.02.2010, 14:53
Цитата Сообщение от Itistromyq
у пика же аппаратный стек - то есть спец регистры, его минус - размер стека жестко задан. А минус програмного стека в том, что при переполнении он может потереть данные в оперативе и вызвать полный сбой программы.
У pic24 уже программный стек, к примеру. А переполнится может и аппаратный стек так же, например при превышении числа "вложений".

Аппаратный стек доступен лишь ядру МК.
У pic18 он аппаратный на 32 уровня, но к нему уже есть доступ (в отличие от pic16, где действительно стек полностью недоступен).
0
Vovimtus
27.02.2010, 20:59
O-10, совсем уже зарапортавался: в форуме по Пикам пальцы гну, в которых ни в зуб ногой...
0 / 0 / 1
Регистрация: 22.01.2010
Сообщений: 4,000
27.02.2010, 21:58
" А минус програмного стека в том, что при переполнении он может потереть данные в оперативе и вызвать полный сбой программы."

Но по крайней мере у программного стека в запасе дофига ячеек ОЗУ и если делать с запасом это это не грозит. А вот продавить аппаратный стек нефиг делать. 8 вложений и привет.
0
SWK
27.02.2010, 23:23
Но по крайней мере у программного стека в запасе дофига ячеек ОЗУ и если делать с запасом это это не грозит. А вот продавить аппаратный стек нефиг делать. 8 вложений и привет.
А нафига больше - то? Мне 8 уровней за глаза всегда хватало (если только не на FORTе писать). А при сбое программы программный стек никакие размеры на спасают - ОЗУ будет затерто однозначно, независимо от размера стека.
Кстати, нормальные компиляторы (например, от МикроЭлектраники) в статистике выдают количество вложений для разных процедур, функций, прерываний, и программы в целом. Например, у меня в ходовом контроллере максимум 4. А без рекурсии на микроконтроллерах (и не только), вполне можно обойтись, при грамотном алгоритме.
0 / 0 / 1
Регистрация: 22.01.2010
Сообщений: 4,000
27.02.2010, 23:54
Ну мало ли как алгоритм завернет :)
0
Шури Люберецкий
15.03.2010, 20:39
[QUOTE="SWK"][QUOTE="Цитата:[/QUOTE]
А без рекурсии на микроконтроллерах (и не только), вполне можно обойтись, при грамотном алгоритме.
Не просто при грамотном алгоритме, а при любом. Есть вполне определенные методы, как превратить любую рекурсию в цикл (или вложенный цикл), и наоборот - цикл в рекурсию.
0 / 0 / 0
Регистрация: 15.02.2010
Сообщений: 28
17.03.2010, 12:41
А я люблю рекурсию ^_^
При программировании для ПК приходится частенько применять, особенно при работе с различными деревьями
0
0 / 0 / 0
Регистрация: 30.01.2010
Сообщений: 123
18.03.2010, 08:13
в языке программирования Haskell в основном только рекурсия и используется :)
если грамотно поставить точку останова в рекурсии, иногда такой алгоритм оказывается даже быстрее
это уже отклонение от темы пошло)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.03.2010, 08:13
Помогаю со студенческими работами здесь

Переполнение стека
Ребят помогите избавиться от ошибки,вылетает в самом конце программы,программа все считает,все выводит,все верно.#include <stdio.h> ...

Переполнение стека
string syntax = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "-", "*", "/", "^", "sin(", "cos(", "tan(", "ln(", "sqrt(", "x" };...

Переполнение стека
Хочу полюбопытствовать. Вычитал недавно, что на стек выделяется ограниченная область памяти, и в языке Си это 4 Кб. Вопрос: Если мне...

Переполнение стека
Задача стоит такая: Затравочное заполнение 4-х связной гранично определенной области. Алгоритм такой использовал: ставим затравочную точку...

Переполнение стека
Всем привет. Помогите, пожалуйста с решением одной проблемы. Мне нужно в программе обрабатывать большие объемы текста. 10 000 000 символов....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru