Reset мозга
От перестановки мест слагаемых, как известно, сумма не меняется. А в наших дивайсах есть такой компонент: MAC-контроллер внутри FPGA, сделанный на основе кода из open cores. Работает он давно и надёжно. По крайней мере, так нам казалось.
При переключении режимов 10/100/1000 этому контроллеру требуется reset, то есть сброс. Для этого соответствующий бит в регистре FPGA устанавливается в 1, а затем сбрасывается.
А ещё есть у нас макрос, который используется процессором ATmega256 для обращения к регистрам:
#define ECR( port, reg)
И всё вроде хорошо, НО функция сброса содержала такой код:
ECR( ECORE_RSTCR, port ) |= ECORE_RSTCR_MAC;
NutSleep( 1 );
ECR( ECORE_RSTCR, port ) &= ~ECORE_RSTCR_MAC;
Короче, сброс MAC-контроллера никогда не делался ;) (поскольку в функции сброса port и адрес регистра перепутаны). И оно всё равно работало! It’s a magic, ясное дело.
Спасибо Косте Добросольцу за упорство, т.к. если бы не signaltap, то мы бы никогда не нашли эту багу.
макросы — это хорошо. но до определённых пределов ;)