ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 апреля
1039175 Топик полностью
teap0t (23.09.2020 09:41 - 10:05, просмотров: 475) ответил SciFi на Пустой макрос "#define assert_param(expr)". Он заменяет в коде assert_param(всякое_разное) на пустоту. Макросы -- это простая тема. Текстовые подстановки, но с нюансами, конечно.
Добавил такую строку в компилируемый файл получил ошибку Error[Pm050]: a null statement shall only occur on a line by itself, and shall not have any other text on the same line (MISRA C 2004 rule 14.3). Т.е. имеем файл "*.c" со строками: 
#define assert_param(expr)
<..>
  assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));

Ошибка Error[Pm050]: a null statement shall only occur on a line by itself, and shall not have any other text on the same line (MISRA C 2004 rule 14.3)

Если макро выглядит как в оригинальной версии:



#define assert_param(expr) ((void)0) <..> assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));

Ошибка Error[Pm049]: all non-null statements shall have a side-effect (MISRA C 2004 rule 14.2)

Если сделать, как во второй ветке:


  #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
  void assert_failed(uint8_t* file, uint32_t line);
<..>
  assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));

Ошибок нет. Но, если я правильно понимаю, где-то должна существовать функция void assert_failed(uint8_t* file, uint32_t line);. Я знаю, что она находится в директории IAR, а мне бы хотелось от этой связи избавиться.


Обнаружил (да, я тормоз), что "USE_FULL_ASSERT", заданный в опциях проекта (препроцессор) также убирает все ошибки.


Дурак, блин. В main.c она:


#ifdef  USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif
Это я, здравствуйте. http://the-epic-file.com/bookshelf.htm