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
• Шаг 2: модификация системных параметров (VDK System Parameters)
• Шаг 3: добавление и редактирования типа потока (Thread Type)
• Шаг 4: добавление и редактирование потока загрузки (Boot Thread)
• Шаг 5: добавление и редактирование циклического приоритета (Round-Robin Priority)
• Шаг 6: добавление и редактирование семафора (Semaphore)
• Шаг 7: добавление и редактирование бита события (Event Bit)
• Шаг 8: добавление и редактирование события (Event)
• Шаг 9: добавление и редактирование прерывания (Interrupt)
• Шаг 10: добавление и редактирования драйвера устройства (Device Driver)

Примечание: объяснение всех этих непонятных терминов можно найти в статье "Обзор VisualDSP++ Kernel RTOS (VDK)" [2].

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

[Шаг1: создание нового проекта VDK]

1. Выберите в меню Project -> New..., среда VisualDSP++ откроет окно диалога Save New Project, предлагая сохранить новый проект.

VDK new project fig301

2. Заполните поле для имени нового проекта (File name:), выберите каталог для сохранения (Save in:) и кликните OK для сохранения файла проекта.

Поддержка VDK не может быть добавлена в существующие проекты.

3. В меню Project выберите Project Options..., VisualDSP++ откроет окно диалога опций проекта Project Options, предлагая настроить проект (рис. 3-2).

4. Установите тип целевого процессора (Target -> Processor). Этот диалог позволяет установить тот тип процессора, для которого установлена поддержка VDK. В этом примере используется целевой процессор ADSP-BF538. Кликните OK, чтобы применить настройки.

VDK project options fig302

Рис. 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 показаны добавленные файлы после создания нового проекта.

VDK Project tab fig304

Рис. 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) кликом на плюсике.

VDK Kernel tab System fig305

Рис. 3-5. Развернутые параметры System.

У компонента System имеются следующие свойства:

Таблица 3-1. Свойства System.

Свойство Описание По умолчанию Примечание
Clock Frequency (MHz) Тактовая частота для выбранного целевого процессора. 270 МГц Тип значения float. Указанное значение будет округлено к ближайшему младшему биту (LSB) для тактовой частоты. Значение должно быть не равным 0.
Tick Period (ms) Длительность тика системы в миллисекундах. 0.1 мс Тип значения float. Значение будет округлено к ближайшему младшему биту (LSB) тактовой частоты. Значение не должно быть равным 0.
History Buffer Size Максимальное количество записей в буфере истории. 256 Тип значения int. На каждую запись выделяется 4 слова (16 байт). Значение действует только в том случае, если свойство Instrumentation Level не установлено в none.
Instrumentation Level Уровень поддержки отладки Full Instrumentation Выбирает уровень поддержки отладки, подробнее см. [3].
Timer Interrupt Прерывание таймера, используемое библиотекой VDK для внутренних целей. EVT_IVTMR Выбирает уровень прерывания для обслуживания таймера. Прерывания таймера используются в VDK для запуска планировщика и отсчета тиков.

Примечание: приведенные значения по умолчанию даны для процессора Blackfin ADSP-BF538.

Для дополнительной информации по циклическому планированию выполнения потоков см. описание "Round-Robin Scheduling" документации VDK [2]. Про буфер истории см. описание "State History Window" в статье [3].

[Шаг 3: добавление и редактирования типа потока (Thread Type)]

1. Сделайте правый клик на разделе Thread Types, чтобы отобразить контекстное меню, и затем выберите в нем New Thread Type (рис. 3-6).

VDK Thread Types context menu fig306

Рис. 3-6. Контекстное меню Thread Types.

Подробнее про типы потоков см. раздел "Типы потоков" (Thread Types) в статье [2].

2. Откроется диалог для создания нового типа потока (New Thread Type, см. рис. 3-7). Заполните поля Name: (имя потока, которое должно быть допустимым идентификатором для языка C, т. е. в нем не должно быть специальных символов наподобие пробелов и дефисов), Source File: (здесь указывается имя для исходного кода модуля класса потока) и Header File: (здесь указывается имя файла заголовка для типа класса потока).

VDK New Thread Type dialog fig307

Рис. 3-7. Диалог создания нового типа потока.

3. В диалоге есть 2 радиокнопки Yes и No, относящиеся к автоматической генерации шаблонов исходного кода для создаваемого типа потока. Кликните Yes, чтобы автоматически сгенерировать файлы исходного кода для созданного типа потока. Файлы будут сгенерированы на том языке, который был выбран в выпадающем списке Language: диалога (см. рис. 3-7). Вы можете выбрать один из вариантов C++, C и Assembly.

Если Вы хотите использовать существующий исходный код, кликните No. Затем вручную добавьте исходные файлы в проект. Имейте в виду, что имя типа потока и имена файлов должны соответствовать друг другу (должны совпадать имена файлов до расширения).

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

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

