Jump to content

    

Непонятный рестарт программы

Имеется устройство на базе микроконтроллера STM32F100RC. Для него разработано программное обеспечение под Keil 4.22a:

Total RO Size (Code + RO Data) 76796 ( 75.00kB)

Total RW Size (RW Data + ZI Data) 7776 ( 7.59kB)

Total ROM Size (Code + RO Data + RW Data) 76944 ( 75.14kB)

Устройство (весовой терминал ротационных промышленных весов) установлено на промышленном объекте у заказчика в количестве 3 штук.

 

Наблюдается следующий эффект. Через произвольное время (от 3 до 30 минут) происходит сброс программы. Причём сброс странный. Статические переменные обнуляются, но сброс не "ловится" при отладке (установка breakpoint как в в начале SystemInit(), так и в начале main()). Мало того, при рестарте программы должно производиться тестирование дисплеев из 7-сегментных индикаторов (в начале main()), но оно не происходит.

В программе используется WDT IWDG, но это не его рук дело. Эти явления происходят на всех 3 устройствах. До этого я разработал более 20 аналогичных проектов на этом же устройстве с аналогичной структурой программы, но подобного никогда не наблюдал.

 

Буду благодарен за любой совет.

 

 

Share this post


Link to post
Share on other sites
Буду благодарен за любой совет.

Мощную помеху в линии питания (для эксперимента запитайте устройство от аккумулятора, а не от сети) или радиопомеху не исключаете ?

 

Share this post


Link to post
Share on other sites
Наблюдается следующий эффект. Через произвольное время (от 3 до 30 минут) происходит сброс программы. Причём сброс странный. Статические переменные обнуляются, но сброс не "ловится" при отладке (установка breakpoint как в в начале SystemInit(), так и в начале main()). Мало того, при рестарте программы должно производиться тестирование дисплеев из 7-сегментных индикаторов (в начале main()), но оно не происходит.

Так может это и не сброс, а именно обнуление ОЗУ вследствие программной ошибки?

Share this post


Link to post
Share on other sites
Так может это и не сброс, а именно обнуление ОЗУ вседствие программной ошибки?

Или стек переполняется, например, при интенсивных прерываниях, и собой затирает данные в ОЗУ ...

 

Share this post


Link to post
Share on other sites
Так может это и не сброс, а именно обнуление ОЗУ вследствие программной ошибки?

Обнуляются все статические переменные (по крайней мере я проверил 7-8 разного типа). А какая может быть ошибка чтобы выйти на инициализирующий сброс статических переменных?

 

Share this post


Link to post
Share on other sites
А какая может быть ошибка чтобы выйти на инициализирующий сброс статических переменных?

memset(x, 0, y), например. Не выходит оно никуда, просто самостоятельно стирает содержимое памяти.

Share this post


Link to post
Share on other sites
Или стек переполняется, например, при интенсивных прерываниях, и собой затирает данные в ОЗУ ...

Нет. Во-первых в данной системе нет интенсивных прерываний:

1) системные часы (каждую миллисекунду);

2) АЦП - 1 раз в 10 миллисекунд;

3) КПДП передатчика SPI (каждую миллисекунду);

4) 2 прерывания UART (не работали, поскольку не было компьютера верхнего уровня).

Во-вторых, как я уже писал, аналогичная система и в других проектах (даже есть более нагруженные).

 

Share this post


Link to post
Share on other sites
Во-вторых, как я уже писал, аналогичная система и в других проектах (даже есть более нагруженные).

Хорошо. Ловим сброс чисто аппаратно. Подпаиваем на плату светодиод и при сбросе зажигаем его. И в программе делаем так, чтобы выключить его можно было только оператору, например, нажатием кнопочки ...

 

Share this post


Link to post
Share on other sites
memset(x, 0, y), например. Не выходит оно никуда, просто самостоятельно стирает содержимое памяти.

Проверил. Самое подозрительное:

memset(Display->Code,'\0',strlen((char *)Display->Code)); //Очистка кодовой строки

где Display->Code указатель на массив байт (unsigned char *).

