В этом примере показано, как симулировать выполнение задачи и как сгенерировать код и запустить его на аппаратной плате SoC.
Разработка приложения часто включает симуляцию алгоритма, чтобы гарантировать правильное поведение. Такие симуляции обычно игнорируют аспекты встроенного системного окружения в реальном времени. Это может позволить устранить определенные проблемы синхронизации до тех пор, пока приложение не запустится на оборудовании.
Проблемы с синхронизацией часто приводят к неправильному поведению приложения. SoC Blockset помогает вам обнаружить эти проблемы в симуляции, а не на оборудовании. Это может помочь вам избежать дорогостоящей отладки на оборудовании.
Проблемы синхронизации чаще возникают, когда приложения становятся более комплексными. Для примера переполнение скорости и нежелательное прерывание скорости чаще встречаются в приложениях с несколькими задачами из-за ограничений по ресурсам и зависимостей задачи. Симуляция многозадачных приложений с SoC Blockset поможет вам в раннем обнаружении этих проблем.
В этом примере выполнение задачи моделируется с помощью SoC Blockset. Вы узнаете о различных методах симуляции длительности задачи и о том, когда их использовать. Вы также узнаете, как проверить спецификации синхронизации на оборудовании.
Поддерживаемые аппаратные платформы:
Набор для оценки ZC706 Xilinx ® Zynq ®
Набор для оценки ZCU102 Xilinx Zynq UltraScale™+ MPSoC
ZedBoard™ Zynq-7000 развития
Комплект для разработки Altera ® Cyclone ® V
Набор для разработки Altera Arria ® 10 SoC
Модели, используемые в этом примере, заданы для платы набора для оценки ZC706 Xilinx Zynq. Для использования другой аппаратной платы выберите на вкладке System on Chip одну из аппаратных плат, перечисленных в разделе Hardware Board. Сделайте то же самое для верхней модели и модели-ссылки.
SoC Blockset моделирует выполнение программных задач так, как они выполнялись бы на SoC-процессоре. Симуляция чтит параметры задачи, такие как период, приоритет и ядро процессора. SoC Blockset моделирует упреждение задачи, переполнение задачи и параллельное выполнение задачи.
Следующая схема иллюстрирует вышеупомянутые аспекты симуляции выполнения задачи. В первых двух подграфиках можно наблюдать, что Task1 выполняется каждые 0,1 с и, поскольку они оба разделяют Core 0, Task1 прерывания Task2 которые выполняются каждые 0,2 с. В третьем подграфике можно наблюдать, что Core 0 все еще имеет некоторое время простоя. Последние два подграфиков показывают Task3, выполняемые каждые 0,3 с на Core 1.
Дополнительные сведения о симуляции выполнения задачи см. в разделе Что такое Выполнение задачи?
Блок Task Manager позволяет вам конфигурировать выполнение задач в модели. В диалоговом окне блока вы определяете, сколько задач вам нужно в системе с помощью кнопок Add и Delete. На вкладке Main диалогового окна вы устанавливаете основные свойства задачи, а на вкладке Simulation - свойства задачи симуляции.
Следующий рисунок иллюстрирует вкладку Main блока Task Manager.
Задача имеет имя, чтобы ее можно было идентифицировать в модели и различных связанных графиках. Метки портов на блоке Task Manager используют имена задач для простой идентификации.
Задача может быть двух типов. Событийно-управляемая задача выполняется при вызове событием. Линия события из исходного блока данных ввода-вывода, соединенного с блоком Task Manager, запускает задачу. Задача, управляемая таймером, выполняется с заданным периодом, заданным на вкладке Main диспетчера задач.
Приоритет управляемых событиями задач определяется на вкладке Main Диспетчера задач. Приоритет задачи, управляемый таймером, назначается автоматически.
В диалоговом окне Task Manager можно также задать ядро процессора, на котором можно выполнить задачу так, чтобы, если ваша аппаратная плата имеет несколько ядер, можно было задать задачи для выполнения одновременно.
Блок Task Manager также позволяет вам настроить обработку переполнения задачи. Например, вы можете принять решение удалить образец задачи, если предыдущий образец задачи не был запущен или завершен. Или, возможно, вы решите попытаться догнать график задач, несмотря на переполнение.
Чтобы симулировать эффекты задачи в реальном времени, такие как упреждение и переполнение, SoC Blockset требует, чтобы вы предоставили длительность каждой задачи. Длительность определяется как время, прошедшее между началом задачи и концом задачи. В идеале вы будете измерять длительность задачи на своём оборудовании плате. Если это невозможно, проверьте длительность задачи в таблицах данных, предоставленных разработчиками алгоритма задачи. В качестве последней меры необходимо задать длительность относительно периода задачи или самого короткого интервала рецидива для апериодических задач.
У SoC Blockset есть несколько вариантов настройки длительности задачи. Поскольку длительность задачи применяется только к симуляции, эти варианты находятся на вкладке Simulation диалогового окна Task Manager.
Следующий рисунок иллюстрирует вкладку Simulation диалогового окна Task Manager.
Наиболее часто используемые опции:
Диалоговое окно - позволяет вам задать длительность задачи через нормальное распределение или комбинацию нескольких нормальных распределений, используя средние и стандартные параметры отклонения.
Input port - Позволяет вам задавать длительность задачи на основе образца. Например, можно создать модель, которая вычисляет длительность задачи и соединяет ее с входным портом Task Manager.
Следующая блок-схема поможет вам выбрать наиболее подходящую опцию.
Если время длительности для задачи имеет различные распределения и причины, выберите наиболее подходящие опции, используя блок-схему в качестве общего руководства.
Можно сконфигурировать дополнительные параметры симуляции и выполнения для SoC Blockset в диалоговом окне строения модели. Профилирование задачи, в симуляции и на процессоре, позволяет вам профилировать выполнение задачи, транслировать результаты в Data Inspector и сохранять их в файл.
Можно также задать значение задержки ядра, чтобы повлиять на выполнение задачи в симуляции. Это значение сильно изменяется, но обычно намного меньше, чем длительность задачи. Поэтому рекомендуется оставить значение в 0 с, если вы не можете определить соответствующее значение для вашей аппаратной платы.
Следующий рисунок показывает параметры SoC, связанные с выполнением задачи в диалоговом окне параметров конфигурации модели. Обратите внимание, что профилирование задач на панели процессора показывает только, если вы устанавливаете все необходимые продукты и пакеты аппаратной поддержки.
Остальные шаги этого примера иллюстрируют некоторые опции, показанные на вышеописанной блок-схеме.
Этот случай требует, чтобы вы симулировали алгоритм ЦОС, который обрабатывает систему координат данных. Для этого требуется следующий продукт:
DSP System Toolbox
Если у вас нет этого продукта, перейдите к следующему случаю после просмотра описания этого случая.
В этом случае вы научитесь моделировать длительность задачи, когда алгоритм задачи имеет один путь кода.
Предположим, что вам поручено разработать приложение, которое обрабатывает данные RF (радиочастоты) на плате СО. После предварительной обработки в ядре FPGA данные передаются в ядро процессора по протоколу AXI4. Алгоритм, выполняемый на ядре процессора, должен определить, содержат ли данные высокочастотный или низкочастотный сигнал. С этой целью к данным применяются lowpass и верхних частот. Получившиеся сигналы затем сравниваются с выбранным порогом. Основываясь на этом описании, эта задача имеет один путь кода, без основных ветвей кода. Исходный код для функции задачи может иметь следующую форму.
double dataReadTask(double in[]) { /* Frame size is always 1000 */ int signalType; /* 0 - LP, 1 - HP */ double out1[1000], out2[1000]; filterLP(in, out1, 1000); filterHP(in, out2, 1000); signalType = thresholding(out1, out2, 1000); }
1. Откройте модель. Обратите внимание на подсистему тестовых данных. Блок RF Data Source в подсистеме представляет внешнюю память и ядро FPGA. Блок RF Data Source имеет два выходных порта, Stream Data и событие. Они выводят данные RF и уведомление, когда доступна новая система координат данных, соответственно.
2. Обратите внимание, что блок RF Data Source генерирует системы координат 1000 отсчетов каждые 0,01 с. Системы координат являются выборками синусоидальной формы 1 кГц.
3. Щелкните блок Диспетчер задач. Обратите внимание, что он устанавливает управляемую событиями задачу dataReadTask. Задача запускается приходом новой системы координат данных.
4. Щелкните вкладку Simulation в диалоговом окне Task Manager, чтобы определить длительность задачи для симуляции.
Поскольку алгоритм состоит из двух фильтров, выполняемых без условий, приложение имеет один путь кода. Поэтому вы следуете первой левой ветви в блок-схеме, показанной во введении, и ожидаете, что времена выполнения алгоритма имеют нормальное распределение.
Основываясь на информации, предоставленной разработчиком алгоритма, вы определяете, что среднее время выполнения составляет 0,0095 с и что стандартное отклонение составляет 0,0001 с. Чтобы представлять пределы реального времени, вы также решаете установить минимальные и максимальные времена выполнения равные 0,00925 с и 0,00975 с, соответственно.
Установите параметры длительности в диалоговом окне Task Manager на вкладке Simulation, как описано выше.
5. В модели щелкните Запуском, чтобы начать симуляцию. Подождите, пока симуляция не завершится.
6. На панели инструментов модели откройте Data Inspector и проверьте dataReadTask. Изменение масштаба для более тщательного просмотра времен выполнения задачи.
7. Выполните следующую команду для статистического анализа времен выполнения задачи. Наблюдайте номера запусков Data Inspector. Измените команду, если номера запусков отличаются.
socTaskTimes('soc_task_execution', 'Run 1: soc_task_execution_simprofile')
Обратите внимание, что сроки выполнения задачи варьируются. Как ожидалось, гистограмма времени длительности задачи указывает, что алгоритм имеет один путь кода. Значения длительности кластеризованы вокруг среднего значения 0,0095 с.
8. Закройте модель, не внося никаких изменений.
В этом случае вы узнаете, как смоделировать длительность задачи, когда алгоритм задачи имеет два пути кода, и можно предсказать, какой путь будет взят.
Предположим, что вы разрабатываете приложение видеонаблюдения. Задача - постоянно обрабатывать видео данных, чтобы определить, было ли вторжение в систему. Алгоритм вычисляет величину изменения сцены между последовательными видео данных систем координат. Если изменение сцены превышает выбранный порог, такие системы координат записываются, так как они могут использоваться в качестве доказательства потенциального вторжения. Таким образом, этот алгоритм имеет два пути кода. Исходный код этого алгоритма может быть представлен в следующей форме.
void VideoTask(single in[], in length, double threshold) { double energy; energy = calcSceneChange(in, length); if (energy > threshold) recordFrame(in, length); } }
1. Откройте модель. Обратите внимание на Данные Исходного блока, которая выводит системы координат видео данных.
2. Щелкните блок Model и заметьте, что алгоритм вычисляет энергию движения между последовательными системами координат данных. Если вычисленная энергия движения превышает порог, выполняется Основной Алгоритм.
3. Щелкните блок Диспетчер задач. Обратите внимание, что он устанавливает управляемую таймером задачу VideoTask. Эта задача запускается каждые 0,33333 с, что является частотой видеокадров.
4. Перейдите на вкладку Simulation в диалоговом окне Task Manager, чтобы определить длительность задачи для симуляции.
Поскольку алгоритм имеет два пути кода, и можно предсказать, какой путь кода будет взят, следуйте второй левой ветви в блок-схеме.
Моделируйте длительность задачи, чтобы зависеть от энергии движения. В зависимости от того, превышен ли порог энергии движения или нет, вы присвоите длительность задачи со средним значением 75% или 50% от частоты систем координат, соответственно.
Щелкните Подсистема оценки длительности задачи, чтобы понять, как смоделировать длительность задачи.
5. В модели щелкните Запуском, чтобы начать симуляцию. Подождите, пока симуляция не завершится.
6. На панели инструментов модели откройте Data Inspector и смотрите VideoTask. Изменение масштаба для более тщательного просмотра времен выполнения задачи.
7. Выполните следующую команду для статистического анализа времен выполнения задачи. Наблюдайте номера запусков Data Inspector. Измените команду, если номера запусков отличаются.
socTaskTimes('soc_task_execution_step2', 'Run 3: soc_task_execution_step2_simprofile')
Обратите внимание, что сроки выполнения задачи варьируются. Как ожидалось, гистограмма времени длительности задачи указывает, что алгоритм имеет два пути кода.
8. Закройте модель, не внося никаких изменений.
В этом случае вы научитесь моделировать длительность задачи, когда алгоритм задачи имеет неопределенное количество путей кода, но пути кода повторяются для данного набора данных.
В этом случае предположим, что вы разрабатываете сложное приложение, которое обрабатывает данные на однокристальной плате. Из-за сложности обработки алгоритм имеет неопределенное количество путей кода. В результате невозможно предсказать, какой путь кода будет взят. Однако известно, что распределение длительности задачи повторяется во многих экспериментах. Исходный код для такого алгоритма может иметь следующую форму.
int myTask(int arr[], int length) { int i = 0; int sum = 0; while (i < length) { if (arr[i] > 0) sum = sum + arr[i] i++; } }
1. Откройте модель.
2. Щелкните блок Диспетчер задач и выберите задачу myTask. Перейдите на вкладку Simulation. Заметим, что мы задаем распределение вероятностей как комбинацию двух нормальных распределений.
3. Щелкните Запуском, чтобы запустить симуляцию. Данные выполнения задачи будут передаваться в Data Inspector.
4. Выполните следующую команду, чтобы выполнить статистический анализ времен выполнения задачи, полученного в симуляции. Наблюдайте номер запуска Data Inspector. Измените команду, если номер запуска отличается.
socTaskTimes('soc_task_execution_step3', 'Run 4: soc_task_execution_step3_simprofile')
Заметьте, что распределение длительности задачи, полученное в симуляции, соответствует ожидаемым результатам.
5. Закройте эту модель, не внося никаких изменений.
Предположим, что вы разрабатываете комплексное приложение, которое добавляет еще одну задачу в модель, разработанную в предыдущем случае. Реализация этой задачи в настоящее время недоступна, но спецификация времени для этой задачи известна. Задача выполняется каждые 0,02 с с длительности, описанной нормальным распределением. Распределение имеет среднее значение 0,008 с и стандартное отклонение 0,0009 с.
1. Откройте модель.
2. Щелкните блок Task Manager и выберите proxyTask задачи. Перейдите на вкладку Simulation. Заметим, что мы задаем распределение вероятностей как нормальное распределение с параметрами, упомянутыми во введении этой задачи.
3. Внутри блока Model откройте блок Proxy Task и проверьте значение шага расчета. Значение шага расчета должно совпадать со значением периода, введенным в блоке Task Manager. Нажмите кнопку Отмена.
4. Щелкните Запуском, чтобы запустить симуляцию. Данные выполнения задачи будут передаваться в Data Inspector.
5. Выполните следующую команду, чтобы выполнить статистический анализ времен выполнения задачи, полученного в симуляции. Наблюдайте номер запуска Data Inspector. Измените команду, если номер запуска отличается.
socTaskTimes('soc_task_execution_step4', 'Run 5: soc_task_execution_step4_simprofile')
Заметьте, что продолжительность задачи, полученная в симуляции как для приложения, так и для прокси-задач.
6. Закройте эту модель, не внося никаких изменений.
В этом разделе вы сравните результаты синхронизации, полученные в предыдущей симуляции, с результатами синхронизации, полученными на вашей аппаратной плате.
Необходимые продукты:
Embedded Coder
Пакет поддержки SoC Blockset для устройств Xilinx, или
Пакет поддержки SoC Blockset для устройств Intel
1. На вкладке System on Chip нажмите Configure, Build & Deploy.
2. Следуйте рабочему процессу SoC Builder до тех пор, пока вы не попадете на экран Select Build Action.
3. Выберите Сборка и загрузка для режима external mode и продолжайте до завершения рабочего процесса.
4. Нажмите на Monitor & Tune, чтобы развернуть модель на оборудовании. Модель уже настроена на профилированное выполнение задачи, так как она запускается на оборудовании и передает данные профилирования в Data Inspector в реальном времени.
5. Выполните следующую команду, чтобы выполнить статистический анализ времен выполнения задачи, полученного на оборудовании. Наблюдайте номер запуска Data Inspector. Измените команду, если номер запуска отличается.
socTaskTimes('soc_task_execution_step4', 'Run 6: soc_task_execution_step4_procprofile')
Заметьте, что продолжительность задачи, полученная на оборудовании, соответствует результатам, полученным в симуляции.
6. Закройте эту модель, не внося никаких изменений.
В этом примере показано, как симулировать выполнение задачи в многозадачной операционной системе, как сгенерировать код и запустить его на оборудование плате и как собрать данные выполнения задачи в реальном времени.
В этом примере мы использовали простые приложения, каждый с одной задачей. Однако в типичном приложении необходимо выполнить несколько задач. Встраиваемые приложения должны запускать каждую задачу в соответствии с заданным расписанием. Чтобы наиболее эффективно использовать процессор и быстро реагировать на внешние события, используется основанный на приоритете алгоритм упреждающего планирования.
С упреждающим планированием на основе приоритета, когда задача получает упреждающее, происходит переключение задачи. Данные, используемые задачей (контекстом задачи), сохраняются таким образом, чтобы их можно было восстановить при возобновлении задачи. В этом примере время переключения задачи уменьшается на длительность задачи и не моделируется. В приложениях с гораздо более короткой длительностью задачи, возможно, потребуется их рассмотреть.
Если плата оборудования имеет несколько процессорных ядер, встраиваемые приложения обычно пытаетесь использовать все ядра для наиболее эффективной реализации. SoC Blockset использует основанный на приоритете алгоритм упреждающего планирования, даже когда процессор имеет несколько ядер. SoC Blockset чтит назначение задач на ядро как в симуляции, так и в сгенерированном коде.
Далее мы рекомендуем заполнить пример потоковой передачи данных с оборудования на программное обеспечение, который иллюстрирует систематический подход к разработке сложного приложения на основе однокристального программного обеспечения с использованием SoC Blockset.