Почему сохраняется значение static переменной внутри функции после reset IWDG?

Ссылка скопирована
1 ответ

Добрый день,
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(); }

Дополнительно:

Вроде бы, должен произойти сброс всех регистров и новая инициализация переменных, однако, этого не происходит.

Не используйте значения "Вроде бы". всегда только в явном виде тогда есть уверенность в "завтрашнем дне".
Уже спокойно отношусь к тому, что те инструменты которые предлагаются не всегда работают так как ожидаешь.

  • Borys Latysh, Да уж, эта "особенность" попила мне крови. Понадеялся на стандарты С, а оно вот так бывает. Спасибо за мнение.
  • Я конечно не эксперт, но там ядро и периферия как-то разделены. Например системный таймер systick
    И вот ссылка на нормальный сайт про МК, статья по ...
  • Пока только нашел на просторах, что при перезагрузке не происходит полной переинициализации RAM (вроде как времязатратная процедура). Надо смотреть документацию по ядру.
  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Сергей Миронов Ответ

    Проблема, с которой вы сталкиваетесь, связана с тем, что значение 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
      }
    }

    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 и избежать сохранения их значений между перезапусками устройства.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно