exponenta event banner

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

В этом примере показано, как моделировать выполнение задачи и как генерировать код и запускать его на аппаратной плате 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. Для использования другой платы аппаратных средств выберите одну из плат аппаратных средств, перечисленных в списке Hardware Board на вкладке System on Chip. Выполните то же самое для модели верхнего уровня и ссылочной модели.

Введение

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

Следующая диаграмма иллюстрирует вышеупомянутые аспекты моделирования выполнения задачи. В первых двух подзаголовках можно наблюдать, что Task1 выполняется каждые 0,1 с, и, поскольку они оба совместно используют Core 0, Task1 preempts Task2, что выполняется каждые 0,2 с. В третьем подзаголовке можно заметить, что Core 0 по-прежнему имеет некоторое время простоя. Последние два вложенных графика показывают Task3, выполняющиеся каждые 0,3 с на ядре 1.

Дополнительные сведения о моделировании выполнения задач см. в разделе Что такое выполнение задач?

Блок Диспетчер задач (Task Manager) позволяет настроить выполнение задач в модели. В диалоговом окне блока можно определить необходимое количество задач в системе с помощью кнопок «Добавить» и «Удалить». На вкладке «Главная» диалогового окна задаются основные свойства задачи, а на вкладке «Моделирование» - свойства задачи моделирования.

На следующем рисунке показана вкладка «Главная» блока «Диспетчер задач».

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

Задача может быть двух типов. Управляемая событиями задача выполняется при запуске событием. Строка события из блока источника данных ввода-вывода, подключенного к блоку диспетчера задач, запускает задачу. Задача, управляемая таймером, выполняется с определенным периодом, определенным на вкладке «Главная» диспетчера задач.

Приоритет задач, управляемых событиями, определяется на вкладке «Главная» Диспетчера задач. Приоритет задачи, управляемой таймером, назначается автоматически.

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

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

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

SoC Blockset имеет несколько вариантов настройки длительности задачи. Поскольку продолжительность задания применяется только к моделированию, эти варианты выбора находятся на вкладке Моделирование (Simulation) диалогового окна Диспетчер задач (Task Manager).

На следующем рисунке показана вкладка «Моделирование» диалогового окна «Диспетчер задач».

Наиболее часто используемые опции:

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

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

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

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

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

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

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

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

Моделирование алгоритма с одиночным кодовым путем

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

  • Инструментарий системы DSP

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

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

Предположим, что перед вами поставлена задача разработать приложение, обрабатывающее радиочастотные данные на плате 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. Откройте модель. Обратите внимание на подсистему тестовых данных. Блок RF Data Source в подсистеме представляет внешнюю память и ядро FPGA. Блок RF Data Source имеет два выходных порта: Stream Data и event. Они выводят радиочастотные данные и уведомление, когда новый кадр данных доступен, соответственно.

2. Следует отметить, что блок источника РЧ-данных генерирует кадры по 1000 выборок каждые 0,01. Кадры являются выборками синусоидальной формы сигнала 1 кГц.

3. Щелкните блок «Диспетчер задач». Обратите внимание на то, что он устанавливает данные задачи, управляемые событиями ReadTask. Задача запускается при поступлении нового кадра данных.

4. Перейдите на вкладку Моделирование (Simulation) в диалоговом окне Диспетчер задач (Task Manager), чтобы определить продолжительность задачи для моделирования.

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

На основе информации, предоставленной разработчиком алгоритма, определяется, что среднее время выполнения составляет 0,0095 с, а стандартное отклонение - 0,0001 с. Для представления пределов реального времени также принимается решение установить минимальное и максимальное время выполнения на 0,00925 с и 0,00975 с соответственно.

Задайте параметры длительности в диалоговом окне «Диспетчер задач» на вкладке «Моделирование», как описано выше.

5. В модели щелкните Выполнить (Run), чтобы начать моделирование. Дождитесь завершения моделирования.

6. На панели инструментов модели откройте инспектор данных и проверьте dataReadTask. Увеличьте изображение, чтобы более тщательно проверить время выполнения задачи.

