Весь день бился с assert-ом

Обсуждаем контроллеры компании Atmel.
Ответить
Simon.S
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пн дек 15, 2025 13:29:04

Весь день бился с assert-ом

Сообщение Simon.S »

Весь день сегодня бился с 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, но это уже извращения.

Может кому пригодится - не только я один такой. На англоязычных ресурсах это тоже обсуждалось и предлагалось использовать свои макросы утверждений, но не объяснялось почему стандартное утверждение не работает. А может для них это очевидно - документацию прочитали :music:

Код: Выделить всё

#	define assert_na(e)	((e) ? (void)0 : \
					fprintf(stderr, "Assertion failed: (%s), function %s, file %s, line %u.\n", #e, __func__ , __FILE__, __LINE__))
Ответить

Вернуться в «AVR»