Раскройте дерево на иконке Thread Types (рис. 3-8), и дерево настроек созданного потока. Вы можете отредактировать свойства у каждого типа потока левым кликом на значение свойства.

VDK Thread Types properties fig308

Рис. 3-8. Раскрытый список параметров типа потока.

У компонента типа потока есть следующие свойства:

Таблица 3-2. Свойства типа потока.

Свойство Описание По умолчанию Примечание
Priority Начальный приоритет для этого типа (класса) потока. 5 Тип значения int. Максимальное значение равно разрядности процессора минус 2. Самый высокий приоритет 1.
Message Enabled Разрешение для потока принимать сообщения. false Для каждого типа потока можно задать, можно ли ему принимать сообщения (если false, то нельзя, если true то можно). При отключенном приеме сообщений экономится некоторое место в памяти, потому что не требуется внутренняя структура для поддержки этой функции. Потоки, которым запрещено принимать сообщения, все еще могут их отправлять другим потокам, но принимать сообщения они не могут.
Thread Structure Heap Место для хранения служебной информации потока. system_heap Когда создается поток, система выделяет в куче область для структуры данных, где хранится информация, специфическая для потока. Эта информация нужна для многопоточного ядра, и здесь хранится информация о потоке, заданная пользователем.
Stack Heap Куча для стека. system_heap Каждый поток имеет собственный стек. Здесь задается область памяти, используемая под стек потока (по умолчанию это куча системы).
Stack Size Размер стека. 255 Тип значения int. Максимальное значение ограничено размером системной памяти (системной кучи). Размер стека должен быть задан числом, большим 0.
Source File Файл исходного кода для класса потока. - имятипапотока.cpp, или имятипапотока.c, или имятипапотока.asm
Header File Файл подключаемого заголовка для класса потока. - имятипапотока.h

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).

VDK Boot Threads context menu fig309

Рис. 3-9. Контекстное меню Boot Threads.

2. Введите имя для нового Boot Thread и нажмите Enter.

Левым кликом на плюсике раскройте список свойств Boot Thread. В настоящий момент у потока загрузки для редактирования доступно 2 свойства: Thread Type и Initializer (см. рис. 3-10).

VDK Boot Thread properties fig310

Рис. 3-10. Раскрытый список параметров Boot Thread.

У потока загрузки 2 свойства - тип потока и инициализатор.

Свойство Описание По умолчанию Примечание
Thread Type Тип потока. Первый из созданных пользовательских типов. Каждый поток имеет тип, который определяет его алгоритм работы.
Initializer Инициализатор потока. 0 Это значение обычно используется для потоков одинакового типа, чтобы можно было изменить поведения разных экземпляров потока одинакового типа. Инициализатор можно задать уникальным для каждого запущенного потока, и по нему программно отделять один поток от другого.

Может быть создано несколько потоков загрузки одинакового типа. Подробнее про потоки загрузки см. [2].

1. Выполните правый клик на имя Boot Thread, и выберите из контекстного меню пункт Rename.

2. Нажмите Enter чтобы принять изменение имени, ESC для отмены изменения.

Выполните правый клик на имя Boot Thread, и выберите из контекстного меню пункт Delete. Альтернативно выберите Boot Thread и нажмите клавишу Delete.

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

Можно задать очередность запуска конструкторов потоков загрузки. Это делается перетаскиванием имен потока вверх или вниз по списку Boot Threads. Левым кликом выберите и удерживайте имя потока загрузки, и перетащите его на нужную позицию в списке. Чем выше поток находится в списке, тем раньше он запустится. Отпустите имя потока в том месте списка, где нужно (см. рис. 3-11).

VDK moving Boot Thread objects fig311

Рис. 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.

VDK Round Robin Priorities context menu fig312

Рис. 3-12. Контекстное меню Round-Robin Priority.

Подробнее про планирование выполнения потоков по циклическому приоритету (Round-Robin) см. [2].

2. Из выпадающего списка выберите приоритет, который Вы хотите задать (см. рис 3-13).

VDK Round Robin select priority fig313

Рис. 3-13. Выбор приоритета Round-Robin.

Разверните список свойств приоритета Round-Robin. Вы можете отредактировать свойство Period левым кликом на его значение (см. рис. 3-14).

VDK Round Robin Priority properties menu fig314

Рис. 3-14. Свойства приоритета Round-Robin.

Period задается в тиках системы (подробнее см. [2]), должно быть задано значение, не равное 0 (по умолчанию 10).

Чтобы удалить приоритет Round-Robin из проекта, выполните на нем правый клик и выберите Delete из контекстного меню. Альтернативно выберите приоритет, и нажмите клавишу Delete.

[Шаг 6: добавление и редактирование семафора (Semaphore)]

