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

21 час назад, slanted сказал:

 while ((wdt_count < wakeup_period)

wdt_count у вас 16-битная, если между чтением младшего и старшего байта возникнет прерывание, в котором младший байт изменится с 0xFF на 0 (а старший увеличится) - ваша программа может дать сбой. Поэтому читать wdt_count надо либо с запрещенными прерываниями, либо дважды и проверять старший байт считанного значения (если он равен - использовать последнее значение, если не равен - считать еще раз и снова сравнить).

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


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

17 минут назад, dontsov сказал:

Да, в последней версии сделали uint32_t его!

А толку? На 8-битном ядре.

Или оно имеет команды атомарного чтения 32-битныхх значений?!  :shok:

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


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

26 minutes ago, jcxz said:

А толку? На 8-битном ядре.

Или оно имеет команды атомарного чтения 32-битныхх значений?!  :shok:

Хм… атомарного не уверен… а где это можно узнать?

да, uint32_t здорово увеличивают память

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


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

1 минуту назад, dontsov сказал:

Хм… атомарного не уверен… а где это можно узнать?

Посмотреть листинг, очевидно.

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


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

7 hours ago, dontsov said:

А как это сделать?

Найти файл с расширением *.lst. Имя у него будет тем же самым, что и у исходника. Например, исходник у вас main.c. Листинг будет main.lst. В нём всё найдёте. Если генерация листингов выключена, то включите её. Как это сделать, смотрите в доке на свою среду разработки.

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


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

5 часов назад, dontsov сказал:

У меня прерывание после sleep... Других нет.

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

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


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

@Сергей Борщ спасибо!

Я вчера поучаствовал в долгой дискуссии в которой объяснили (и я понял и признал) насколько у меня «французский с Нижегородским» в коде.. ахах

Буду рефакторить.

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

Мда. Я до сих пор удивлен, насколько мало находится примеров с watchdog. И те без комментариев.

Вот думаю насколько целесообразно переписать с нуля на регистрах всё.

 

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


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

On 7/14/2021 at 8:15 PM, Сергей Борщ said:

wdt_count у вас 16-битная, если между чтением младшего и старшего байта возникнет прерывание, в котором младший байт изменится с 0xFF на 0 (а старший увеличится) - ваша программа может дать сбой. Поэтому читать wdt_count надо либо с запрещенными прерываниями, либо дважды и проверять старший байт считанного значения (если он равен - использовать последнее значение, если не равен - считать еще раз и снова сравнить).

Сергей, там изначальная версия (от 28 июня, см выше по треду) на которую я отмашку дал, так и написана. Просто это потом куда-то потерялось. Но даже и в таком виде, маловерятно что это причина глюков — после выхода из sleep процессор СНАЧАЛА выполнит прерывание, потом всё остальное, и учитывая что прерывание редкое, крайне вероятно что wdt_count считается одним куском. Да это грязно и по уму надо обкладывать это место cli/sei (как и было сделано), но то что гонка в данных обстоятельствах именно здесь я слабо верю.

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

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


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

1 час назад, slanted сказал:

но то что гонка в данных обстоятельствах именно здесь я слабо верю.

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

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


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

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

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

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

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

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

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

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

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

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