2009-10-15 2 views
15

Фон:Код испытания для встроенного применения

Я разрабатываю довольно большой проект, используя Atmel AVR atmega2560. Этот проект содержит множество аппаратных функций (7 устройств SPI, 2 I2C, 2 порта RS485 MODBUS, множество аналоговых и цифровых входов/выходов). Я разработал «драйверы» для всех этих устройств, которые обеспечивают основной цикл приложения с помощью интерфейса для доступа к требуемым данным.

Вопрос:

Проект Я разрабатываю в конечном счете должны соответствовать SIL стандартам.

Я хотел бы иметь возможность протестировать код и обеспечить хороший уровень покрытия кода. Однако я не могу найти какую-либо информацию, чтобы начать с того, как следует создать такую ​​структуру тестирования.

Идея состоит в том, что у меня может быть набор автоматических тестов, которые позволят исправить ошибки ошибок и дополнения к функциям, чтобы проверить, не нарушают ли они код. Дело в том, что я не понимаю, как код может быть протестирован на чипе.

Нужно ли мне оборудование для мониторинга ввода-вывода на устройстве и эмуляции внешних устройств? Любые указатели, которые могут быть предоставлены, будут высоко оценены.

--Steve

ответ

12

Это очень хороший вопрос - общая проблема для встроенных разработчиков. К сожалению, большинство встроенных разработчиков не так обеспокоены, как вы, и проверяйте только код на реальном оборудовании. Но, как отметил еще один ответ, это может в основном проверить только номинальную функциональность кода, а не ошибки угла/ошибки.

Не существует простого и простого решения этой проблемы. Однако некоторые руководящие принципы и методики имеют относительно хорошую работу.

Сначала разделите свой код на слои. Один уровень должен быть «аппаратным агностиком» - то есть вызовы функций. Не просите пользователя напрямую записывать в регистры HW. Другой (нижний) слой относится к HW. Этот слой можно «высмеять», чтобы проверить более высокий уровень. Более низкий уровень не может быть действительно протестирован без HW, но он не будет меняться часто и требует глубокой интеграции HW, поэтому это не проблема.

«Испытательный жгут» будет вашим высокоуровневым агностическим кодом HW с «поддельным» нижним уровнем специально для тестирования.Это может имитировать HW-устройства для правильной и неправильной работы и, таким образом, позволяет запускать автоматические тесты на ПК.

3

Никогда не запускать модульные тесты на или против реального оборудования. Всегда издевайтесь над интерфейсами ввода/вывода. В противном случае вы не можете имитировать условия ошибки и, что более важно, вы не можете положиться на тест, чтобы добиться успеха.

Так что вам нужно разбить приложение на различные части, которые вы можете тестировать самостоятельно. Симулятор (или макет) все аппаратные средства, которые вам нужны для этих тестов, и запускайте их на своем ПК разработки.

Это должно охватывать большую часть вашего кода и оставляет вас с драйверами. Постарайтесь сделать как можно больше кода драйвера без использования оборудования. В остальном вам нужно понять, как сделать код на аппаратном уровне. Это обычно означает, что вы должны создать тестовую кровать с внешними устройствами, которые реагируют на сигналы и т. Д. Так как это хрупкое (так как в «ваши тесты не могут сделать эту работу автоматически»), вы должны запускать эти тесты вручную после подготовки оборудования.

+1

SRoe, я также настоятельно рекомендую вам абстрагироваться от более высокоуровневой логики, алгоритмов, функциональности и т. Д. Стремитесь изолировать действительно аппаратное или конкретное устройство в небольшом числе модулей. Это облегчит вам руководство Аарона. Это также улучшит тестируемость аппаратно-незаписанных бит. –

+3

После запуска на хосте вы должны выполнить единичные тесты на реальном целевом оборудовании, но выбивать доступ к внешнему оборудованию. Это улавливает компилятор и аппаратные ошибки на целевой платформе. Это может потребоваться даже для более высоких уровней SIL. – starblue

2

Vectorcast - это коммерческий инструмент для проведения модульных испытаний оборудования с охватом кода.

0

У вас есть разъем JTAG? Вы можете использовать JTAG для имитации ошибок на чипе.

0

Мне нравится отделять задачи. Например, когда я создал круговой буфер для своего Atmel AVR, я написал все это в Code :: Blocks и скомпилировал его с помощью обычного компилятора GCC вместо компилятора AVR GCC, затем создаю для него единичный тест. Я использовал специальный файл заголовка, чтобы обеспечить соответствующие типы данных, с которыми я хотел работать (например, uint8_t). Я обнаружил ошибки с модульными тестами, исправил их, затем перевел фиксированный код в AVR Studio и интегрировал его. После этого я использовал написанные функции поддержки и ISR, чтобы поместить буфер в полезный код (т. Е. Вытащить один байт из буфера, вставить его в регистр вывода данных UART, добавить строчную константу в буфер для функции printf и т. Д.). Затем я использовал симулятор AVR, чтобы убедиться, что мои ISR и функции вызываются и что правильные данные появляются в регистрах. После этого я запрограммировал его на чип, и он работал отлично.

Я очень предпочитаю возможности отладки Code :: Blocks по сравнению с AVR Studio, поэтому я использую вышеуказанный подход, когда могу. Когда я не могу, я обычно имею дело только с оборудованием. Например, у меня есть таймер, который автоматически создает прямоугольную волну. Лучшее, что я мог сделать, это увидеть, что в симуляторе сбивается штыревой бит. После этого мне просто нужно было поднять прицел и убедиться.

Мне нравится использовать многоуровневый подход при отладке проблем. Например, с часами первый слой: «Поместите зонд на булавку и посмотрите, есть ли там сигнал». Если нет, проконтролируйте штырь на uC и ищите сигнал. Затем я закодировал интерфейс отладки в одном из моих UART, где я могу посмотреть конкретные значения регистра и убедиться, что они такие, какими они должны быть. Поэтому, если это не сработает, следующим шагом будет «вызвать значение регистра и убедиться, что оно правильно».

Попробуйте подумать вперед четыре шага или около того, когда вы планируете свою отладку. Здесь должно быть + 5В, но что, если нет? Запишите в интерфейс отладки способ переключения булавки и посмотреть, не изменит ли она ее. Что делать, если это не сработает? Сделайте что-нибудь еще и т. Д. И т. Д. Вы дойдете до точки, в которой вы столкнетесь: «У меня нет ИДЕИ, ПОЧЕМУ ЭТОТ ОПАСНО, ЧТО НЕ РАБОТАЕТ !!!!» но, надеюсь, вы поймете причину заранее.

Смежные вопросы