Выполнение задачи

Этот пример показывает, как моделировать выполнение задачи и как сгенерировать код и запустить его на аппаратной плате 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

Введение

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 диалогового окна Диспетчера задач.

Обычно используемые опции:

  • Диалоговое окно - Позволяет вам задавать длительность задачи через нормальное распределение или комбинацию нескольких нормальных распределений, с помощью среднего значения и параметров стандартного отклонения.

  • Входной порт - Позволяет вам задавать длительность задачи на основе экземпляра. Например, можно создать модель, которая вычисляет длительность задачи, и соедините ее с входным портом Диспетчера задач.

Следующая блок-схема будет вести вас в выборе наиболее подходящего варианта.

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

Можно конфигурировать дополнительное моделирование и параметры выполнения для SoC Blockset в образцовом диалоговом окне настройки. Профилирование задачи, в симуляции и на процессоре, позволяет вам профилировать выполнение задачи, потоковые результаты Инспектору Данных моделирования и сохранять их в файл.

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

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

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

Случай 1 - симуляция алгоритма с одним путем выполнения кода

Этот случай требует, чтобы вы моделировали алгоритм ЦОС, который обрабатывает кадр данных. Следующий продукт требуется для этого:

  • DSP System Toolbox

Если вы не имеете этого продукта, переходите к следующему случаю после рассмотрения описания этого случая.

В этом случае вы изучите, как смоделировать длительность задачи, когда алгоритм задачи имеет один путь выполнения кода.

Примите, что для вас определяют задачу с разработкой приложения что процессы РФ (радиочастота) данные по плате SoC. Будучи предварительно обработанным в ядре FPGA, данные передаются потоком к ядру процессора с помощью протокола AXI4. Алгоритм, работающий на ядре процессора, должен определить, содержат ли данные высокочастотное или низкочастотный сигнал. С этой целью низкая передача и фильтр высоких частот применяются к данным. Получившиеся сигналы затем по сравнению с выбранным порогом. На основе этого описания эта задача имеет один путь выполнения кода без основных ответвлений кода. Исходный код для задачи функциональная сила имеет следующую форму.

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. От образцовой панели инструментов откройте Инспектора Данных моделирования и осмотрите dataReadTask. Увеличьте масштаб, чтобы осмотреть времена выполнения задачи более тесно.

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

  socTaskTimes('soc_task_execution', 'Run 1: soc_task_execution_simprofile')

Заметьте, что длительность задачи отличается. Как ожидалось гистограмма времен длительности задачи указывает, что алгоритм имеет один путь выполнения кода. Значения длительности кластеризируются вокруг среднего значения 0,0095 с.

8. Закройте модель, не внося изменений.

Случай 2 - симуляция алгоритма с двумя путями выполнения кода

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

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

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. От образцовой панели инструментов откройте Инспектора Данных моделирования и осмотрите VideoTask. Увеличьте масштаб, чтобы осмотреть времена выполнения задачи более тесно.

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

  socTaskTimes('soc_task_execution_step2', 'Run 3: soc_task_execution_step2_simprofile')

Заметьте, что длительность задачи отличается. Как ожидалось гистограмма времен длительности задачи указывает, что алгоритм имеет два пути выполнения кода.

8. Закройте модель, не внося изменений.

Случай 3 - симуляция алгоритма с неопределенным количеством путей выполнения кода

Этот случай требует, чтобы вы сгенерировали и запустили код по аппаратной плате. Следующие продукты требуются для этого:

  • Embedded Coder

  • Пакет поддержки SoC Blockset для устройств Xilinx, или

  • Пакет поддержки SoC Blockset для устройств Intel

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

В этом случае примите, что вы разрабатываете сложное приложение, которое обрабатывает данные на плате 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. Модель установлена для платы Xilinx Zynq ZC706 оценочного комплекта. Чтобы использовать различную плату, перейдите к диалоговому окну модели Configuration Parameters и выберите одну из поддерживаемых плат, перечисленных на странице Hardware Implementation. Сделайте то же самое для топ-модели и модели, на которую ссылаются.

3. Кликните по блоку Task Manager и выберите задачу myTask. Кликните по вкладке Simulation. Заметьте, что мы задаем распределение вероятностей как комбинацию двух нормальных распределений.

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

5. Затем, на образцовой панели инструментов изменяют режим симуляции на Внешний. Модель уже собирается профилировать выполнение задачи, когда это работает на оборудовании.

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

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

  socTaskTimes('soc_task_execution_step3', 'Run 4: soc_task_execution_step3_simprofile')
  socTaskTimes('soc_task_execution_step3', 'Run 5: soc_task_execution_step3_procprofile')

Заметьте, что длительность задачи, полученная в симуляции, совпадает с результатами, полученными на оборудовании.

8. Закройте эту модель, не внося изменений.

Сводные данные

Этот пример показал вам, как моделировать выполнение задачи в многозадачной операционной системе, как сгенерировать код и запустить его на аппаратной плате, и как собрать данные о выполнении задачи в реальном времени.

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

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

Если аппаратная плата имеет несколько ядер процессора, встраиваемые приложения обычно пытаются использовать все ядра для наиболее эффективного внедрения. SoC Blockset использует основанный на приоритете приоритетный алгоритм планирования, даже когда процессор имеет несколько ядер. SoC Blockset соблюдает присвоение задач на ядро и в симуляции и в сгенерированном коде.

Затем, мы рекомендуем завершить Данные о Потоковой передаче от Оборудования до примера программного обеспечения, который иллюстрирует систематический подход к разработке комплексного приложения SoC с помощью SoC Blockset.