Почему сохраняется значение static переменной внутри функции после reset IWDG?
Добрый день,
STM32F030K6.
Есть некоторая функция, в которой объявлена cтатическая переменная bool. Функция отрабатывает и переводит МК в режим StandBy. После чего, через выдержку времени, контроллер сбрасывается по IWDG. Вроде бы, должен произойти сброс всех регистров и новая инициализация переменных, однако, этого не происходит. Значение переменной сохраняется после сброса в том состоянии, которое было до сброса. Пришлось принудительно устанавливать состояние флага.
int Servo_main() { static bool flagStartResetted=false; ... if (false==IsConditionToPull()&&false==flagStartResetted) { HAL_Delay(READY_TO_CLOSE_DELAY_MS); if (false==IsConditionToPull()){ PrintMessage("Reset to closen"); flagStartResetted = true; } } if(true==IsConditionToPull()&&true==flagStartResetted) { flagStartResetted = false; /*без этого при пробуждении значение флага true, хотя true==IsConditionToPull()*/ PrintMessage("Condition to start pulln"); ... HAL_PWR_EnterSTANDBYMode(); } |
int Servo_main() { static bool flagStartResetted=false; ... if (false==IsConditionToPull()&&false==flagStartResetted) { HAL_Delay(READY_TO_CLOSE_DELAY_MS); if (false==IsConditionToPull()){ PrintMessage("Reset to closen"); flagStartResetted = true; } } if(true==IsConditionToPull()&&true==flagStartResetted) { flagStartResetted = false; /*без этого при пробуждении значение флага true, хотя true==IsConditionToPull()*/ PrintMessage("Condition to start pulln"); ... HAL_PWR_EnterSTANDBYMode(); }
Дополнительно:
Вроде бы, должен произойти сброс всех регистров и новая инициализация переменных, однако, этого не происходит.
Не используйте значения "Вроде бы". всегда только в явном виде тогда есть уверенность в "завтрашнем дне".
Уже спокойно отношусь к тому, что те инструменты которые предлагаются не всегда работают так как ожидаешь.
И вот ссылка на нормальный сайт про МК, статья по ...
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Проблема, с которой вы сталкиваетесь, связана с тем, что значение static переменной внутри функции сохраняется даже после сброса IWDG (Independent Watchdog) в вашем микроконтроллере. Это может вызывать нежелательное поведение вашей программы, так как static переменные должны быть сброшены при перезапуске устройства.
Причина, по которой значение static переменной сохраняется, заключается в том, что static переменные хранятся в специальном сегменте памяти, который не обновляется при сбросе IWDG. Это позволяет static переменным сохранять свое значение между вызовами функции.
Чтобы решить эту проблему, вам необходимо явно сбрасывать static переменные внутри функции при срабатывании IWDG. Для этого вы можете использовать дополнительную переменную, которая будет хранить состояние IWDG и в зависимости от этого сбрасывать static переменные.
Пример:
void resetIWDG() { // сброс IWDG } void yourFunction() { static int yourStaticVariable = 0; static int iwdgResetState = 0; if (iwdgResetState == 1) { yourStaticVariable = 0; // сброс static переменной iwdgResetState = 0; // сброс состояния IWDG } // ваш код if (/* условие срабатывания IWDG */) { iwdgResetState = 1; // установка состояния IWDG resetIWDG(); // сброс IWDG } }
В данном примере мы добавили дополнительную переменную iwdgResetState, которая отслеживает состояние IWDG. При срабатывании IWDG мы сбрасываем static переменную и устанавливаем состояние IWDG.
Таким образом, вы можете обеспечить правильное сбрасывание static переменных при срабатывании IWDG и избежать сохранения их значений между перезапусками устройства.