Все функции библиотеки HAL, SPL используют для проверки своих аргументов макрос assert_param.
Этот макрос выполняет проверку выражения с участием проверяемого аргумента функции на равенство нулю. Если значение выражения равно нулю, то вызывается функция-обработчик ошибки аргумента assert_failed, в противном случае (выражение не равно нулю) проверка аргумента проходит успешно.
В своей программе вам необходимо реализовать функцию assert_failed.
В ней выводится сообщение об ошибке , название файла и номер строки кода, вызвавшей ошибку.
Этот макрос выполняет проверку выражения с участием проверяемого аргумента функции на равенство нулю. Если значение выражения равно нулю, то вызывается функция-обработчик ошибки аргумента assert_failed, в противном случае (выражение не равно нулю) проверка аргумента проходит успешно.
В своей программе вам необходимо реализовать функцию assert_failed.
В ней выводится сообщение об ошибке , название файла и номер строки кода, вызвавшей ошибку.
#ifdef USE_FULL_ASSERT void assert_failed(uint8_t* file, uint32_t line) { while (1) { } }/* assert_failed */ #endif/*USE_FULL_ASSERT*/
Реализованная в вашем коде функция assert_failed используется только когда объявлен макрос USE_FULL_ASSERT. В противном случае весь отладочный код исключается из исходника. Пример использования assert_param.
void set_param(uint8_t * param, uint8_t value) { assert_param( param != NULL); *param = value; }/*set_param*/
Функция устанавливает значение параметра через указатель, передаваемый в качестве аргумента. Если макрос USE_FULL_ASSERT не объявлен, то можно считать , что строчки assert_param( param != NULL) в коде просто нет, иначе в этом определении происходит проверка параметра. Если указатель не определен, то значение param != NULL будет ложно и будет запущена функция assert_failed , которая выведет через USART название файла и номер строки с ошибкой, после чего зациклится, тем самым предотвратив присвоение значения по неопределенному адресу в памяти. Вы совсем не обязаны использовать макрос assert_param в своем коде, но в коде библиотеки SPL он используется везде. Функцию set_param можно реализовать с проверкой ошибок аргумента без применения assert_param.
#define ERROR (-1) #define OK (0) int set_param(uint8_t * param, uint8_t value) { int r = ERROR; if ( param == NULL) return r; *param = value; r = OK; return r; }/*set_param*/