Когда в руководстве по микроконтроллеру написано «проверь, что ХХ случается», что делать, если этого не происходит? - PullRequest
3 голосов
/ 21 июня 2019

Многие таблицы и справочные руководства по микроконтроллерам содержат инструкции, подобные следующим [цитируемым из справочного руководства по ST]:

  1. Программируйте новое число состояний ожидания для битов LATENCY в регистре FLASH_ACR
  2. Проверьте, учитывается ли новое число состояний ожидания для доступа к флэш-памяти, читая регистр FLASH_ACR
  3. Измените источник тактового сигнала процессора, записав биты SW в регистр RCC_CFGR ...

Если в справочном руководстве указаны некоторые обстоятельства, при которых значение может не вступить в силу немедленно или может вообще не вступить в силу, если запись не будет повторяться, тогда код может учесть такие возможности.В отсутствие какой-либо такой спецификации, как следует ожидать от усердного программиста шага 2?Возможные варианты:

  1. Установите FLASH_ACR, проверьте его и сообщите о фатальной ошибке, если значение не соответствует ожидаемому.

  2. Установите FLASH_ACRодин раз, затем проверьте его в цикле do-while, зацикливая навсегда, если правильное значение никогда не появляется.

  3. Установите FLASH_ACR один раз, затем проверьте его в цикле do-while, но подайте сигнал aфатальная ошибка после некоторого числа итераций, если правильное значение не появляется.

  4. Установите и проверьте FLASH_ACR в цикле do-while, повторяющемся навсегда, если значение никогда не будет установлено правильно.

  5. Установить и проверить FLASH_ACR в цикле do-while, но сообщить о фатальной ошибке после некоторого числа итераций.

  6. Принудительное чтение аппаратного обеспечениязарегистрируйтесь в случае, если это приведет к необходимой задержке, и сделайте значение видимым, если установлена ​​точка останова отладчика, но в противном случае проигнорируйте результат.

  7. Игнорируйте шаг 2, кроме как во время разработки.

IОбычно определенные операции имеют задержанный эффект, а системы требуют, чтобы код ожидал завершения некоторых операций, прежде чем инициировать другие.Неясно, однако, при каких обстоятельствах FLASH_ACR может не быть установлен должным образом при отсутствии повреждения чипа, достаточно серьезного, чтобы сделать любую попытку выполнения программы бессмысленной.Я предполагаю, что проверки в первую очередь предназначены для устранения неполадок в случае, если все работает не так, как задумано, но в остальном не является необходимой частью производственного кода.Как другие люди обрабатывают такие проверки?

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Собственный код запуска ST таких действий не предпринимает. Например, с system_stm32f4xx.c версия 1.6.9:

    /* Wait till the main PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }

#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx)      
    /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
    FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_5WS;
#endif /* STM32F40_41xxx || STM32F42_43xxx */

#if defined (STM32F401xx)
    /* Configure Flash prefetch, Instruction cache, Data cache and wait state */
    FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN |FLASH_ACR_DCEN |FLASH_ACR_LATENCY_2WS;
#endif /* STM32F401xx */

    /* Select the main PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= RCC_CFGR_SW_PLL;

    /* Wait till the main PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL);
    {
    }

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

0 голосов
/ 24 июня 2019

Зависит от того, насколько детализирована обработка ошибок. Если вы хотите записать в журнал или отобразить сбой регистра Flash ACR, вы можете подождать определенное время, прежде чем вернуться в безопасный режим обработки ошибок.

Для большинства систем будет достаточно просто включить сторожевой таймер на ранней стадии, а затем подождать, пока регистр не будет установлен с циклом занятости-ожидания while.

В случае состояний ожидания и часов, в частности, вы можете / не захотите сделать в случае ошибки, так как ошибка означает, что среда, в которой работает программа, мертва. В лучшем случае MCU вернется к внутреннему RC-генератору по умолчанию, чтобы ваш обработчик ошибок мог «хромать». Для некоторых приложений это даже не нужно, а просто сброс MCU.

...