32
« : Июнь 06, 2012, 08:32:46 am »
Чтобы было понятно о чем речь, небольшое вступление:
Мы создаем некий програмно-аппаратный комплекс. Ну, как комплекс.. Сенсор + цифровой мозг (микроконтроллер, плата) + bluetooth low energy по которому эти данные передаются на какой-нибудь iPhone, или персоналку, и где они затем в реальном времени забавными численными методами обрабатываются. Решение околомедицинское (ну, то есть не для реанимации, но для фонового мониторинга пациентов, для людей вообще следящих за своим здоровьем, для тех кто занимается фитнесом в том числе, для тех кто любит полазить по горам).
У сенсора есть некий параметр, которым можно рулить как с микроконтроллера, так и с iPhone/PC. Параметр критически важный, если его выставить не правильно, то процесс измерения нарушится.
Буквально пару дней назад внезапно обнаружилось странное: выставляем одно значение этого параметра, а сенсор нам говорит, что выставлено на самом деле совсем другое. Ну, то есть скажем выставили параметр в единицу, а он говорит, что нифига, тройка там. Плюс были еще некие странности с непосредственно данными получаемыми от собственно процесса измерений. Начали разбираться. На стороне iPhone проверили - все ОК, тут ошибки нет. Пошли разбираться с микроконтроллером. Посмотрели код - все вроде бы хорошо. Пошли дебажить протокол обмена между ним и сенсором. Дебаггер там конечно никак не поможет, поэтому воткнули осцилограф, пошли битики считать на нем. Там вроде тоже все хорошо. Пародоксальная ситуация - все хорошо, а параметр выставляется не правильно!
Ладно, пошли шагать в дебагере по коду микроконтроллера, а ну как там ошибка? Ошибки в коде не обнаружилось, зато обнаружилось, что после того как байт с сенсора принят, в момент посылки сигнала STOP по I2C, принятый байт портится. Если в байте было число n, то становится 2*n+1 (ну, или (n << 1) | 1 ). А поскольку значения-результаты измерений у нас были двух байтовые, то вместо числа 10, мы получали число 277, а вместо 1 мы конечно же получали 3 (тот параметр однобайтовый). Кода отвечающего за это поведения просто нет - ошибка на уровне камня. (а камень у нас от всем известной американской компании широко известной в том числе научными калькуляторами и микроконтроллерами). Воткнули код для обхода этой ошибки, теперь у нас все работает корректно.
При чем тут циклы? А циклы тут не при чем, как и в случае всех остальных ошибок которые я видел как минимум за последний год в нашей команде. Процентов 70-80 ошибок которые вылезают имеют характер подобный вышеописанной ошибке.
PS. И пошаговый отладчик, логгирование и осцилограф помогает отловить именно такие вот ошибки, которые другими методами отловить просто не реально (а таких ошибок, повторю, процентов 70-80). А циклы в отладчике никто не гоняет, в них ошибок просто не бывает.