1. Выполните правый клик на раздел Semaphores и выберите в контекстном меню New Semaphore (см. рис. 3-15). Будет создан новый семафор.

VDK Semaphores context menu fig315

Рис. 3-15. Контекстное меню Semaphores.

2. Введите имя для нового семафора и нажмите Enter. Имя семафора должно быть допустимым для идентификаторов языка C.

Подробнее про семафоры см. [2, 5].

Разверните список свойств семафора левым кликом на плюсике. Можно выбрать свойство и изменить его значение левым кликом на свойстве (рис. 3-16).

VDK Semaphore properties fig316

Рис. 3-16. Список свойств семафора.

У семафора есть следующие свойства:

Таблица 3-4. Свойства семафора.

Свойство Описание По умолчанию Примечание
Initial Value Начальное значение счетчика семафора. 0 При создании семафора он получает это начальное значение.
Max Count Максимальное значение для счетчика семафора. 2147483647 В старых версиях VDK семафоры были двоичными. Сейчас семафоры поддерживают вложенность взятия, и здесь задается максимальное количество взятий семафора.
Initial Delay Начальная задержка семафора в тиках. 0 Значение типа int. Для периодических семафоров нужно указать оба значения.
Period Период семафора в тиках. 0

Семафоры можно переименовывать и удалять с помощью выбора в контекстном меню (правый клик на семафоре, пункты меню Rename и Delete).

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

Подробнее про семафоры VDK можно почитать в статье [2].

[Шаг 7: добавление и редактирование бита события (Event Bit)]

1. Выполните правый клик на иконку Event Bits, и выберите в контекстном меню New Event Bit (см. рис. 3-17).

VDK Event Bits context menu fig317

Рис. 3-17. Контекстное меню Event Bits.

2. Введите имя для нового Event Bit и нажмите Enter. Имя должно быть допустимым идентификатором для языка C. Подробнее про биты событий см. [2, 5].

Вы можете поменять свойства Event Bit. Для этого раскройте список параметров Event Bit левым кликом на плюсике (см. рис. 3-18).

VDK Event Bit properties fig318

Рис. 3-18. Развернутый список свойств Event Bit.

У бита события есть свойство Initial Value, отражающее его начальное значение в момент загрузки системы VDK (по умолчанию 0).

Биты события можно переименовывать и удалять с помощью выбора в контекстном меню (правый клик, пункты меню Rename и Delete).

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

Подробнее про биты событий VDK можно почитать в статье [2].

[Шаг 8: добавление и редактирование события (Event)]

1. Выполните правый клик на иконку Events, и выберите в контекстном меню New Event (см. рис. 3-19).

VDK Events context menu fig319

Рис. 3-19. Контекстное меню Events.

2. Введите имя для нового Event и нажмите Enter. Имя должно быть допустимым идентификатором для языка C. Подробнее про события см. [2, 5].

Вы можете поменять свойства Event. Для этого раскройте список параметров Event левым кликом на плюсике (см. рис. 3-20).

VDK Event properties fig320

Рис. 3-20. Развернутый список свойств Event.

У события есть следующие свойства:

Таблица 3-6. Свойства событий.

Свойство Описание По умолчанию Примечание
Type Условие, по которому событие переходит в состояние signaled. Any Есть 2 варианта для выбора Any и All. Если выбрано Any, то событие переходит в состояние signaled, когда удовлетворяется условие у любого зависимого бита события. Если выбрано All, то событие переходит в состояние signaled, когда у всех удовлетворяются условия у всех зависимых бит событий.
Dependent Bits Здесь задаются биты события, от которых зависит событие. - По умолчанию не задано ни одной привязки к битам события. Вы можете добавить привязки к битам через контекстное меню этого свойства.

События можно переименовывать и удалять с помощью выбора в контекстном меню (правый клик, пункты меню Rename и Delete).

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

У события (Event) должен быть как минимум один связанный с ним бит события (Event Bit), соответствующий условию события. Для добавления бита события к событию выполните следующие действия.

1. Сделайте правый клик на параметр Dependent Bits у события, и в контекстном меню выберите Add Dependency (рис. 3-21).

VDK Event dependency context menu fig321

Рис. 3-21. Контекстное меню Dependent Bits.

2. Выберите нужный бит события из выпадающего списка, и нажмите Enter для принятия новой зависимости для события (рис. 3-22).

VDK Event add dependency fig322

Рис. 3-22. События: выпадающий список для выбора зависимости от бита события.

3. Чтобы изменить зависимое значение бита события, выполните левый клик в колонке Value привязанного бита, и выберите в выпадающем списке нужное значение - 0 или 1 (см. рис. 3-23).

VDK Event set dependency value fig323

Рис. 3-23. События: установка значения зависимости от бита события.

[Шаг 9: добавление и редактирование прерывания (Interrupt)]

