Тестирование кода для встроенного приложения

StackOverflow https://stackoverflow.com/questions/1572601

  •  21-09-2019
  •  | 
  •  

Вопрос

Предыстория:

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

Вопрос:

Проект, который я разрабатываю, в конечном итоге должен будет соответствовать стандартам SIL.

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

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

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

--Стив

Это было полезно?

Решение

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

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

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

"Тестовый жгут" будет представлять собой весь ваш высокоуровневый код, не зависящий от HW, с "поддельным" более низким уровнем специально для тестирования.Это может имитировать правильную и неправильную функциональность устройств HW и, таким образом, позволяет запускать автоматические тесты на ПК.

Другие советы

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

Итак, что вам нужно, так это разделить ваше приложение на различные части, которые вы можете тестировать независимо.Имитируйте (или макетируйте) все оборудование, которое вам нужно для этих тестов, и запускайте их на вашем КОМПЬЮТЕРЕ для разработки.

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top