Перейти к содержанию
    

"Еще одно место" - прерывание? Какой компилятор используете? Это я к тому, что 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 источника данных). Переключение асинхронное по отношению к данным.

Сейчас думаю попробовать при переключении коммутатора, чистить регистры приёмника. Хотя, раз прерывание по приёму продолжает работать, то, навряд-ли что-то изменится.

Изменено пользователем Ioann_II

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Компилятор 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-ти функций.

Его можно уменьшить.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Значит на стек для параметров и локальных переменных остается 0x12 = 18 байт.

Явный перевес в сторону Hard Stack-a, который позволит сделать вложенный вызов 19-ти функций.

Его можно уменьшить.

Не совсем понял про стек.... поясните.

На счёт вложенности - есть ф-ция main, в ней вызываются по очереди другие ф-ции (максимальное число параметров - 3, целые) и прерывание.

8 регистров заносится в стек при вызове обработчика приёма, 9 регистров при вызове обработчика передачи. 5 регистров при вызове таймера.

Ну + точка возврата - 11 байт....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не совсем понял про стек.... поясните.

 

Некоторые компиляторы создают два отдельных стека "hard" и "soft". hwstk_size - это "hardware stack".

hard-stack - это стандартный аппаратный стек, адресуется указателем стека SP, "push" и "pop" - это его команды и предназначен он

исключительно для помещения в него адресов возврата при вызове функций и прерываний.

Для передаваемых параметров и локальных переменных создается soft-stack. Он адресуется парой регистров Y и сохранение/извлечение

из него происходит с помощью команд загрузки/сохранения через Y.

Как правило, soft-stack требует большего размера нежели hard-stack.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Некоторые компиляторы создают два отдельных стека "hard" и "soft". hwstk_size - это "hardware stack".

hard-stack - это стандартный аппаратный стек, адресуется указателем стека SP, "push" и "pop" - это его команды и предназначен он

исключительно для помещения в него адресов возврата при вызове функций и прерываний.

Для передаваемых параметров и локальных переменных создается soft-stack. Он адресуется парой регистров Y и сохранение/извлечение

из него происходит с помощью команд загрузки/сохранения через Y.

Как правило, soft-stack требует большего размера нежели hard-stack.

Понятно, что имеете в виду под soft-стеком. Некоторые компиляторы туда-же складывают локальные переменные.

Просмотрел листинг и увидел, что есть адресация временных переменных по y+62!!!

Изменение значения y Не стал отслеживать, но похоже, что +62 явно выйдет за пределы....

Полагал, что компилятор должен отслеживать использование памяти....

Поправил исходник так, чтобы избавиться от таких временных переменных. Буду смотреть результат...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, пока что сутки отработало без зависаний...

Посмотрю ещё сутки, чтобы не сделать вывод преждевременно...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зависать перестало.

Причина была в использовании памяти промежуточными результатами вычислений.

Заменил выражения вида:

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...

 

Спасибо за подсказки.

Изменено пользователем Ioann_II

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ImageCraft - не самый лучший выбор. Хуже разве что CodeVision.

Не хотите увлекательных квестов в будущем - переходите на avr-gcc (бесплатно), либо на iar (если есть лишние деньги).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не хотите увлекательных квестов в будущем - переходите на avr-gcc, либо на iar (если есть лишние деньги).

либо на ассемблер и абсолютно бесплатно :biggrin:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Atmega328PB зависание после первого цикла на втором. Касание пальцами выводит из зависания.

Нашёл: при последовательном касании вывода PE3 металлической спицей, зависание пропадает.
Подтяжка пинов PE0-3, сконфигурированных на вход, решила проблему!

Прерывания ни как не настраивались специально, был только отключен компаратор:
ldi Temp,0b10000000
out ACSR,Temp       ; выключаем компаратор

Все заготовки меток прерываний завершены "reti" !

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, DrLithium сказал:

Прерывания ни как не настраивались специально,

Но чудес ведь не бывает.

6 часов назад, DrLithium сказал:

Все заготовки меток прерываний завершены "reti" !

Далеко не для всякого прерывания вход в обработчик сбрасывает флаг. А если флаг не сброшен - вы будете после reti выполнять одну команду и снова попадать в этот же обработчик. Забивать все свободные обработчики reti - достаточно кривое решение (даже несмотря на то, что оно предлагается везде в интернете и даже производителями компиляторов). 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Сергей Борщ сказал:

Но чудес ведь не бывает.

Бывает. Ты про QTouch читал? Поведение имеет явное направление "роста ног" от туда. Я глубоко не копал, но 100%-ый выход из зависания при касании пальцем, что-то да значит.

1 час назад, Сергей Борщ сказал:

Но чудес ведь не бывает.

Далеко не для всякого прерывания вход в обработчик сбрасывает флаг. А если флаг не сброшен - вы будете после reti выполнять одну команду и снова попадать в этот же обработчик. Забивать все свободные обработчики reti - достаточно кривое решение (даже несмотря на то, что оно предлагается везде в интернете и даже производителями компиляторов). 

Ни когда у меня не было подобного повтора после reti ! Т.к. флаг всегда сбрасывался при входе в обработчик. Кривое? Да это стандартное и надёжное решение завершения обработки прерывания. Прерывание по своей сути на то и прерывание, что б что-то быстро обработать и тут же вернуть фокус бесконечному циклу. А вот если фактических сигналов для одного прерывания случилось несколько, за время обработчика этого прерывания (дребезг кнопки или датчик глючит, или вч в пакете типа как в ИК, или int настроен по уровню, а не по фронту), то можно дополнительно сбросить флаг прерывания, записью единицы в соответствующий флаг.

