ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
22 декабря
901960
Evgeny_CDАрхитектор (05.02.2019 18:12, просмотров: 19457)
[Advanced тестирование "боевых" прошивок] Идея. http://cs.swan.ac.uk/~csoliver/ok-sat-library/internet_html/doc/doc/Gcc/4.6.4/html/gccint/LTO.html
Есть у нас прошивка, которую собрали в "полном хардкоре": -- один файл исходника -- LTO -> -- прочая Надо бы ее протестировать, перед тем как пускать в продакшн... Но для части кода тестовый и боевой код сильно разные. Например, вместо драйвера UART нам надо заглушку, которая будет взаимодействовать с внешним ПК, где будет крутиться упрощенный эмулятор модема. Но если мы будем собрать боевое ядро с тестовым кодом - это будет совсем другая прошивка. Делаем так. 1. Заранее готовим data set для тестирования со 100% покрытием кода основного модуля. 2. Дрова тестируем со специальным кодом без основного модуля. 3. Исходники основного модуля пишем правильно. Вместо init как последовательности операторов в main пишем int init (); 4. Готовим исходники заглушек в отдельных файлах. Чтобы интерфейс вызова из основного модуля был одинаков. 5. Собираем отдельно боевой комплектный модуль, начиная с какого-то адреса 6. Собираем отдельно модуль заглушек. 7. Пишем/патчим срипт линкера, чтоб получить загрузочный образ, и чтобы линкер скомпоновал бинарник из тестового и основного модуля, заменив адреса части боевых функций вызовами тех же функций в тестовом варианте. 8. Берем либо тот же камень, либо из того же семейства с большим объемом ОЗУ/FLASH 9. Пишем на ПК тестовые модели 10. Натягиваем "почти боевую" прошивку во все дыры. Есть тонкости в эмуляции прерываний, от архитектуры зависит, но решить можно. Не всякий боевой код можно так протестировать, но если изначально затачиваться на такой метод, то все будет ок, и оверхеды будут микроскопические. Жестко синхронные вещи, типа когда код знает и учитывает это, сколько тактов он исполняется, так не отладить - но так ответственные сложные вещи не стоит писать. Можно, конечно, создать железный эмулятор SD карты, Serial NAND, но кто и в рамках какого бюджета будет их делать? В моем варианте трудоемкость сильно меньше. В отличие от просто тестирования, и тестирования в синтетических портах (их никто не отменяет, это дополнение), можно эффективно тестировать не только ошибки ТЗ и кодера, но и ошибки компилятора. "Эмуляторы сущностей" удобно писать на ПК под SystemC - там хорошо поведенческие вещи описывать. ПО машин состояний тоже будет очень кстати для эмуляторов. Можно бенчмаркить целевой код и подбирать опции компилятора - это дело муторное, без полной автоматизации не обойтись. Подаем на вход стека несколько IP пакетов и смотрим время обработки. Подбираем оптимизацию под нашу конкретную задачу, а не вообще. Часть глюков останется, но в тонком слое между драйверами и боевым кодом. Что тестируем: -- подаем на вход стека все варианты битых и кривых пакетов, смотрим, что все переходы выполнены верно. -- FLASH - прогоняем все варианты битых секторов (проверка ECC), а также абсурдные данные из сектора -- поведение на наборе данных от контролируемого объекта. -- многое другое. Это не панацея, но, на первый взгляд, мощный инструмент для тестирования. Критика?