7. Выполните следующую команду для выполнения статистического анализа времени выполнения задачи. Обратите внимание на номера запуска инспектора данных. Измените команду, если номера выполнения отличаются.

  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. Щелкните блок «Диспетчер задач». Обратите внимание, что он устанавливает управляемую таймером задачу VideyTask. Эта задача выполняется каждые 0,33333 с, что является частотой видеокадров.

4. Перейдите на вкладку Моделирование (Simulation) в диалоговом окне Диспетчер задач (Task Manager), чтобы определить продолжительность задачи для моделирования.

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

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

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

5. В модели щелкните Выполнить (Run), чтобы начать моделирование. Дождитесь завершения моделирования.

6. На панели инструментов модели откройте инспектор данных и проверьте VideyTask. Увеличьте изображение, чтобы более тщательно проверить время выполнения задачи.

7. Выполните следующую команду для выполнения статистического анализа времени выполнения задачи. Обратите внимание на номера запуска инспектора данных. Измените команду, если номера выполнения отличаются.

  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. Щелкните блок Диспетчер задач и выберите задачу myTask. Перейдите на вкладку Моделирование (Simulation). Обратите внимание, что мы определяем распределение вероятностей как комбинацию двух нормальных распределений.

3. Нажмите кнопку Выполнить (Run), чтобы начать моделирование. Данные выполнения задачи будут переданы в потоковом режиме инспектору данных.

4. Выполните следующую команду для выполнения статистического анализа времени выполнения задачи, полученного при моделировании. Обратите внимание на номер запуска инспектора данных. Измените команду, если номер выполнения отличается.

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

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

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

Моделирование приложения с помощью задач прокси

Предположим, что вы разрабатываете сложное приложение, которое добавляет еще одну задачу в модель, разработанную в предыдущем случае. Реализация этой задачи в настоящее время недоступна, но спецификация синхронизации для этой задачи известна. Задача выполняется каждые 0,02 с с длительностью, описанной нормальным распределением. Распределение имеет среднее значение 0,008 с и стандартное отклонение 0,0009 с.

1. Откройте модель.

2. Щелкните блок Диспетчер задач и выберите задачу proxyTask. Перейдите на вкладку Моделирование (Simulation). Обратите внимание, что мы определяем распределение вероятностей как нормальное распределение с параметрами, упомянутыми во введении этой задачи.

3. Внутри блока Модель (Model) откройте блок Задача прокси (Proxy Task) и проверьте значение времени выборки. Значение времени выборки должно соответствовать значению периода, введенному в блоке диспетчера задач. Нажмите кнопку Отмена.

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

5. Выполните следующую команду для выполнения статистического анализа времени выполнения задачи, полученного при моделировании. Обратите внимание на номер запуска инспектора данных. Измените команду, если номер выполнения отличается.

  socTaskTimes('soc_task_execution_step4', 'Run 5: soc_task_execution_step4_simprofile')

Обратите внимание, что продолжительность задачи, полученная при моделировании как для задач приложения, так и для задач прокси.

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

Сравнение результатов моделирования с результатами на оборудовании

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

Требуемые продукты:

  • Встроенный кодер

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

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

1. На вкладке Система на кристалле щелкните Настроить, Построить и развернуть.

2. Следите за рабочим процессом SoC Builder, пока не перейдете на экран Select Build Action.

3. Выберите Компоновать и загрузить для внешнего режима и продолжайте до завершения рабочего процесса.

4. Нажмите Monitor & Tune, чтобы развернуть модель на оборудовании. Модель уже настроена на выполнение задачи профилирования, поскольку она выполняется на оборудовании и передает данные профилирования в Data Inspector в режиме реального времени.

5. Выполните следующую команду для выполнения статистического анализа времени выполнения задачи, полученного на оборудовании. Обратите внимание на номер запуска инспектора данных. Измените команду, если номер выполнения отличается.

  socTaskTimes('soc_task_execution_step4', 'Run 6: soc_task_execution_step4_procprofile')

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

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

Резюме

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

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

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

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

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