В этом примере показано, как симулировать выполнение задачи и как сгенерировать код и запустить его на аппаратной плате SoC.
Разработка приложений часто включает симуляцию алгоритма, чтобы гарантировать правильное поведение. Такие симуляции обычно игнорируют аспекты в реальном времени среды встраиваемой системы. Это может позволить определенным проблемам синхронизации остаться неоткрытым до выполнения приложения на оборудовании.
Проблемы синхронизации часто приводят к неправильному поведению приложения. SoC Blockset помогает вам обнаружить эти проблемы в симуляции, а не на оборудовании. Это может помочь вам избежать дорогостоящей отладки на оборудовании.
Синхронизирующие проблемы, более вероятно, произойдут, когда приложения становятся более комплексными. Например, переполнения уровня и нежелательное вытеснение уровня являются более частыми в приложениях с несколькими задачами из-за зависимостей от задачи и ограничений ресурсов. Симуляция многозадачных приложений с SoC Blockset поможет вам в обнаружении этих проблем рано.
В этом примере выполнение задачи симулировано с помощью SoC Blockset. Вы узнаете о различных методах для симуляции длительности задачи и когда использовать их. Вы также изучите, как проверить технические требования синхронизации на оборудовании.
Поддерживаемые аппаратные платформы:
Оценочный комплект Xilinx® Zynq® ZC706
Xilinx Zynq UltraScale™ + оценочный комплект MPSoC ZCU102
Макетная плата ZedBoard™ Zynq-7000
Комплект разработчика Altera® Cyclone® V SoC
Altera комплект разработчика Arria® 10 SoC
Модели, используемые в этом примере, установлены для платы Xilinx Zynq ZC706 оценочного комплекта. Чтобы использовать различную аппаратную плату, выберите одну из аппаратных плат, перечисленных в Аппаратном Совете на вкладке System on Chip. Сделайте то же самое для топ-модели и модели, на которую ссылаются.
SoC Blockset симулирует выполнение программных задач, когда они выполнились бы на процессоре SoC. Симуляция соблюдает параметры задачи, такие как период, приоритет и ядро процессора. SoC Blockset симулирует вытеснение задачи, переполнения задачи и параллельное выполнение задачи.
Следующая схема иллюстрирует вышеупомянутые аспекты симуляции выполнения задачи. В первых двух подграфиках можно заметить, что Task1 выполняет каждые 0,1 с и, поскольку они оба, Ядро доли 0, Task1 вытесняет Task2, который выполняет каждые 0,2 с. В третьем подграфике можно заметить, что Базовый 0 все еще имеет некоторое время простоя. Последние два подграфика показывают Task3, запускающий каждые 0,3 с на Базовом 1.
Чтобы узнать больше о симуляции выполнения задачи, смотрите то, Что Выполнение Задачи?
Блок Task Manager позволяет вам конфигурировать выполнение задач в вашей модели. В диалоговом окне блока вы задаете, в каком количестве задач вы нуждаетесь в своей системе с помощью кнопок Add и Delete. На вкладке Main диалогового окна вы устанавливаете основные свойства задачи, в то время как на вкладке Simulation вы устанавливаете свойства задачи симуляции.
Следующая фигура иллюстрирует вкладку Main блока Task Manager.
Задача имеет имя так, чтобы она могла быть идентифицирована в модели и различных связанных графиках. Метки порта на блоке Task Manager используют имена задач в легкой идентификации.
Задача может иметь два типа. Событийно-управляемая задача выполняется, когда инициировано событием. Линия события от блока источника данных IO, соединенного с блоком Task Manager, инициировала задачу. Управляемая таймером задача выполняется с заданным периодом, как задано во вкладке Main Диспетчера задач.
Вы задаете приоритет событийно-управляемых задач во вкладке Main Диспетчера задач. Управляемый таймером приоритет задач присвоен автоматически.
В диалоговом окне Диспетчера задач можно также установить ядро процессора, на котором можно выполнить задачу так, чтобы, если аппаратная плата имеет несколько ядер, можно было поставить задачи, чтобы выполниться одновременно.
Блок Task Manager также позволяет вам конфигурировать, как обработаны переполнения задачи. Например, можно решить пропустить экземпляр задачи, если предыдущий экземпляр задачи не запустился или завершился. Или, можно решить попытаться догнать расписание задачи несмотря на переполнения.
Чтобы симулировать эффекты задачи в реальном времени, такие как вытеснение и переполнения, SoC Blockset требует, чтобы вы обеспечили длительность каждой задачи. Длительность задана, когда время, истекшее между задачей, запускается и конец задачи. Идеально, вы измерите длительность задачи на своей аппаратной плате. Если это не возможно, ищите длительность задачи в таблицах данных, предоставленных разработчиками алгоритма задачи. Как последнее прибежище необходимо установить длительность относительно периода задачи или самого короткого интервала повторения для апериодических задач.
SoC Blockset имеет несколько вариантов для установки длительности задачи. Когда длительность задачи применяется только к симуляции, этот выбор найден во вкладке Simulation диалогового окна Диспетчера задач.
Следующая фигура иллюстрирует вкладку Simulation диалогового окна Диспетчера задач.
Обычно используемые опции:
Диалоговое окно - Позволяет вам задавать длительность задачи через нормальное распределение или комбинацию нескольких нормальных распределений, с помощью среднего значения и параметров стандартного отклонения.
Input port - Позволяет вам задавать длительность задачи на основе экземпляра. Например, можно создать модель, которая вычисляет длительность задачи, и соедините ее с входным портом Диспетчера задач.
Следующая блок-схема будет вести вас в выбирании наиболее подходящей опции.
Если времена длительности для вашей задачи имеют различные распределения и причины, выберите самые подходящие опции с помощью блок-схемы в качестве общего руководства.
Можно конфигурировать дополнительное моделирование и параметры выполнения для SoC Blockset в диалоговом окне настройки модели. Профилирование задачи, в симуляции и на процессоре, позволяет вам профилировать выполнение задачи, потоковые результаты к Data Inspector и сохранять их в файл.
Можно также установить значение задержки ядра, чтобы влиять на выполнение задачи в симуляции. Это значение варьируется много, но обычно намного меньше, чем длительность задачи. Поэтому мы рекомендуем, чтобы вы оставили набор значений 0 с, если вы не можете детерминировано найти соответствующее значение для своей аппаратной платы.
Следующий рисунок показывает параметры SoC, связанные с выполнением задачи в диалоговом окне параметров конфигурации модели. Обратите внимание на то, что профилирование Задачи на телевикторинах процессора, только если вы устанавливаете все необходимые продукты и пакеты аппаратной поддержки.
Остающиеся шаги этого примера проиллюстрируют некоторые варианты, показавшие в вышеупомянутой блок-схеме.
Этот случай требует, чтобы вы симулировали алгоритм ЦОС, который обрабатывает кадр данных. Следующий продукт требуется для этого:
DSP System Toolbox
Если вы не имеете этого продукта, переходите к следующему случаю после рассмотрения описания этого случая.
В этом случае вы изучите, как смоделировать длительность задачи, когда алгоритм задачи имеет один путь выполнения кода.
Примите, что для вас определяют задачу с разработкой приложения что процессы РФ (радиочастота) данные по плате SoC. Будучи предварительно обработанным в ядре 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. Откройте модель. Отметьте подсистему Тестовых данных. Блок Data Source РФ в подсистеме представляет внешнюю память и ядро FPGA. Блок Data Source РФ имеет два выходных порта, Потоковые Данные и событие. Они выводят данные РФ и уведомление, когда новая система координат данных доступна, соответственно.
2. Обратите внимание на то, что блок Data Source РФ генерирует системы координат 1 000 выборок каждые 0,01 с. Системы координат являются выборками формы волны синуса на 1 кГц.
3. Кликните по блоку Task Manager. Заметьте, что это поставило событийно-управляемую задачу dataReadTask. Задача инициирована прибытием новой системы координат данных.
4. Кликните по вкладке Simulation в диалоговом окне Диспетчера задач, чтобы задать длительность задачи для симуляции.
Поскольку алгоритм состоит из двух фильтров, выполняющихся без условий, приложение имеет один путь выполнения кода. Поэтому вы следуете за первой левой ветвью в блок-схеме, показанной во введении, и вы ожидаете, что времена выполнения алгоритма имеют нормальное распределение.
На основе информации, данной разработчиком алгоритма, вы решаете, что среднее время выполнения составляет 0,0095 с и что стандартное отклонение составляет 0,0001 с. Чтобы представлять пределы в реальном времени, вы также решаете установить min и макс. времена выполнения к 0,00925 с и 0,00975 с, соответственно.
Установите параметры длительности в диалоговом окне Диспетчера задач во вкладке Simulation, аналогичной описанному выше.
5. В модели нажмите Run, чтобы запустить симуляцию. Ожидайте, пока симуляция не завершается.
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. Откройте модель. Отметьте блок Data Source, который выводит системы координат видеоданных.
2. Кликните по блоку Model и заметьте, что алгоритм вычисляет энергию движения между последовательными системами координат данных. Если расчетная энергия движения превышает порог, Основной Алгоритм выполняется.
3. Кликните по блоку Task Manager. Заметьте, что это поставило управляемую таймером задачу VideoTask. Эта задача запускает каждые 0,33333 с, который является частотой видеокадров.
4. Кликните по вкладке Simulation в диалоговом окне Диспетчера задач, чтобы задать длительность задачи для симуляции.
Поскольку алгоритм имеет два пути выполнения кода, и он может быть предсказан, какой путь выполнения кода будет взят, следовать за второй левой ветвью в блок-схеме.
Длительность задачи модели, чтобы зависеть от энергии движения. В зависимости от того, превышен ли энергетический порог движения или нет, вы присвоите длительность задачи со средним значением 75% или 50% частоты кадров, соответственно.
Кликните по подсистеме Оценки Длительности Задачи, чтобы изучить, как смоделировать длительность задачи.
5. В модели нажмите Run, чтобы запустить симуляцию. Ожидайте, пока симуляция не завершается.
6. Из панели инструментов модели откройте Data Inspector и смотрите VideoTask. Увеличьте масштаб, чтобы смотреть времена выполнения задачи более тесно.
7. Запустите следующую команду, чтобы выполнить статистический анализ времен выполнения задачи. Наблюдайте числа запуска Data Inspector. Измените команду, если ваши числа запуска отличаются.
socTaskTimes('soc_task_execution_step2', 'Run 3: soc_task_execution_step2_simprofile')
Заметьте, что длительность задачи варьируется. Как ожидалось гистограмма времен длительности задачи указывает, что алгоритм имеет два пути выполнения кода.
8. Закройте модель, не внося изменений.
В этом случае вы изучите, как смоделировать длительность задачи, когда алгоритм задачи имеет неопределенное количество путей выполнения кода, но пути выполнения кода повторяемы для данного набора данных.
В этом случае примите, что вы разрабатываете сложное приложение, которое обрабатывает данные на плате SoC. Из-за сложности обработки, алгоритм имеет неопределенное количество путей выполнения кода. В результате не возможно предсказать, какой путь выполнения кода будет взят. Однако известно, что распределение длительности задачи повторяемо в нескольких экспериментах. Исходный код для такого алгоритма может иметь следующую форму.
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. Кликните по блоку Task Manager и выберите задачу myTask. Кликните по вкладке Simulation. Заметьте, что мы задаем вероятностное распределение как комбинацию двух нормальных распределений.
3. Нажмите Run, чтобы запустить симуляцию. Данные о выполнении задачи будут переданы потоком к 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. Нажмите Cancel.
4. Нажмите Run, чтобы запустить симуляцию. Данные о выполнении задачи будут переданы потоком к 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 рабочий процесс, пока вы не доберетесь до экрана Select Build Action.
3. Выберите Build и загрузку для режима 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 с помощью SoC Blockset.