Смешного вот напишу

На прошлой неделе три дня промучился с отладкой вроде бы простейшей прошивки для очередного девайса. Если просто — приборчик должен был делать что-то несложное по прерыванию на одном из входов CC2541 и одновременно работать Bluetooth-beacon’ом — казалось бы, что может быть проще? Но я допустил совершенно идиотскую ошибку — перепутал номер порта в обработчике прерывания, написав вместо

HAL_ISR_FUNCTION( drdyHandler, P0INT_VECTOR )

вот такую штуку:

HAL_ISR_FUNCTION( drdyHandler, P1INT_VECTOR )

Что забавно — обработчик прерывания работал (и поэтому был вне подозрений), а вот Bluetooth порой валился с совершенно невнятными ошибками. Все дело в том, что векторы прерываний портов идут подряд, просто «по умолчанию» на месте вектора прерывания оказывается вполне себе допустимая инструкция

MOV R7,A

Она выполняется, выбирается следующая за ней — это инструкция перехода к обработчику другого прерывания, и все почти хорошо — если бы при этом не портился регистр R7. Именно это и приводило к непредсказуемым глюкам.