Изменено пользователем DrLithium

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, DrLithium сказал:

Бывает. Ты про QTouch читал?

Во-первых я с вами на брудершафт не пил. Извольте соблюдать принятые на этом форуме правила и обращаться к незнакомым собеседникам на "вы".

Во-вторых QTouch сам по себе на выполнение программы не влияет и если у вас программа уходит в какое-то прерывание и там зацикливается - значит вы это прерывание сами разрешили и не обеспечили правильную его обработку. А это никакое не чудо, а обычная невнимательность или отсутствие понимания работы микроконтроллера.

2 часа назад, DrLithium сказал:

Я глубоко не копал, но 100%-ый выход из зависания при касании пальцем, что-то да значит.

А стоило копнуть. Кроме QTouch есть еще куча другой периферии, для которой изменение входного сигнала от наведенных на висящий в воздухе высокоимпендансный вход помех будет вызывать прерывание (если это прерывание разрешено - см. выше), например - прерывание EXTI.

2 часа назад, DrLithium сказал:

Ни когда у меня не было подобного повтора после reti ! Т.к. флаг всегда сбрасывался при входе в обработчик.

"Есть многое на свете, друг Горацио". Разрешите прерывание UDRIE USART, наслаждайтесь.

3 часа назад, DrLithium сказал:

Кривое? Да это стандартное и надёжное решение завершения обработки прерывания.

Завершения обработки - да. Затычки вместо обработчика - нет, см. выше пример с UDRIE.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, Сергей Борщ сказал:

Во-первых я с вами на брудершафт не пил. Извольте соблюдать принятые на этом форуме правила и обращаться к незнакомым собеседникам на "вы".

Во-вторых QTouch сам по себе на выполнение программы не влияет и если у вас программа уходит в какое-то прерывание и там зацикливается - значит вы это прерывание сами разрешили и не обеспечили правильную его обработку. А это никакое не чудо, а обычная невнимательность или отсутствие понимания работы микроконтроллера.

Покажи ка пункт правил, который меня обязывает обращаться к тебе на "вы"? Из пальца высосал? Как и остальное выше написанное? И я уверен, что много старше тебя.

Я то же с тобой не пил и "высокий тон" для меня это лишнее. Я не против общения на "вы". При этом на каждом форуме свои привила и обязывание общения на "вы" просто лишняя трата времени. А ты в силах запомнить на каком форуме какие правила? Вижу совсем нет. И врать не хорошо: "Извольте соблюдать принятые на этом форуме правила и обращаться к незнакомым собеседникам на "вы"." Пунт правил в студию! Или давай забань меня за "ты", а я посмеюсь. Вот позор то тебе будет! Просто уйду на адекватный форум. Далее по делу...

 

QTouch именно что повлиял! Т.к. я не то, что не прописал прерывания в инициализации (а выше чётко дал знать что именно не прописывал), а да же не разрешал глобальных прерываний! SEI - не было в коде! Т.ч. мотай на ус, гуру! Этот факт!

Второе: ещё раз обращаю внимание - касание приводит к расцикливания в 100% случаев!

Третье: ни какой невнимательности нет. Код голый, с  минимальным миганием СДИ, на программной задержке.

Четвёрное: "отсутствие понимания работы микроконтроллера." - полная чушь! Я третий десяток лет вожусь с микроконтроллерами и так их и не понял? Не на того напал!

2 часа назад, Сергей Борщ сказал:

А стоило копнуть. Кроме QTouch есть еще куча другой периферии, для которой изменение входного сигнала от наведенных на висящий в воздухе высокоимпендансный вход помех будет вызывать прерывание (если это прерывание разрешено - см. выше), например - прерывание EXTI.

Нет. Именно что не стоило. Дальше пустая трата времени, т.к. проблема решена совершенно чётко, стопроцентно и полностью. Ясно тебе?

2 часа назад, Сергей Борщ сказал:

"Есть многое на свете, друг Горацио". Разрешите прерывание UDRIE USART, наслаждайтесь.

Я тебе не друг, не стоит рассказывать тому, кто повидал на свет поболее тебя, что есть на белом свете.

В пятый раз: не дошло дело до прерываний вообще! SEI не было в коде! Так яснее? И вообще стараюсь избегать USART. Редко для отладки включаю. Лучше в протеус сползаю и увижу что к чему.

2 часа назад, Сергей Борщ сказал:

Завершения обработки - да. Затычки вместо обработчика - нет, см. выше пример с UDRIE.

Какой пример? Ни кода, ни аргументов, ни примера, ни пояснения, какие-то затычки у него. Что у тебя не работает? Ну не умеешь USART готовить - не берись. Два и два трудно сложить? Т.ч. спасибо сыты такиму гуру. Помощи не надо было, чего прилез? Один гонор. Прочти уже и осознай главное: была проблема и она решена! Это для кого-то будет решением проблемы и сокращением траты времени! А тебе, что тут надо, что забыл? Всё украдено до тебя. Дискуссия закончена. Игнор!

Изменено пользователем DrLithium

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, DrLithium сказал:

Четвёрное: "отсутствие понимания работы микроконтроллера." - полная чушь! Я третий десяток лет вожусь с микроконтроллерами и так их и не понял? Не на того напал!

Я четвертый десяток лет занимаюсь разработками устройств на микроконтроллерах и, тем не менее, меряться с вами ЧСВ не намерен. Продолжайте бороться со своими ветряными мельницами, от меня ответов на этом форуме вы больше не услышите - добро пожаловать в мой черный список. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...