VisualDSP: конфигурирование проекта для использования VDK |
![]() |
Добавил(а) microsin | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Интегрированная среда разработки VisualDSP++ (IDDE) была расширена для поддержки управления всеми компонентами VDK. Вы начинаете разрабатывать VDK-приложение путем создания набора файлов исходного кода. IDDE автоматически генерирует исходный код для каждого запрашиваемого пользователем объекта VDK. Например, когда Вы запрашиваете создание нового типа для потока правым кликом на иконке Thread Type (закладка Kernel в окне дерева проекта Project, см. рис. 3-5), и вводите имя для нового типа потока, среда сгенерирует исходный файл и заголовочный файл с таким же именем. Автоматически сгенерированные файлы содержат все функции, требуемые для типа потока VDK (VDK Thread Type). Файл настроек линкера (Linker Description File). Когда новый проект использует многопоточное ядро (VDK), он обращается к относящемуся к VDK файлу настроек линкера с установками по умолчанию (default Linker Description File) с расширением .LDF, этот файл будет добавлен в проект. LDF-файл находится в каталоге установки VisualDSP++, который относится к используемому Вами процессору. Хотя файл LDF может остаться не измененным для многих проектов, Вы можете сделать копию LDF из каталога установки VisualDSP++ в директорию Вашего проекта, добавить его в проект, и изменить его настройки, чтобы они подходили к Вашей индивидуальной конфигурации аппаратуры. Потокобезопасные библиотеки (Thread Safe Libraries). Так же, как и пользовательские потоки, которые должны быть реентерабельными, для использования VDK должны быть подключены специальные "thread safe" версии стандартных библиотек C и C++. Файл default.LDF в проектах VDK будет линковать проект с этими библиотеками. Если Вы изменили свой файл LDF, то убедитесь, что в нем используются thread-safe библиотеки. LDF Вашего проекта находится в папке Linker Files дерева проекта, доступного в окне Project среды VisualDSP++ (см. рис. 3-4). Из Википедии: Компьютерная программа в целом или её отдельная процедура называется реентерабельной (от англ. reentrant — повторно входимый), если она разработана таким образом, что одна и та же копия инструкций программы в памяти может быть совместно использована несколькими пользователями или процессами. При этом второй пользователь может вызвать реентерабельный код до того, как с ним завершит работу первый пользователь и это как минимум не должно привести к ошибке, а при корректной реализации не должно вызвать потери вычислений (то есть не должно появиться необходимости выполнять уже выполненные фрагменты кода). Реентерабельность тесно связана с безопасностью функции в многопоточной среде (thread-safety), тем не менее, это разные понятия (в практическом программировании под современные ОС термин «реентерабельный» на деле равносилен термину «thread-safe»). Обеспечение реентерабельности является ключевым моментом при программировании многозадачных систем, в частности, операционных систем. Для обеспечения реентерабельности необходимо выполнение нескольких условий: • никакая часть вызываемого кода не должна модифицироваться; В общем случае, для обеспечения реентерабельности необходимо, чтобы вызывающий процесс или функция каждый раз передавал вызываемому процессу все необходимые данные. Таким образом, функция, которая зависит только от своих параметров, не использует глобальные и статические переменные и вызывает только реентерабельные функции, будет реентерабельной. Если функция использует глобальные или статические переменные, необходимо обеспечить, чтобы каждый пользователь хранил свою локальную копию этих переменных. Заголовочные файлы для VDK API. Когда проект VDK создается в среде разработки VisualDSP++, то одним из автоматически генерируемых файлов в директории проекта будет файл vdk.h. Этот заголовочный файл содержит перечисления для каждого определенного пользователем объекта в среде разработки и все декларации VDK API. Ваши файлы исходного кода должны подключать (директивой #include) файл vdk.h, чтобы получить доступ к любым службам многопоточного ядра (VDK). Разработка приложения VDK. Разработка всех программ на основе VDK в среде VisualDSP++ состоит из следующих шагов: • Шаг 1: создание нового проекта VDK Примечание: объяснение всех этих непонятных терминов можно найти в статье "Обзор VisualDSP++ Kernel RTOS (VDK)" [2]. С выполнением этих шагов создание Ваших проектов будет целостным и аккуратным, с минимальными затратами на разработку. Это снижает время разработки и позволяет Вам сосредоточиться на реализации алгоритма приложения. [Шаг1: создание нового проекта VDK] 1. Выберите в меню Project -> New..., среда VisualDSP++ откроет окно диалога Save New Project, предлагая сохранить новый проект. 2. Заполните поле для имени нового проекта (File name:), выберите каталог для сохранения (Save in:) и кликните OK для сохранения файла проекта. Поддержка VDK не может быть добавлена в существующие проекты. 3. В меню Project выберите Project Options..., VisualDSP++ откроет окно диалога опций проекта Project Options, предлагая настроить проект (рис. 3-2). 4. Установите тип целевого процессора (Target -> Processor). Этот диалог позволяет установить тот тип процессора, для которого установлена поддержка VDK. В этом примере используется целевой процессор ADSP-BF538. Кликните OK, чтобы применить настройки. Рис. 3-2. Окно диалога Project Options. 5. Среда VisualDSP++ автоматически создаст исходные файлы VDK по умолчанию vdk.cpp и vdk.h, и добавит их в проект. Третий файл, с именем < projectname >.vdk, будет добавлен в проект чтобы разрешить поддержку VDK со стороны среды разработки. Файлы vdk.h и vdk.cpp не должны быть изменены вручную, перезаписаны, или удалены из проекта. Все их изменения делает среда разработки VisualDSP++, когда Вы редактируете составляющие проекта VDK на закладке Kernel окна Project. 6. Также среда разработки автоматически создаст и добавит в проект файл настроек линкера. Это файл с именем < projectname >.ldf, который появится в корневом каталоге проекта, и он также будет виден в папке Linker Files дерева файлов проекта на закладке Project. В старых версиях VisualDSP++ может понадобится добавить файл LDF вручную для выбранного целевого процессора. На рис. 3-4 показаны добавленные файлы после создания нового проекта. Рис. 3-4. Окно Project дерева файлов проекта, закладка Project. 7. В нижней части окна Project рядом с закладкой Project есть закладка Kernel. Кликните на ней, чтобы увидеть окно Kernel (рис. 3-5). На закладке Kernel можно добавлять, изменять и удалять компоненты многопоточного ядра (VDK) в разделах System, Threads (в старых версиях VisualDSP++ этот раздел назывался Thread Types), Boot Threads, Round-Robin Properties, Semaphores, Event Bits, Events, Interrupts, Device Flags и Device Drivers. Среда автоматически обновит файлы vdk.cpp и vdk.h, чтобы отразить изменения, сделанные в этом окне. [Шаг 2: модификация системных параметров (VDK System Parameters)] Разверните дерево настроек на иконке System закладки Kernel (рис. 3-5) кликом на плюсике. Рис. 3-5. Развернутые параметры System. У компонента System имеются следующие свойства: Таблица 3-1. Свойства System.
Примечание: приведенные значения по умолчанию даны для процессора Blackfin ADSP-BF538. Для дополнительной информации по циклическому планированию выполнения потоков см. описание "Round-Robin Scheduling" документации VDK [2]. Про буфер истории см. описание "State History Window" в статье [3]. [Шаг 3: добавление и редактирования типа потока (Thread Type)] 1. Сделайте правый клик на разделе Thread Types, чтобы отобразить контекстное меню, и затем выберите в нем New Thread Type (рис. 3-6). Рис. 3-6. Контекстное меню Thread Types. Подробнее про типы потоков см. раздел "Типы потоков" (Thread Types) в статье [2]. 2. Откроется диалог для создания нового типа потока (New Thread Type, см. рис. 3-7). Заполните поля Name: (имя потока, которое должно быть допустимым идентификатором для языка C, т. е. в нем не должно быть специальных символов наподобие пробелов и дефисов), Source File: (здесь указывается имя для исходного кода модуля класса потока) и Header File: (здесь указывается имя файла заголовка для типа класса потока). Рис. 3-7. Диалог создания нового типа потока. 3. В диалоге есть 2 радиокнопки Yes и No, относящиеся к автоматической генерации шаблонов исходного кода для создаваемого типа потока. Кликните Yes, чтобы автоматически сгенерировать файлы исходного кода для созданного типа потока. Файлы будут сгенерированы на том языке, который был выбран в выпадающем списке Language: диалога (см. рис. 3-7). Вы можете выбрать один из вариантов C++, C и Assembly. Если Вы хотите использовать существующий исходный код, кликните No. Затем вручную добавьте исходные файлы в проект. Имейте в виду, что имя типа потока и имена файлов должны соответствовать друг другу (должны совпадать имена файлов до расширения). 4. Кликните OK, чтобы создать новый тип потока. Если Вы выбрали генерировать исходный код, то файлы исходного кода для нового типа потока будут созданы и автоматически добавлены в проект. Если Вы задали имена для автоматически генерируемых исходных файлов такими, которые уже есть в директории Вашего проекта, то существующие файлы будут перезаписаны. Раскройте дерево на иконке Thread Types (рис. 3-8), и дерево настроек созданного потока. Вы можете отредактировать свойства у каждого типа потока левым кликом на значение свойства. Рис. 3-8. Раскрытый список параметров типа потока. У компонента типа потока есть следующие свойства: Таблица 3-2. Свойства типа потока.
1. Сделайте правый клик на имени типа потока, который хотите удалить, и выберите Delete в контекстном меню. Альтернативно можно выбрать тип потока левым кликом и нажать кнопку Delete. 2. Среда запросит подтверждения для удаления из проекта файлов исходного кода и заголовка для этого типа потока. Кликните Yes чтобы удалить, или No чтобы оставить файлы в проекте. Имейте в виду, что файлы не будут физически удалены из диска, они будут удалены только из окна Project. Когда Вы удалили тип потока из проекта, потребуется вручную удалить из исходного кода все ссылки на удаленный тип. [Шаг 4: добавление и редактирование потока загрузки (Boot Thread)] Примечание: поток загрузки (Boot Thread) это такой поток, который библиотека VDK создаст и запустит автоматически при старте приложения VDK (подробнее про типы потоков см. [2]). Создавая новый Boot Thread, Вы задаете для библиотеки VDK создать и запустить экземпляр имеющегося типа потока (тип потока был создан на Шаге 3). 1. Выполните правый клик на иконку Boot Threads, и выберите из контекстного меню пункт New Boot Thread (рис. 3-9). Будет создан новый поток загрузки (Boot Thread). Рис. 3-9. Контекстное меню Boot Threads. 2. Введите имя для нового Boot Thread и нажмите Enter. Левым кликом на плюсике раскройте список свойств Boot Thread. В настоящий момент у потока загрузки для редактирования доступно 2 свойства: Thread Type и Initializer (см. рис. 3-10). Рис. 3-10. Раскрытый список параметров Boot Thread. У потока загрузки 2 свойства - тип потока и инициализатор.
Может быть создано несколько потоков загрузки одинакового типа. Подробнее про потоки загрузки см. [2]. 1. Выполните правый клик на имя Boot Thread, и выберите из контекстного меню пункт Rename. 2. Нажмите Enter чтобы принять изменение имени, ESC для отмены изменения. Выполните правый клик на имя Boot Thread, и выберите из контекстного меню пункт Delete. Альтернативно выберите Boot Thread и нажмите клавишу Delete. После того, как Boot Thread удален из проекта, Вы должны вручную в исходном коде удалить все ссылки на этот удаленный Boot Thread. Можно задать очередность запуска конструкторов потоков загрузки. Это делается перетаскиванием имен потока вверх или вниз по списку Boot Threads. Левым кликом выберите и удерживайте имя потока загрузки, и перетащите его на нужную позицию в списке. Чем выше поток находится в списке, тем раньше он запустится. Отпустите имя потока в том месте списка, где нужно (см. рис. 3-11). Рис. 3-11. Перетаскивание объектов потоков загрузки в пределах списка. В приведенном на рисунке примере поток загрузки main был перетащен на самую верхнюю позицию, перед потоком загрузки BT. Это задаст очередность запуска конструкторов потока - поток main будет создан раньше потоков BT и ST. Однако порядок запуска потоков на выполнение задается по-другому, это зависит от приоритета, который присвоен типу потока загрузки. Порядок, в котором будут запущены потоки на выполнение во время старта приложения VDK, определяется приоритетами потоков. Приоритеты можно назначить либо программно в коде после старта приложения (run-time), либо это можно сделать уже на стадии компиляции (compile time), если присвоить потокам загрузки разные типы, у которых заданы разные приоритеты (см. свойство Priority типа потока во врезке "Просмотр и изменение свойств типа потока"). Подробнее про типы потоков и приоритеты см. [2]. [Шаг 5: добавление и редактирование циклического приоритета (Round-Robin Priority)] 1. Сделайте правый клик на иконку Round-Robin Priorities для отображения контекстного меню, и затем выберите в меню New Priority (рис. 3-12). Будет создан новый приоритет Round-Robin. Рис. 3-12. Контекстное меню Round-Robin Priority. Подробнее про планирование выполнения потоков по циклическому приоритету (Round-Robin) см. [2]. 2. Из выпадающего списка выберите приоритет, который Вы хотите задать (см. рис 3-13). Рис. 3-13. Выбор приоритета Round-Robin. Разверните список свойств приоритета Round-Robin. Вы можете отредактировать свойство Period левым кликом на его значение (см. рис. 3-14). Рис. 3-14. Свойства приоритета Round-Robin. Period задается в тиках системы (подробнее см. [2]), должно быть задано значение, не равное 0 (по умолчанию 10). Чтобы удалить приоритет Round-Robin из проекта, выполните на нем правый клик и выберите Delete из контекстного меню. Альтернативно выберите приоритет, и нажмите клавишу Delete. [Шаг 6: добавление и редактирование семафора (Semaphore)] 1. Выполните правый клик на раздел Semaphores и выберите в контекстном меню New Semaphore (см. рис. 3-15). Будет создан новый семафор. Рис. 3-15. Контекстное меню Semaphores. 2. Введите имя для нового семафора и нажмите Enter. Имя семафора должно быть допустимым для идентификаторов языка C. Подробнее про семафоры см. [2, 5]. Разверните список свойств семафора левым кликом на плюсике. Можно выбрать свойство и изменить его значение левым кликом на свойстве (рис. 3-16). Рис. 3-16. Список свойств семафора. У семафора есть следующие свойства: Таблица 3-4. Свойства семафора.
Семафоры можно переименовывать и удалять с помощью выбора в контекстном меню (правый клик на семафоре, пункты меню Rename и Delete). После того, как Вы переименовали семафор, необходимо вручную поменять в исходном коде все имена, ссылающиеся на него. Аналогично, если Вы удалили семафор, то также необходимо вручную удалить в исходном коде все ссылки на этот семафор. Подробнее про семафоры VDK можно почитать в статье [2]. [Шаг 7: добавление и редактирование бита события (Event Bit)] 1. Выполните правый клик на иконку Event Bits, и выберите в контекстном меню New Event Bit (см. рис. 3-17). Рис. 3-17. Контекстное меню Event Bits. 2. Введите имя для нового Event Bit и нажмите Enter. Имя должно быть допустимым идентификатором для языка C. Подробнее про биты событий см. [2, 5]. Вы можете поменять свойства Event Bit. Для этого раскройте список параметров Event Bit левым кликом на плюсике (см. рис. 3-18). Рис. 3-18. Развернутый список свойств Event Bit. У бита события есть свойство Initial Value, отражающее его начальное значение в момент загрузки системы VDK (по умолчанию 0). Биты события можно переименовывать и удалять с помощью выбора в контекстном меню (правый клик, пункты меню Rename и Delete). После того, как Вы переименовали бит события, необходимо вручную поменять в исходном коде все имена, ссылающиеся на него. Аналогично, если Вы удалили бит события, то также необходимо вручную удалить в исходном коде все ссылки на этот бит события. Подробнее про биты событий VDK можно почитать в статье [2]. [Шаг 8: добавление и редактирование события (Event)] 1. Выполните правый клик на иконку Events, и выберите в контекстном меню New Event (см. рис. 3-19). Рис. 3-19. Контекстное меню Events. 2. Введите имя для нового Event и нажмите Enter. Имя должно быть допустимым идентификатором для языка C. Подробнее про события см. [2, 5]. Вы можете поменять свойства Event. Для этого раскройте список параметров Event левым кликом на плюсике (см. рис. 3-20). Рис. 3-20. Развернутый список свойств Event. У события есть следующие свойства: Таблица 3-6. Свойства событий.
События можно переименовывать и удалять с помощью выбора в контекстном меню (правый клик, пункты меню Rename и Delete). После того, как Вы переименовали событие, необходимо вручную поменять в исходном коде все имена, ссылающиеся на него. Аналогично, если Вы удалили событие, то также необходимо вручную удалить в исходном коде все ссылки на это событие. У события (Event) должен быть как минимум один связанный с ним бит события (Event Bit), соответствующий условию события. Для добавления бита события к событию выполните следующие действия. 1. Сделайте правый клик на параметр Dependent Bits у события, и в контекстном меню выберите Add Dependency (рис. 3-21). Рис. 3-21. Контекстное меню Dependent Bits. 2. Выберите нужный бит события из выпадающего списка, и нажмите Enter для принятия новой зависимости для события (рис. 3-22). Рис. 3-22. События: выпадающий список для выбора зависимости от бита события. 3. Чтобы изменить зависимое значение бита события, выполните левый клик в колонке Value привязанного бита, и выберите в выпадающем списке нужное значение - 0 или 1 (см. рис. 3-23). Рис. 3-23. События: установка значения зависимости от бита события. [Шаг 9: добавление и редактирование прерывания (Interrupt)] 1. Выполните правый клик на разделе Interrupts и выберите в контекстном меню New Interrupt (см. рис. 3-24). Рис. 3-24. Контекстное меню Interrupts. Подробнее про обработчики прерываний (ISR) см. [2, 4]. 2. Откроется окно диалога New Interrupt (рис. 3-25). В поле Name: выберите нужное прерывание из выпадающего списка. Опционально Вы можете поменять поле ввода Source File: здесь задается имя файла, где будет находиться код обработчика прерывания. Рис. 3-25. Диалог создания нового прерывания. 3. Чтобы автоматически сгенерировать исходный код для этого прерывания, кликните Yes на соответствующей радиокнопке. Старые версии VisualDSP++ позволяют создавать обработчики только на языке ассемблера, новые версии VisualDSP++ позволяют также выбрать и языки высокого уровня C или C++. Если Вы хотите использовать уже имеющийся код обработчика прерывания, то кликните на радиокнопке No, тогда Вам предстоит вручную добавить этот файл исходного кода в проект. Имейте в виду, что имя для Interrupt и имя исходного файла до расширения должны полностью совпадать. 4. Кликните OK для создания нового прерывания. Если Вы выбрали генерировать исходный код, то будут автоматически созданы и добавлены в проект файлы для обработчика прерывания. Если Вы задали имена для автоматически генерируемых исходных файлов такими, которые уже есть в директории Вашего проекта, то существующие файлы будут перезаписаны. Раскройте список свойств прерывания левым кликом на плюсике (рис. 3-26). Рис. 3-26. Раскрытый список свойств Interrupt. У компонента Interrupt есть следующие свойства: Таблица 3-7. Свойства прерывания.
Вы можете удалить прерывание из проекта, для этого кликните правой кнопкой мыши на имя прерывания, и выберите в контекстном меню Delete. Альтернативно левым кликом выберите имя прерывания и нажмите клавишу Delete. Среда VisualDSP++ спросит у Вас подтверждение на удаление прерывания из проекта (Yes удалит прерывание, No отменит удаление). Имейте в виду, что файл обработчика прерывания не будет удален из папки проекта, он будет только удален из списка компилируемых файлов проекта (дерево файлов окна Project). Когда Вы удалили прерывание из проекта, необходимо также вручную удалить из исходного кода все ссылки на это прерывание. [Шаг 10: добавление и редактирования драйвера устройства (Device Driver)] 1. Выполните правый клик на раздел Device Drivers, и в контекстном меню выберите New Device Driver (рис. 3-27). Рис. 3-27. Контекстное меню Device Drivers. 2. Откроется окно диалога New Device Driver. Заполните поле Device Driver Name: (имя драйвера устройства). Имя Device Driver должно быть допустимым для идентификатора языка C. Вы можете поменять поля ввода Source File: и Header File: это имена файлов исходного кода и заголовка для драйвера устройства (рис. 3-28). Рис. 3-28. Окно диалога New Device Driver. 3. Чтобы автоматически сгенерировать исходный код для драйвера устройства, кликните на радиокнопку Yes. Если выбрать Yes, то можно выбрать язык, на котором будут сгенерированы файлы: C++ или C. Если Вы хотите использовать существующий исходный код, кликните No. Тогда понадобится вручную добавить файлы исходного кода в проект. Имейте в виду, что имя для Device Driver и имена его файлов до расширения должны совпадать. Если Вы задали имена для автоматически генерируемых исходных файлов такими, которые уже есть в директории Вашего проекта, то существующие файлы будут перезаписаны. 4. Кликните OK для создания нового драйвера устройства. Если было выбрано генерировать исходный код, то файлы для драйвера устройства будут созданы и добавлены в проект. Раскройте список свойств драйвера устройства левым кликом на плюсике. Вы можете отредактировать свойства драйвера левым кликом на значении свойства (рис. 3-29). Рис. 3-29. Развернутый список свойств драйвера устройства. У Device Driver есть два свойства, которые задают имена для исходного кода и файла заголовка драйвера устройства - Source File и Header File соответственно. Вы можете удалить драйвер устройства правым кликом на его имени и выбором в контекстном меню пункта Delete. Альтернативно можно выбрать драйвер левым кликом на имени и нажать клавишу Delete. Среда VisualDSP++ выдаст запрос подтверждения для удаления драйвера. Выбор Yes удалит драйвер и его файлы из проекта, No отменит удаление. Имейте в виду, что файлы исходного кода драйвера не будут удалены из директории проекта, они будут удалены только из дерева файлов проекта в окне Project. Когда Вы удалили Device Driver из проекта, необходимо также вручную удалить из исходного кода все ссылки на этот драйвер, а также ссылки на связанные с ним флаги устройства (Device Flags). Подробнее про драйверы устройств см. [2, 6]. Драйвер устройства может иметь связанные с ним флаги устройства (Device Flags). Чтобы добавить флаг устройства, сделайте правый клик на разделе Device Flags, и выберите в контекстном меню Add Device Flag (рис. 3-30). Рис. 3-30. Контекстное меню Device Flags. Укажите имя для флага устройства и нажмите Enter для создания нового флага. Имя для Device Flag должно быть допустимым для идентификатора языка C. Имена для флагов устройства должны быть уникальными для всей системы. Подробнее про флаги устройства см. [2, 5]. [Ссылки] 1. CONFIGURING A PROJECT TO USE THE VDK site:smd.hu. |