Весь день сегодня бился с assert - не мог его вывести в stderr по USART (эмуляция в протеусе), чуть было не психанул и не прошил реальный камень. Но тут я прочитал документацию:
Цитата:
A diagnostic message is written to stderr and the function abort() is called, effectively terminating the program.
Хотя в выводе ассемблера(скорее всего из-за оптимизации) явно строчка call abort была только в режиме без определения макроса __ASSERT_USE_STDERR в основном из-за этого и затупил.
Понятно, что прерывания сразу отрубались, и в stderr ничего не попадала. Но когда я переписал вывод в NONATOMIC_BLOCK с ожиданием стирания бита UDRIE (особенность используемой USART библиотеки, чтобы не менять её код), всё стало печататься.
По этому поводу запилил свой assert, не убивающий процесс чтобы не переписывать нормальный вывод в stderr. Так же понятно, что можно было бы восстановить прерывания и переопределить стандартный макрос на обертку с goto, но это уже извращения.
Может кому пригодится - не только я один такой. На англоязычных ресурсах это тоже обсуждалось и предлагалось использовать свои макросы утверждений, но не объяснялось почему стандартное утверждение не работает. А может для них это очевидно - документацию прочитали

Код:
# define assert_na(e) ((e) ? (void)0 : \
fprintf(stderr, "Assertion failed: (%s), function %s, file %s, line %u.\n", #e, __func__ , __FILE__, __LINE__))