Jump to content

    
dontsov

attiny85: watchdog зависает

Recommended Posts

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

 while ((wdt_count < wakeup_period)

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

Share this post


Link to post
Share on other sites
17 минут назад, dontsov сказал:

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

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

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

Share this post


Link to post
Share on other sites
26 minutes ago, jcxz said:

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

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

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

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

Share this post


Link to post
Share on other sites
7 hours ago, dontsov said:

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

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

Share this post


Link to post
Share on other sites
5 часов назад, dontsov сказал:

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

 

Share this post


Link to post
Share on other sites
On 7/14/2021 at 8:15 PM, Сергей Борщ said:

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

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

Edited by slanted

Share this post


Link to post
Share on other sites
1 час назад, slanted сказал:

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.