Перейти к содержанию
    

Возврат ошибок из HAL функции

Например, возьмём функцию: HAL_StatusTypeDef   HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)

В программе к ней обращаюсь следующим образом: HAL_UART_Transmit_DMA(&huart2, (uint8_t*)Rx_Uart, 12); 

Как бы всё нормуль, работает. Но кроме она умеет возвращать коды ошибок, например (фрагмент из описания этой функции): 

if ((pData == NULL) || (Size == 0U))
    {
      return HAL_ERROR;
    }

Правильно ли я понимаю, что если я хочу проверить, правильно ли отработала эта функция или выдала какую либо ошибку, то вместо простого обращения (как см. выше) я должен написать:

if(HAL_UART_Transmit_DMA(&huart2, (uint8_t*)Rx_Uart, 12) == HAL_ERROR)

{ что-то делаем согласно типу ошибки}  ?

А в случае, если я просто обращаюсь: HAL_UART_Transmit_DMA(&huart2, (uint8_t*)Rx_Uart, 12), то куда уходит: return HAL_ERROR/HAL_OK/...  ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, правильно. Ошибки лучше отлавливать.

Никуда не уходит, просто не используется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

HAL_ERROR означает ошибку конфигурации модуля или ошибку работы с ним. Конкретно и указано - 

if ((pData == NULL) || (Size == 0U))

то есть, если при конфигурации DMA указатель на данные = NULL или же размер данных = 0, такая ошибка и возникнет. 
Конкретно эту ошибку нужно отлавливать на этапе отладки, поскольку это - ошибка программиста.

if(... == HAL_ERROR) { while(1); } 

и при отладке код зависнет на этой строке, и при остановке в отладке курсор встанет именно на эту строчку. А дальше уже проверяйте параметры конфигурации.

Второй вариант - можно выводить диагностическое сообщение в какой-нить интерфейс, например по UART в терминалку. Но для этого интерфейс UART должен быть написан без ошибок. 

1 час назад, Vlad_G сказал:

о куда уходит: return HAL_ERROR/HAL_OK/...

Это дефайн - текстовое имя числового значения. Я на память не помню, какому числу соответствует HAL_ERROR. Но по return просто возвращается какое-то числовое значение. При вызове ф-ции возвращаемое ею значение допускается игнорировать, то есть не присваивать никакой переменной и не использовать иным способом.

Изменено пользователем EdgeAligned

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 05.09.2024 в 17:58, EdgeAligned сказал:

Второй вариант - можно выводить диагностическое сообщение в какой-нить интерфейс, например по UART в терминалку. Но для этого интерфейс UART должен быть написан без ошибок. 

Да, случай вспомнился из жизни.

Зовет регулировщик - графическая панель не запускается. Черный экран и тишина. И так на всей партии.

Сначала помянул чью-то маму, потом решил подключиться к уарту. Ну и видим:

Init xxx - Ok

Init yyy - Ok

Init touch screen - Fail

Оказалось, снабженцы при закупке дисплеев на одну букву ошиблись и закупили с другим контроллером тача - ILI вместо FT.

Пришлось, конечно, срочно перепиливать драйвер. Но одна строчка диагностического вывода сэкономила кучу времени на диагностику (которого и так не было)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...