Сергей Борщ 119 14 июля, 2021 Опубликовано 14 июля, 2021 · Жалоба 21 час назад, slanted сказал: while ((wdt_count < wakeup_period) wdt_count у вас 16-битная, если между чтением младшего и старшего байта возникнет прерывание, в котором младший байт изменится с 0xFF на 0 (а старший увеличится) - ваша программа может дать сбой. Поэтому читать wdt_count надо либо с запрещенными прерываниями, либо дважды и проверять старший байт считанного значения (если он равен - использовать последнее значение, если не равен - считать еще раз и снова сравнить). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dontsov 0 14 июля, 2021 Опубликовано 14 июля, 2021 · Жалоба Да, в последней версии сделали uint32_t его! https://github.com/dontsovcmc/waterius/tree/dev Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 14 июля, 2021 Опубликовано 14 июля, 2021 · Жалоба 17 минут назад, dontsov сказал: Да, в последней версии сделали uint32_t его! А толку? На 8-битном ядре. Или оно имеет команды атомарного чтения 32-битныхх значений?! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dontsov 0 14 июля, 2021 Опубликовано 14 июля, 2021 · Жалоба 26 minutes ago, jcxz said: А толку? На 8-битном ядре. Или оно имеет команды атомарного чтения 32-битныхх значений?! Хм… атомарного не уверен… а где это можно узнать? да, uint32_t здорово увеличивают память Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 14 июля, 2021 Опубликовано 14 июля, 2021 · Жалоба 1 минуту назад, dontsov сказал: Хм… атомарного не уверен… а где это можно узнать? Посмотреть листинг, очевидно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dontsov 0 14 июля, 2021 Опубликовано 14 июля, 2021 · Жалоба 3 minutes ago, jcxz said: Посмотреть листинг, очевидно. А как это сделать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dontsov 0 14 июля, 2021 Опубликовано 14 июля, 2021 · Жалоба @Сергей Борщ @jcxz У меня прерывание после sleep... Других нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 15 июля, 2021 Опубликовано 15 июля, 2021 · Жалоба 7 hours ago, dontsov said: А как это сделать? Найти файл с расширением *.lst. Имя у него будет тем же самым, что и у исходника. Например, исходник у вас main.c. Листинг будет main.lst. В нём всё найдёте. Если генерация листингов выключена, то включите её. Как это сделать, смотрите в доке на свою среду разработки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 15 июля, 2021 Опубликовано 15 июля, 2021 · Жалоба 5 часов назад, dontsov сказал: У меня прерывание после sleep... Других нет. Да, это меняет дело. Я в таких случаях пишу об этом в комментарии, чтобы через полгода глядя в код не рвать волосы со словами "ну кто так пишет?". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dontsov 0 15 июля, 2021 Опубликовано 15 июля, 2021 · Жалоба @Сергей Борщ спасибо! Я вчера поучаствовал в долгой дискуссии в которой объяснили (и я понял и признал) насколько у меня «французский с Нижегородским» в коде.. ахах Буду рефакторить. Вообще, если начать понимать, что написал, можно убрать половину кода. Мда. Я до сих пор удивлен, насколько мало находится примеров с watchdog. И те без комментариев. Вот думаю насколько целесообразно переписать с нуля на регистрах всё. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slanted 0 18 июля, 2021 Опубликовано 18 июля, 2021 (изменено) · Жалоба On 7/14/2021 at 8:15 PM, Сергей Борщ said: wdt_count у вас 16-битная, если между чтением младшего и старшего байта возникнет прерывание, в котором младший байт изменится с 0xFF на 0 (а старший увеличится) - ваша программа может дать сбой. Поэтому читать wdt_count надо либо с запрещенными прерываниями, либо дважды и проверять старший байт считанного значения (если он равен - использовать последнее значение, если не равен - считать еще раз и снова сравнить). Сергей, там изначальная версия (от 28 июня, см выше по треду) на которую я отмашку дал, так и написана. Просто это потом куда-то потерялось. Но даже и в таком виде, маловерятно что это причина глюков — после выхода из sleep процессор СНАЧАЛА выполнит прерывание, потом всё остальное, и учитывая что прерывание редкое, крайне вероятно что wdt_count считается одним куском. Да это грязно и по уму надо обкладывать это место cli/sei (как и было сделано), но то что гонка в данных обстоятельствах именно здесь я слабо верю. Изменено 18 июля, 2021 пользователем slanted Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 18 июля, 2021 Опубликовано 18 июля, 2021 · Жалоба 1 час назад, slanted сказал: но то что гонка в данных обстоятельствах именно здесь я слабо верю. Я не спорю - в вашем случае, вполне вероятно, описанный мной сценарий никогда не произойдет. Просто глядя на код мне это бросилось в глаза. Если бы был соответствующий комментарий - я бы поверил ему на слово. Вспомните ли вы о своей вере глядя на этот код через год - гадать не буду, память у всех разная. При наличии комментария зависимость от памяти резко уменьшается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться