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, то мы бы никогда не нашли эту багу.

1 комментарий

  1. Антон Фельдман:

    макросы — это хорошо. но до определённых пределов ;)