Остальные memset все просты и явны.

 

Может быть функция strlen(), а тем более с аргументом-указателем на член структуры может глючить? Хотя в аналогичных проектах всё это работает безукоризненно.

 

Edited by Вячик13

Share this post


Link to post
Share on other sites
... ничего кроме трёхфазных асинхронников там нет.

Страшны не асинхроники, а контакторы, которые их включают. В момент коммутации возникают радиопомехи. И они могут быть особенно мощными и сокрушительными, если контакты не задемпфированы. Как у вас с этим, а ?

Если дело в этом, то запитка от аккумулятора в качестве эксперимента (а я вам настоятельно советую попробовать этот вариант) может и не помочь, т.к. помехи проходят сквозь эфир. Да, вместо аккумулятора можно использовать обычный UPS, физически (вилкой) отключенный от розетки и питающийся от аккумулятора. Это в том, например, случае, если ваш прибор питается от 220В и запитать его прямо от аккумулятора затруднительно или неудобно ...

Share this post


Link to post
Share on other sites
Хорошо. Ловим сброс чисто аппаратно. Подпаиваем на плату светодиод и при сбросе зажигаем его. И в программе делаем так, чтобы выключить его можно было только оператору, например, нажатием кнопочки ...

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

 

Страшны не асинхроники, а контакторы, которые их включают. В момент коммутации возникают радиопомехи. И они могут быть особенно мощными и сокрушительными, если контакты не задемпфированы. Как у вас с этим, а ?

Если дело в этом, то запитка от аккумулятора в качестве эксперимента (а я вам настоятельно советую попробовать этот вариант) может и не помочь, т.к. помехи проходят сквозь эфир. Да, вместо аккумулятора можно использовать обычный UPS, физически (вилкой) отключенный от розетки и питающийся от аккумулятора. Это в том, например, случае, если ваш прибор питается от 220В и запитать его прямо от аккумулятора затруднительно или неудобно ...

В период наблюдения явления на площадке ещё шли монтажные работы и ничего такого не включалось

 

Share this post


Link to post
Share on other sites
В период наблюдения явления на площадке ещё шли монтажные работы и ничего такого не включалось

Болгарка, дрель, перфоратор, сварочник ? Нет ? Вы уверены ?

И еще, я бы все-таки стек попробовал увеличить ...

Share this post


Link to post
Share on other sites
Болгарка, дрель, перфоратор, сварочник ? Нет ? Вы уверены ?

И еще, я бы все-таки стек попробовал увеличить ...

Тогда проконсультируйте, пожалуйста, как. Я в Keile этого никогда не делал. Где это находится?

Share this post


Link to post
Share on other sites
Тогда проконсультируйте, пожалуйста, как. Я в Keile этого никогда не делал. Где это находится?

Сходу не припомню, давно не занимался. Вот, что нашлось за первую же минуту:

 

http://www.keil.com/support/man/docs/rlarm...ar_cfgstack.htm

 

Share this post


Link to post
Share on other sites
Остальные memset все просты и явны.

Вам указали на одну из тысячи возможностей. Не надо понимать буквально. Любой цикл в вашей программе, который что-то пишет или просто копирует в память, может снести всю вашу ОЗУ например при разрушении переменных, от которых зависит адрес назначения или счётчик цикла.

Симптомы указывают на вполне типичный баг в работе с указателями. Странно не знать этого после "20 проектов"...

И в борьбе с такими багами часто помогает и защита памяти и обработка всех fault-ов. Чего у Вас также явно нет. Что опять же странно после "20 проектов"... :laughing:

 

memset(x, 0, y), например. Не выходит оно никуда, просто самостоятельно стирает содержимое памяти.

У меня в таких ситуациях срабатывает ловушка по записи по недопустимому адресу (записи в регион где нет ОЗУ, и поэтому закрытый от записи в MPU) когда указатель такого цикла доходит до границы ОЗУ. Автор явно не знает про MPU. :laughing:

.... Или STM32F100 - это не Cortex-M3? Лень смотреть в даташит....

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this