Цитата(Сергей Борщ @ Mar 16 2017, 09:58)
"Еще одно место" - прерывание? Какой компилятор используете? Это я к тому, что 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
Цитата(aiwa @ Mar 16 2017, 13:10)
Это совершенно бесполезная информация. Зависание произошло после вывода на 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 источника данных). Переключение асинхронное по отношению к данным.
Сейчас думаю попробовать при переключении коммутатора, чистить регистры приёмника. Хотя, раз прерывание по приёму продолжает работать, то, навряд-ли что-то изменится.