Ioann_II 0 16 марта, 2017 Опубликовано 16 марта, 2017 (изменено) · Жалоба "Еще одно место" - прерывание? Какой компилятор используете? Это я к тому, что IAR использует два стека (один для возвратов и второй для данных), gcc использует один. sprintf() очень охочая до стека функция. Если используете gcc, то стек вам увеличивать уже некуда, возможно стоит пересмотреть алгоритм чтобы уменьшить занимаемую глобальными переменными память или хотя бы посмотреть, не затирается ли память сразу после глобальных переменных - это будет говорить о налезании стека на данные и разрушении содержимого стека. Если используете ИАР - можно попробовать увеличить один из стеков за счет другого. Конечно-же, в прерывании вообще никаких функций не вызывается. Оба места - 2 разных автомата состояний в основном цикле. Компилятор ImageCraft. По памяти: data 258. bytes (rel,con,ram) bss 1731. bytes (rel,con,ram) ИТОГО 1989байт, остатся 59 байт... для стека. ram_end = 0x8ff hwstk_size = 0x28 Это совершенно бесполезная информация. Зависание произошло после вывода на LCD, и если оно стало результатом порчи стека Вы этого не увидите. Для проверки целостности лучше заливать стек паттерном и проверять его содержимое. Как залить - тема тут была ранее. Если используете WatchDog, посмотрите как часто Вы его передергиваете. Я бы порекомендовал его временно вообще отключить. SP покажет только если стек "не уравновешен", поэтому не стал сразу его выводить... Эта тема? https://electronix.ru/forum/index.php?showt...%E5%F0%ED%EE%EC С WatchDog проблема.... я писал ссылку на тему. https://electronix.ru/forum/index.php?showtopic=140918 Не получается его задействовать, как надо - если в режиме прерывания, то работает, а если в режиме СБРОС - то проц просто завешивается. Это в тестовом проекте пробовал. И самое забавное - что как "зависнет", точно так-же само и "отвисает".... хотя, может, не всегда... Ещё момент - UART подключен через коммутатор, т.е. есть несколько (3 источника данных). Переключение асинхронное по отношению к данным. Сейчас думаю попробовать при переключении коммутатора, чистить регистры приёмника. Хотя, раз прерывание по приёму продолжает работать, то, навряд-ли что-то изменится. Изменено 16 марта, 2017 пользователем Ioann_II Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба Компилятор ImageCraft. По памяти: data 258. bytes (rel,con,ram) bss 1731. bytes (rel,con,ram) ИТОГО 1989байт, остатся 59 байт... для стека. ram_end = 0x8ff hwstk_size = 0x28 Значит на стек для параметров и локальных переменных остается 0x12 = 18 байт. Явный перевес в сторону Hard Stack-a, который позволит сделать вложенный вызов 19-ти функций. Его можно уменьшить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ioann_II 0 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба Значит на стек для параметров и локальных переменных остается 0x12 = 18 байт. Явный перевес в сторону Hard Stack-a, который позволит сделать вложенный вызов 19-ти функций. Его можно уменьшить. Не совсем понял про стек.... поясните. На счёт вложенности - есть ф-ция main, в ней вызываются по очереди другие ф-ции (максимальное число параметров - 3, целые) и прерывание. 8 регистров заносится в стек при вызове обработчика приёма, 9 регистров при вызове обработчика передачи. 5 регистров при вызове таймера. Ну + точка возврата - 11 байт.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба Не совсем понял про стек.... поясните. Некоторые компиляторы создают два отдельных стека "hard" и "soft". hwstk_size - это "hardware stack". hard-stack - это стандартный аппаратный стек, адресуется указателем стека SP, "push" и "pop" - это его команды и предназначен он исключительно для помещения в него адресов возврата при вызове функций и прерываний. Для передаваемых параметров и локальных переменных создается soft-stack. Он адресуется парой регистров Y и сохранение/извлечение из него происходит с помощью команд загрузки/сохранения через Y. Как правило, soft-stack требует большего размера нежели hard-stack. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ioann_II 0 17 марта, 2017 Опубликовано 17 марта, 2017 · Жалоба Некоторые компиляторы создают два отдельных стека "hard" и "soft". hwstk_size - это "hardware stack". hard-stack - это стандартный аппаратный стек, адресуется указателем стека SP, "push" и "pop" - это его команды и предназначен он исключительно для помещения в него адресов возврата при вызове функций и прерываний. Для передаваемых параметров и локальных переменных создается soft-stack. Он адресуется парой регистров Y и сохранение/извлечение из него происходит с помощью команд загрузки/сохранения через Y. Как правило, soft-stack требует большего размера нежели hard-stack. Понятно, что имеете в виду под soft-стеком. Некоторые компиляторы туда-же складывают локальные переменные. Просмотрел листинг и увидел, что есть адресация временных переменных по y+62!!! Изменение значения y Не стал отслеживать, но похоже, что +62 явно выйдет за пределы.... Полагал, что компилятор должен отслеживать использование памяти.... Поправил исходник так, чтобы избавиться от таких временных переменных. Буду смотреть результат... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ioann_II 0 18 марта, 2017 Опубликовано 18 марта, 2017 · Жалоба Ну, пока что сутки отработало без зависаний... Посмотрю ещё сутки, чтобы не сделать вывод преждевременно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ioann_II 0 19 марта, 2017 Опубликовано 19 марта, 2017 (изменено) · Жалоба Зависать перестало. Причина была в использовании памяти промежуточными результатами вычислений. Заменил выражения вида: a=func(b,c) ^ func(d,e) ^ func(f,g) ^ func(i,j); выражениями вида: a=func(b,c); a^=func(d,e); a^=func(f,g); a^=func(i,j); И в ассемблерном листинге исчезли команды типа std y+5,R... ................... std y+62,R... И всё стало ограничиваться std y+4,R... Спасибо за подсказки. Изменено 19 марта, 2017 пользователем Ioann_II Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 20 марта, 2017 Опубликовано 20 марта, 2017 · Жалоба ImageCraft - не самый лучший выбор. Хуже разве что CodeVision. Не хотите увлекательных квестов в будущем - переходите на avr-gcc (бесплатно), либо на iar (если есть лишние деньги). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 20 марта, 2017 Опубликовано 20 марта, 2017 · Жалоба Не хотите увлекательных квестов в будущем - переходите на avr-gcc, либо на iar (если есть лишние деньги). либо на ассемблер и абсолютно бесплатно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DrLithium 0 23 мая, 2021 Опубликовано 23 мая, 2021 · Жалоба Atmega328PB зависание после первого цикла на втором. Касание пальцами выводит из зависания. Нашёл: при последовательном касании вывода PE3 металлической спицей, зависание пропадает. Подтяжка пинов PE0-3, сконфигурированных на вход, решила проблему! Прерывания ни как не настраивались специально, был только отключен компаратор: ldi Temp,0b10000000 out ACSR,Temp ; выключаем компаратор Все заготовки меток прерываний завершены "reti" ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 23 мая, 2021 Опубликовано 23 мая, 2021 · Жалоба 6 часов назад, DrLithium сказал: Прерывания ни как не настраивались специально, Но чудес ведь не бывает. 6 часов назад, DrLithium сказал: Все заготовки меток прерываний завершены "reti" ! Далеко не для всякого прерывания вход в обработчик сбрасывает флаг. А если флаг не сброшен - вы будете после reti выполнять одну команду и снова попадать в этот же обработчик. Забивать все свободные обработчики reti - достаточно кривое решение (даже несмотря на то, что оно предлагается везде в интернете и даже производителями компиляторов). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DrLithium 0 23 мая, 2021 Опубликовано 23 мая, 2021 (изменено) · Жалоба 1 час назад, Сергей Борщ сказал: Но чудес ведь не бывает. Бывает. Ты про QTouch читал? Поведение имеет явное направление "роста ног" от туда. Я глубоко не копал, но 100%-ый выход из зависания при касании пальцем, что-то да значит. 1 час назад, Сергей Борщ сказал: Но чудес ведь не бывает. Далеко не для всякого прерывания вход в обработчик сбрасывает флаг. А если флаг не сброшен - вы будете после reti выполнять одну команду и снова попадать в этот же обработчик. Забивать все свободные обработчики reti - достаточно кривое решение (даже несмотря на то, что оно предлагается везде в интернете и даже производителями компиляторов). Ни когда у меня не было подобного повтора после reti ! Т.к. флаг всегда сбрасывался при входе в обработчик. Кривое? Да это стандартное и надёжное решение завершения обработки прерывания. Прерывание по своей сути на то и прерывание, что б что-то быстро обработать и тут же вернуть фокус бесконечному циклу. А вот если фактических сигналов для одного прерывания случилось несколько, за время обработчика этого прерывания (дребезг кнопки или датчик глючит, или вч в пакете типа как в ИК, или int настроен по уровню, а не по фронту), то можно дополнительно сбросить флаг прерывания, записью единицы в соответствующий флаг. Изменено 23 мая, 2021 пользователем DrLithium Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 23 мая, 2021 Опубликовано 23 мая, 2021 · Жалоба 2 часа назад, DrLithium сказал: Бывает. Ты про QTouch читал? Во-первых я с вами на брудершафт не пил. Извольте соблюдать принятые на этом форуме правила и обращаться к незнакомым собеседникам на "вы". Во-вторых QTouch сам по себе на выполнение программы не влияет и если у вас программа уходит в какое-то прерывание и там зацикливается - значит вы это прерывание сами разрешили и не обеспечили правильную его обработку. А это никакое не чудо, а обычная невнимательность или отсутствие понимания работы микроконтроллера. 2 часа назад, DrLithium сказал: Я глубоко не копал, но 100%-ый выход из зависания при касании пальцем, что-то да значит. А стоило копнуть. Кроме QTouch есть еще куча другой периферии, для которой изменение входного сигнала от наведенных на висящий в воздухе высокоимпендансный вход помех будет вызывать прерывание (если это прерывание разрешено - см. выше), например - прерывание EXTI. 2 часа назад, DrLithium сказал: Ни когда у меня не было подобного повтора после reti ! Т.к. флаг всегда сбрасывался при входе в обработчик. "Есть многое на свете, друг Горацио". Разрешите прерывание UDRIE USART, наслаждайтесь. 3 часа назад, DrLithium сказал: Кривое? Да это стандартное и надёжное решение завершения обработки прерывания. Завершения обработки - да. Затычки вместо обработчика - нет, см. выше пример с UDRIE. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DrLithium 0 23 мая, 2021 Опубликовано 23 мая, 2021 (изменено) · Жалоба 2 часа назад, Сергей Борщ сказал: Во-первых я с вами на брудершафт не пил. Извольте соблюдать принятые на этом форуме правила и обращаться к незнакомым собеседникам на "вы". Во-вторых QTouch сам по себе на выполнение программы не влияет и если у вас программа уходит в какое-то прерывание и там зацикливается - значит вы это прерывание сами разрешили и не обеспечили правильную его обработку. А это никакое не чудо, а обычная невнимательность или отсутствие понимания работы микроконтроллера. Покажи ка пункт правил, который меня обязывает обращаться к тебе на "вы"? Из пальца высосал? Как и остальное выше написанное? И я уверен, что много старше тебя. Я то же с тобой не пил и "высокий тон" для меня это лишнее. Я не против общения на "вы". При этом на каждом форуме свои привила и обязывание общения на "вы" просто лишняя трата времени. А ты в силах запомнить на каком форуме какие правила? Вижу совсем нет. И врать не хорошо: "Извольте соблюдать принятые на этом форуме правила и обращаться к незнакомым собеседникам на "вы"." Пунт правил в студию! Или давай забань меня за "ты", а я посмеюсь. Вот позор то тебе будет! Просто уйду на адекватный форум. Далее по делу... QTouch именно что повлиял! Т.к. я не то, что не прописал прерывания в инициализации (а выше чётко дал знать что именно не прописывал), а да же не разрешал глобальных прерываний! SEI - не было в коде! Т.ч. мотай на ус, гуру! Этот факт! Второе: ещё раз обращаю внимание - касание приводит к расцикливания в 100% случаев! Третье: ни какой невнимательности нет. Код голый, с минимальным миганием СДИ, на программной задержке. Четвёрное: "отсутствие понимания работы микроконтроллера." - полная чушь! Я третий десяток лет вожусь с микроконтроллерами и так их и не понял? Не на того напал! 2 часа назад, Сергей Борщ сказал: А стоило копнуть. Кроме QTouch есть еще куча другой периферии, для которой изменение входного сигнала от наведенных на висящий в воздухе высокоимпендансный вход помех будет вызывать прерывание (если это прерывание разрешено - см. выше), например - прерывание EXTI. Нет. Именно что не стоило. Дальше пустая трата времени, т.к. проблема решена совершенно чётко, стопроцентно и полностью. Ясно тебе? 2 часа назад, Сергей Борщ сказал: "Есть многое на свете, друг Горацио". Разрешите прерывание UDRIE USART, наслаждайтесь. Я тебе не друг, не стоит рассказывать тому, кто повидал на свет поболее тебя, что есть на белом свете. В пятый раз: не дошло дело до прерываний вообще! SEI не было в коде! Так яснее? И вообще стараюсь избегать USART. Редко для отладки включаю. Лучше в протеус сползаю и увижу что к чему. 2 часа назад, Сергей Борщ сказал: Завершения обработки - да. Затычки вместо обработчика - нет, см. выше пример с UDRIE. Какой пример? Ни кода, ни аргументов, ни примера, ни пояснения, какие-то затычки у него. Что у тебя не работает? Ну не умеешь USART готовить - не берись. Два и два трудно сложить? Т.ч. спасибо сыты такиму гуру. Помощи не надо было, чего прилез? Один гонор. Прочти уже и осознай главное: была проблема и она решена! Это для кого-то будет решением проблемы и сокращением траты времени! А тебе, что тут надо, что забыл? Всё украдено до тебя. Дискуссия закончена. Игнор! Изменено 23 мая, 2021 пользователем DrLithium Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 23 мая, 2021 Опубликовано 23 мая, 2021 · Жалоба 4 минуты назад, DrLithium сказал: Четвёрное: "отсутствие понимания работы микроконтроллера." - полная чушь! Я третий десяток лет вожусь с микроконтроллерами и так их и не понял? Не на того напал! Я четвертый десяток лет занимаюсь разработками устройств на микроконтроллерах и, тем не менее, меряться с вами ЧСВ не намерен. Продолжайте бороться со своими ветряными мельницами, от меня ответов на этом форуме вы больше не услышите - добро пожаловать в мой черный список. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться