Полная версия этой страницы:
Вываливание из цикла
Программа измерения написанная на асе работает как часы проводя постоянное считывание данных от ацп к мк без сбоев c F=50 Hz, но написанный эквивалент на Си начал вываливаться из безконечного цикла с различной переодичностью от 3 до 20 секунд, при этом сорожевик на мк откл, используется 1 прерывание, но оно жёстко контролируется, причём передачей данных и съёмом руководит МК (mega 64), стек не переполняется, для хранение данных и используем 1 переменную типа long, Кто сталкивался с этой дилемой подскажите пожалуйста
у меня тажа история только с внутри какой либо функции происходила, я полез в General Opion-System и увеличил в 2 раза CSTACK (я понял это стек) и RSTACK (я понял это стек по возвращению из подпрограмм) и всё заработало. Отсюда вопрос, как можно это дело определить теоретически (я имею виду стек в общем) не лазия по дизасемблеру, ведь хто его знает как компилятор оптимизирует программу, ведь ошибок по переполнению стека он не выдаёт?
Aleks17
Dec 19 2005, 12:36
Как-то информации маловато, может поподробнее - кусок программы к примеру или хотя бы русскими словами как МК к АЦП приделано, что в прерывании делается и т.п.
Программа чисто сишная или часть на ассемблере ?
Чтоб ответ получить надо вопрос задать.
Георгий
Dec 19 2005, 12:45
А откуда уверенность, что стек и переменная не переполняются?
Потому что просматривал пошагово в AVRstud, новот на счёт стека сомневаюсь, скорее всего вы правы, но ведь на асе всё тип-топ
Исходник в txt
Нажмите для просмотра прикрепленного файла
Георгий
Dec 19 2005, 13:30
А в чем проявляется вываливание из цикла? И как устроено зацикливание?
цикл на while (1){} - условие истинности, в верхнем программировании работало
Цитата(MakSV @ Dec 19 2005, 17:33)

цикл на while (1){} - условие истинности, в верхнем программировании работало
рекомендация на бесконечный цикл
Код
for(;;)
{
....
}
Сейчас попробую и скажу как вышло
Стабильные 20 сек работы, а потом МК замолкает, скорее всего Георгий прав это скек, CENSORED
Георгий
Dec 20 2005, 07:46
К сожалению, прогон в Студии не всегда позволяет отметить переполнение стека или выход его в зону данных. Потому как в реальном исполнениии прилетают всякие прерывания, таймеры суетятся. Я буквально вчера с этим еще раз столкнулся столкнулся. Если читаю буфер одним способом, все хорошо, если сначала прочитаю ДРУГОй буфер , а потом прочитаю первый, то в первом два последних байта стабильно запорчены. Оказалось, что другой буфер я читал по прерыванию, и стек успевал заехать в первый буфер, хотя подсчет возможного размера стека с карандашиком в руках говорил, что места хватает.
Вываливание из цикла переборол, увеличив объём стека, но когда втюхиваю в свой блок вычислений и инициализациии, блок напарника , всё возвращается на круги своя. Но теперь это уже наша головня, Всем спасибо , а я побрёл кромсать дальше.
Для Igor Kossak, спасибо, тему можно закрыть. С Ув. MakS
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.