1. Выполните правый клик на разделе Interrupts и выберите в контекстном меню New Interrupt (см. рис. 3-24).

VDK Interrupts context menu fig324

Рис. 3-24. Контекстное меню Interrupts.

Подробнее про обработчики прерываний (ISR) см. [2, 4].

2. Откроется окно диалога New Interrupt (рис. 3-25). В поле Name: выберите нужное прерывание из выпадающего списка. Опционально Вы можете поменять поле ввода Source File: здесь задается имя файла, где будет находиться код обработчика прерывания.

VDK New Interrupt dialog fig325

Рис. 3-25. Диалог создания нового прерывания.

3. Чтобы автоматически сгенерировать исходный код для этого прерывания, кликните Yes на соответствующей радиокнопке. Старые версии VisualDSP++ позволяют создавать обработчики только на языке ассемблера, новые версии VisualDSP++ позволяют также выбрать и языки высокого уровня C или C++. Если Вы хотите использовать уже имеющийся код обработчика прерывания, то кликните на радиокнопке No, тогда Вам предстоит вручную добавить этот файл исходного кода в проект. Имейте в виду, что имя для Interrupt и имя исходного файла до расширения должны полностью совпадать.

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

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

Раскройте список свойств прерывания левым кликом на плюсике (рис. 3-26).

VDK Interrupt properties fig326

Рис. 3-26. Раскрытый список свойств Interrupt.

У компонента Interrupt есть следующие свойства:

Таблица 3-7. Свойства прерывания.

Свойство Описание По умолчанию Примечание
Enabled at Boot Управляет состоянием прерывания после загрузки - разрешена его работа или нет. false Тип boolean. Если false, то после загрузки прерывание запрещено, если true то разрешено. Если запрещено, то Вы можете разрешить прерывание программно в коде приложения.
Entry Point Имя метки для точки входа в ISR. имяпрерывания_Entry
Source File Имя файла исходного кода для ISR. имяпрерывания.cpp, или имяпрерывания.c, или имяпрерывания.asm

Вы можете удалить прерывание из проекта, для этого кликните правой кнопкой мыши на имя прерывания, и выберите в контекстном меню Delete. Альтернативно левым кликом выберите имя прерывания и нажмите клавишу Delete. Среда VisualDSP++ спросит у Вас подтверждение на удаление прерывания из проекта (Yes удалит прерывание, No отменит удаление). Имейте в виду, что файл обработчика прерывания не будет удален из папки проекта, он будет только удален из списка компилируемых файлов проекта (дерево файлов окна Project).

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

[Шаг 10: добавление и редактирования драйвера устройства (Device Driver)]

1. Выполните правый клик на раздел Device Drivers, и в контекстном меню выберите New Device Driver (рис. 3-27).

VDK Device Drivers context menu fig327

Рис. 3-27. Контекстное меню Device Drivers.

2. Откроется окно диалога New Device Driver. Заполните поле Device Driver Name: (имя драйвера устройства). Имя Device Driver должно быть допустимым для идентификатора языка C. Вы можете поменять поля ввода Source File: и Header File: это имена файлов исходного кода и заголовка для драйвера устройства (рис. 3-28).

VDK New Device Driver dialog fig328

Рис. 3-28. Окно диалога New Device Driver.

3. Чтобы автоматически сгенерировать исходный код для драйвера устройства, кликните на радиокнопку Yes. Если выбрать Yes, то можно выбрать язык, на котором будут сгенерированы файлы: C++ или C.

Если Вы хотите использовать существующий исходный код, кликните No. Тогда понадобится вручную добавить файлы исходного кода в проект. Имейте в виду, что имя для Device Driver и имена его файлов до расширения должны совпадать.

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

4. Кликните OK для создания нового драйвера устройства. Если было выбрано генерировать исходный код, то файлы для драйвера устройства будут созданы и добавлены в проект.

Раскройте список свойств драйвера устройства левым кликом на плюсике. Вы можете отредактировать свойства драйвера левым кликом на значении свойства (рис. 3-29).

VDK Device Driver properties fig329

Рис. 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).

VDK Device Flags context menu fig330

Рис. 3-30. Контекстное меню Device Flags.

Укажите имя для флага устройства и нажмите Enter для создания нового флага. Имя для Device Flag должно быть допустимым для идентификатора языка C. Имена для флагов устройства должны быть уникальными для всей системы.

Подробнее про флаги устройства см. [2, 5].

[Ссылки]

1. CONFIGURING A PROJECT TO USE THE VDK site:smd.hu.
2. Обзор VisualDSP++ Kernel RTOS (VDK).
3. Конфигурирование и отладка проектов VDK.
4. VDK: обработчики прерываний (ISR).
5. VDK: сигналы, взаимодействие потоков и ISR (синхронизация).
6. VDK: драйверы устройств и системные службы процессоров Blackfin.