Разработка программного обеспечения микропроцессорной системы на основе ядра MicroBlaze, реализуемой в ПЛИС семейств FPGA фирмы Xilinx
Настоящая статья является продолжением цикла публикаций [1–8], в котором рассматривается процесс проектирования встраиваемых микропроцессорных систем, реализуемых в ПЛИС семейств FPGA фирмы Xilinx [9] с использованием тридцатидвухразрядного ядра MicroBlaze. В предыдущей части данного цикла был подробно представлен процесс разработки и реализации аппаратной части и создания спецификации программной платформы проектируемой системы, выполняемый в САПР Xilinx EDK. Завершающая стадия разработки встраиваемых микропроцессорных систем охватывает процедуры генерации программной платформы, создания, трансляции, компоновки и отладки соответствующего прикладного программного обеспечения. Все перечисленные процедуры выполняются с помощью комплекса средств проектирования Xilinx Embedded System Tools (EST).
Генерация программной платформы микропроцессорной системы
Процесс генерации программной платформы встраиваемой микропроцессорной системы выполняется в автоматическом режиме. Для его запуска необходимо в основном меню управляющей оболочки Xilinx Platform Studio выделить пункт Tools, после чего в открывшемся всплывающем меню выбрать команду Generate Libraries and BSPs. Кроме того, с этой же целью можно воспользоваться кнопкой быстрого доступа
, расположенной на оперативной панели управления XPS. В результате выполнения указанных операций генератор библиотек Library Generator (Libgen) на основании информации, приведенной в спецификации программных средств Microprocessor Software Specification (MSS), формирует компоненты программной платформы разрабатываемой микропроцессорной системы (драйверы, библиотеки, программы обслуживания прерываний). При этом в рабочем каталоге проекта XPS автоматически создается раздел, название которого совпадает с позиционным обозначением используемого микропроцессорного ядра. В этом разделе автоматически формируются четыре каталога с названиями code, include, lib и libsrc, которые предназначены для записи различных компонентов программной платформы. Раздел code используется для хранения файлов, которые содержат код, используемый в процессе отладки. В разделе include представлены заголовочные файлы для драйверов периферийных устройств, которые включены в состав проектируемой системы. Каталог lib содержит библиотечные файлы. В раздел libsrc записываются вспомогательные файлы, используемые для компиляции библиотек и драйверов.
Создание проекта прикладной программы для микропроцессорной системы в среде Xilinx Platform Studio
Каждая прикладная программа для встраиваемой микропроцессорной системы на основе ядра MicroBlaze разрабатывается в виде соответствующего программного проекта (Software project). Такой проект может включать следующие компоненты:
- файлы, содержащие исходный текст прикладной программы (source files);
- заголовочные файлы (header files);
- файл директив для компоновщика (linker scripts).
В то же время проект прикладной программы является составной частью проекта микропроцессорной системы в САПР Xilinx EST. Управление созданием, компиляцией и компоновкой прикладных программ осуществляется в среде XPS с помощью страницы Applications встроенного окна проекта разрабатываемой системы.
Процесс создания нового проекта прикладной программы можно активизировать одним из трех возможных способов: посредством команды основного меню, кнопки быстрого доступа и контекстно-зависимоговсплывающего меню. При использовании первого способа следует выделить пункт Project в основном меню управляющей оболочки Xilinx Platform Studio, после чего в открывшемся всплывающем меню выбрать команду Add Software Application Project… Второй способ заключается в нажатии кнопки быстрого доступа
,расположенной на оперативной панели управления XPS. Чтобы воспользоваться третьим способом, следует на странице Applications встроенного окна проекта разрабатываемой системы выделить строку Software projects ищелкнуть правой кнопкой мыши. При этом на экран выводится контекстно-зависимое всплывающее меню, в котором нужно выбрать команду Add New Project… В результате выполненных операций на экран выводится диалоговая панель, вид которой показан на рис. 2.
В этой панели нужно активизировать поле редактирования Project Name (рис. 2), поместив на него курсор и щелкнув левой кнопкой мыши, после чего ввести название создаваемого проекта, используя клавиатуру. При этом необходимо учитывать, что название не должно содержать пробелов и других символов-разделителей. Далее, при необходимости (в многопроцессорных системах), следует в поле выбора Processor указать идентификатор микропроцессорного ядра, для которого предназначена разрабатываемая программа. Возможные варианты идентификаторов перечислены в списке, который открывается при нажатии кнопки в правой части поля выбора Processor. Процедура определения всех необходимых параметров создаваемого проекта завершается нажатием клавиши ОК, находящейся в нижней части диалоговой панели (рис. 2). В качестве примера создадим проект тестовой программы TestApp для простейшей микропроцессорной системы сбора данных, разработка которой была рассмотрена ранее [5–8]. После ввода названия приложения и закрытия диалоговой панели создания нового проекта прикладной программы (рис. 2)страница Applications встроенного окна управляющей оболочки Xilinx Platform Studio приобретает вид, показанный на рис. 3.
На этой странице полужирным шрифтом выделена строка с названием созданного проекта прикладной программы, после которой перечисляются его основные параметры и структурные модули. В строке Processor отображается идентификатор микропроцессорного ядра, для которого предназначена разрабатываемая программа. Строка Executable информирует о расположении каталога, в который должен записываться файл с исполняемым кодом создаваемой прикладной программы.
Строка Compiler options позволяет получить информацию о значениях параметров компилятора и при необходимости изменить эти значения. Для просмотра текущих значений ключевых параметров компилятора достаточно расположить курсор на пиктограмме в виде знака «+», расположенной в начале этой строки, и щелкнуть левой кнопкой мыши. При этом во встроенном окне проекта управляющей оболочки XPS на странице Applications появляются дополнительные строки, в которых отображаются текущие значения основных параметров компилятора. Чтобы установить или изменить значения параметров компилятора, следует дважды щелкнуть левой кнопкой мыши на строке Compiler options или воспользоваться командой Set Compiler options… из контекстно-зависимого всплывающего меню.
Это меню отображается на экране при щелчке правой кнопкой мыши на строке Compiler options. В результате на экран выводится диалоговая панель, вид которой представлен на рис. 4.
Панель диалога установки параметров компилятора для разрабатываемой прикладной программы содержит четыре страницы, снабженные закладками с их названиями: Environment, Optimization, Directories, Advanced. На странице Environment отображается информация о командной строке запуска компилятора и режиме функционирования компилируемой программы — исполняемый (Executable) или отладочный (XmdStub). Кроме того, эта страница позволяет указать стартовый адрес компилируемой программы и размер стека при отсутствии файла директив для компоновщика (linker scripts).
Значение стартового адреса задается с помощью клавиатуры в поле редактирования Program Start Address. Для определения размера стека предназначено поле редактирования Stac Size. При наличии файла директив для компоновщика значения стартового адреса и размера стека, указанные на этой странице, игнорируются. Страница Optimization используется для выбора уровня оптимизации разрабатываемой прикладной программы и управления записью отладочной информации в исполняемый код (рис. 5).
Уровень оптимизации компилируемой программы устанавливается с помощью поля выбора Optimization Level, которое находится во встроенной панели Optimization parameters рассматриваемой страницы (рис. 5). Значение Level 3 соответствует максимальному уровню оптимизации. Управление генерацией отладочной информации в процессе формирования исполняемого кода прикладной программы осуществляется с помощью трех кнопок с зависимой фиксацией, которые расположены во встроенной панели Debug options. Если зафиксирована кнопка Do not generate debug symbols, то отладочная информация не будет включаться в исполняемый код разрабатываемой прикладной программы. Для формирования отладочного кода необходимо нажать кнопку Create symbols for debugging.
Страница Directories (рис. 6) позволяет указать каталоги, в которых находятся заголовочные файлы, библиотеки, файлы, используемые компоновщиком, и раздел, в который записывается сгенерированный исполняемый код.
Встроенная панель Search Paths предоставляет возможность определения путей доступа к различным файлам, используемым в процессе компиляции прикладной программы.
Для определения пути доступа к библиотечным файлам предназначено поле Library. Путь доступа к заголовочным файлам может быть указан в поле Include. Полные названия файлов, используемые при компоновке прикладной программы, приводятся во встроенной панели Linker Options. В поле Linker Scripts определяется название файла директив для компоновщика. Для поиска соответствующего файла можно воспользоваться стандартной диалоговой панелью открытия файла, которая отображается на экране при нажатии на кнопку с пиктограммой в виде многоточия (…), находящуюся справа от поля Linker Scripts.
Названия библиотек, используемых в процессе компоновки прикладной программы, перечисляются в поле Libs to link. Встроенная панель Output Information предназначена для определения названия результирующих файлов. В поле Output ELF File указывается идентификатор файла, в который записывается исполняемый код разрабатываемой прикладной программы.
Страница Advanced позволяет определить дополнительные параметры компилятора и компоновщика, которые не представлены на других страницах диалоговой панели. Все внесенные изменения на страницах диалоговой панели установки параметров компилятора вступают в силу при нажатии клавиши ОК, находящейся в нижней части этой панели (рис. 4–7). После установки необходимых значений параметров компиляции и компоновки программы следует включить в состав проекта прикладной программы необходимые исходные файлы. Для этого следует дважды щелкнуть левой кнопкой мыши на строке Sources, которая расположена на странице Applications встроенного окна управляющей оболочки Xilinx Platform Studio. При этом на экран выводится стандартная диалоговая панель открытия файла. Аналогичную функцию выполняет команда Add File… из контекстно-зависимого всплывающего меню, которое отображается на экране при щелчке правой кнопкой мыши на строке Sources.
Используя панель диалога открытия файла, следует в рабочем каталоге проекта XPS создать раздел, название которого должно совпадать с именем разрабатываемой программы. Например, для тестовой программы, проект которой был создан выше, нужно сформировать каталог TestApp. Далее в стандартной диалоговой панели необходимо войти в созданный раздел и в поле редактирования названия файла ввести с клавиатуры идентификатор исходного модуля, включаемого в состав программного проекта. Название файла должно иметь расширение, соответствующее типу создаваемого исходного модуля.
Например, файл, содержащий исходный текст программы на языке С, должен иметь расширение .с. Если включаемый файл еще не существует, на экран выводится запрос о необходимости его создания. При утвердительном ответе на этот запрос в выбранном разделе создается пустой файл с указанным названием, а на странице Applications под строкой Sources появляется строка с названием нового исходного модуля, включающим полный путь доступа к нему. После этого можно перейти к формированию содержимого исходных файлов. В качестве примера добавим в состав созданного программного проекта TestApp файл TestApp.c, который будет содержать исходный текст тестовой программы.
Формирование исходных модулей прикладной программы
Для того чтобы открыть исходный файл в интегрированном текстовом редакторе средств проектирования XST, на странице Applications следует дважды щелкнуть левой кнопкой мыши на строке с его названием. При этом в управляющей оболочке XPS открывается новое рабочее окно редактирования, на закладке которого указано название выбранного файла. В этом окне с помощью клавиатуры формируется исходный текст прикладной программы. После завершения редактирования исходного файла необходимо сохранить его, используя команду Save из всплывающего меню, которое открывается при выборе пункта File основного меню управляющей оболочки.
Создание исходного текста проиллюстрируем примером тестовой программы для простейшей системы сбора данных system_tst. Эта программа должна выполнять циклическое чтение данных, поступающих из параллельного порта ввода-вывода, сравнение их с верхним и нижним пороговыми значениями и при выходе за их пределы формировать соответствующие сообщения, которые через последовательный порт RS-232 передаются вместе с данными на персональный компьютер. Для отображения поступающих данных и сообщений на экране монитора персонального компьютера может использоваться программа HyperTerminal, которая входит в состав операционных систем Windows 98, Windows 2000 и Windows XP. Исходный текст тестовой программы выглядит следующим образом.
// ***** Тестовая программа TestApp.c ***** //============================================== // Включаемые файлы //============================================== #include «xparameters.h» #include «xutil.h» #include «xgpio_l.h» //============================================== // Определение функции чтения данных из входного порта //============================================== Xuint32 ReadFromGPInput(Xuint32 BaseAddress) { Xuint32 data = XGpio_mGetDataReg(BaseAddress, 1); return data; } //============================================== // Текст основной программы //============================================== int main (void) { int i; int low_level = 25; // Значение нижнего допустимого уровня int high_level = 150; // Значение верхнего допустимого уровня print(«-- Старт тестовой программы nr»); for (i=1; i high_level) xil_printf(«Значение параметра больше верхнего допустимого уровня: 0x%xnr», data); // else // xil_printf(«Значение параметра в допустимых пределах: 0x%xnr», data); } print(«-- Завершение работы тестовой программы --nr»); return 0; } |
В начале файла TestApp.c, после перечисления включаемых заголовочных файлов, определяется функция ReadFromGPInput, которая осуществляет чтение данных из параллельного порта ввода-вывода. Далее следует исходный текст основной программы main.
Структура файла директив для компоновщика (linker scripts)
Для управления процессом компоновки исполняемого файла разрабатываемой программы используется файл директив linker scripts. Типовая структура исполняемого файла прикладной программы для встраиваемой микропроцессорной системы, реализуемой на основе ядра MicroBlaze, показана на рис. 8.
Эта структура включает в себя семь секций. В секции .text содержится исполняемый код программы. Секция .rodata содержит данные, предназначенные только для чтения, длина которых более 8 байт. Секция sdata2 содержит данные, используемые только для чтения, размер которых не превышает 8 байт. В секции .data размещаются данные, предназначенные для чтения и записи, длина которых более 8 байт. Секция sdata включает в себя перезаписываемые данные, размер которых не превышает 8 байт. Секция .sbss содержит неинициализированные данные, длина которых менее 8 байт. В секции .bss размещаются неинициализированные данные, размер которых превышает 8 байт.
Файл директив для компоновщика (linker scripts) описывает порядок размещения секций в исполняемом файле прикладной программы. В начале этого файла определяется размер стека и диапазон адресов для каждого типа памяти микропроцессорной системы.
Далее поочередно с помощью соответствующих ключевых слов описываются рассмотренные выше секции. В качестве примера ниже приводится текст файла директив TestAppLinkScr, предназначенного для компоновки тестовой прикладной программы TestApp.
_STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x400; /* Define all the memory regions in the system */ MEMORY { ilmb_cntlr : ORIGIN = 0x00000000, LENGTH = 0x1fff } /* * Specify the default entry point to the program */ ENTRY(_start) /* * Define the sections, and where they are mapped in memory */ SECTIONS { .text : { _ftext = .; *(.text) *(.text.*) *(.gnu.linkonce.t*) _etext = .; } > ilmb_cntlr .rodata : { _frodata = .; *(.rodata) *(.gnu.linkonce.r*) _erodata = .; } > ilmb_cntlr /* Alignments by 8 to ensure that _SDA2_BASE_ on a word boundary */ .sdata2 : { . = ALIGN(8); _sdata2_start = .; *(.sdata2) . = ALIGN(8); _sdata2_end = .; } > ilmb_cntlr _sdata2_size = _sdata2_end — _sdata2_start; PROVIDE (_SDA2_BASE_ = _sdata2_start + (_sdata2_size / 2 )); .data : { . = ALIGN(4); _fdata = .; *(.data) *(.gnu.linkonce.d*) _edata = .; } > ilmb_cntlr /* Alignments by 8 to ensure that _SDA_BASE_ on a word boundary */ /* Note that .sdata and .sbss must be contiguous */ .sdata : { . = ALIGN(8); _ssro = .; *(.sdata) } > ilmb_cntlr .sbss : { . = ALIGN(4); PROVIDE (__sbss_start = .); *(.sbss) . = ALIGN(8); _essro = .; } > ilmb_cntlr PROVIDE (__sbss_end = _essro); _ssro_size = _essro — _ssro; PROVIDE (_SDA_BASE_ = _ssro + (_ssro_size / 2 )); .bss : { . = ALIGN(4); PROVIDE (__bss_start = .); *(.bss) *(COMMON) . = ALIGN(4); PROVIDE (__bss_end = .); } > ilmb_cntlr .bss_stack : { . = ALIGN(8); _heap = .; _heap_start = _heap; . += _STACK_SIZE; . = ALIGN(8); _stack = .; __stack = _stack; } > ilmb_cntlr } |
Файл директив для компилятора может быть создан с помощью различных текстовых редакторов, в том числе, с помощью встроенного редактора управляющей оболочки XPS. Сформированный файл должен располагаться в том разделе, который был указан в параметрах компилятора.
Компиляция и компоновка прикладной программы для микропроцессорной системы
После создания всех необходимых исходных файлов можно приступить к компиляции и компоновке прикладной программы. Запуск этого процесса осуществляется одним из трех способов. Первый способ заключается в использовании команды Build All User Applications из всплывающего меню Tools. Вторым способом активизации процедур компиляции и компоновки является нажатие кнопки быстрого доступа
, расположенной на оперативной панели управления XPS. Чтобы воспользоваться третьим способом, следует расположить курсор на строке с названием программного проекта на странице Applications и щелкнуть правой кнопкой мыши. Затем в появившемся контекстно-зависимом всплывающем меню нужно выбрать команду Build Project.
Процесс компиляции и компоновки прикладной программы выполняется в автоматическом режиме. Информация о его результатах отражается на странице Output встроенного окна консольных сообщений управляющей оболочки XPS. При обнаружении ошибок сведения о них выводятся на странице Errors.
В случае успешного завершения процедур компиляции и компоновки создается файл executable.elf, который содержит исполняемый код прикладной программы. Полученный файл используется для дополнения файла конфигурационной последовательности, который был сформирован на этапе реализации аппаратной части разрабатываемой микропроцессорной системы.
Запись исполняемого кода прикладной программы в конфигурационную последовательность проекта аппаратной части микропроцессорной системы и загрузка конфигурационных данных в кристалл ПЛИС
Чтобы включить исполняемый код прикладной программы в конфигурационную последовательность ПЛИС, реализующую функции аппаратной части микропроцессорной системы, следует выполнить команду Tools основного меню управляющей оболочки XPS.
При этом на экран выводится меню, в котором нужно выбрать команду Update Bitstream. Аналогичную функцию выполняет кнопка быстрого доступа , которая находится на оперативной панели управления XPS. При исполнении данной команды в конфигурационной последовательности проекта микропроцессорной системы производится перезапись содержимого блочной памяти ПЛИС. Информация о выполнении процесса преобразования конфигурационной последовательности отображается на странице Output встроенного окна консольных сообщений. При отсутствии ошибок создается новый файл конфигурационной последовательности download.bit, который записывается в раздел implementation рабочего каталога проекта разрабатываемой микропроцессорной системы. Этот файл может непосредственно использоваться для конфигурирования кристалла FPGA.
Управление процессом загрузки конфигурационных данных в ПЛИС может осуществляться двумя способами: непосредственно из оболочки XPS или в среде программы Impact, которая входит в состав САПР серии Xilinx ISE.
Загрузка конфигурационной последовательности проекта разрабатываемой микропроцессорной системы в ПЛИС осуществляется с помощью программы Impact и загрузочного JTAG-кабеля, подключаемого к параллельному порту (LPT) или к шине USB компьютера. При выборе первого способа управления этим процессом программа Impact запускается в пакетном режиме с помощью командного файла download.cmd. Этот командный файл по умолчанию должен располагаться в разделе etc рабочего каталога проекта встраиваемой микропроцессорной системы. Содержимое командного файла download.cmd выглядит следующим образом.
setMode -bscan setCable -p auto identify assignfile -p 1 -file implementation/download.bit program -p 1 quit |
Второй способ управления загрузкой конфигурационных данных в ПЛИС заключается в автономном запуске программы Impact. После старта этой программы автоматически запускается «мастер», который позволяет выполнить конфигурирование ПЛИС в интерактивном режиме [10].
Для того чтобы загрузить конфигурационную последовательность из управляющей оболочки XPS, следует выполнить команду Tools основного меню, а затем в соответствующем всплывающем меню выбрать строку Download. Процесс загрузки конфигурационных данных можно активизировать также с помощью кнопки быстрого доступа
, которая расположена на оперативной панели управления XPS. Выполнение процесса конфигурирования кристалла отображается на странице Output встроенного окна консольных сообщений управляющей оболочки XPS.
Для проверки функционирования аппаратной части разработанной системы сбора данных и тестовой программы воспользуемся отладочной платой из инструментального комплекта Spartan-3 Starter Kit. Прежде всего, к этой плате необходимо подключить загрузочный кабель, а также кабель, соединяющий разъем интерфейса с разъемом последовательного порта персонального компьютера. Далее следует подать напряжение питания на отладочную плату. После этого следует активизировать приложение HyperTerminal (Hypertrm.exe) и создать новое подключение, указав соответствующий COM-порт компьютера и установив требуемые параметры протокола передачи данных. Учитывая значения параметров последовательного асинхронного приемопередатчика, которые были заданы при создании спецификации аппаратной платформы проектируемой системы MHS (Microprocessor Hardware Specification), необходимо установить следующие настройки COM-порта:
- скорость передачи, равную 9600 бит/с;
- количество передаваемых бит данных — 8;
- количество стоповых бит — 1;
- контроль на четность или нечетность отсутствует.
Выполнив загрузку конфигурационной последовательности тестового проекта, следует убедиться в его работоспособности. Для этого, варьируя положение движков восьми ползунковых переключателей, расположенных на отладочной плате, имитируем изменение входных тестовых данных. При выходе значений входных данных за пределы заданного допустимого диапазона они отображаются в окне программы HyperTerminal, сопровождаясь соответствующими предупреждениями.
Заключение
Совокупность публикаций настоящего цикла содержит развернутую информацию о выполнении основных этапов разработки микропроцессорных систем на базе 32-разрядного ядра MicroBlaze. Для практического освоения методов проектирования встраиваемых микропроцессорных систем, реализуемых на основе ПЛИС семейств FPGA фирмы Xilinx, можно воспользоваться бесплатной 60-дневной версией пакета САПР Xilinx EDK. Чтобы получить данную версию пакета, следует обращаться к официальному дистрибьютору фирмы Xilinx в России, Беларуси и Украине, которым является центр поддержки и продаж InlineGROUP (www.plis.ru). В настоящее время пользователи могут ознакомиться с возможностями САПР Xilinx EDK версии 6.3. В этой версии средств проектирования существенно расширены функции мастера Base System Builder (BSB). Данный инструмент интерактивного формирования большинства компонентов проекта может теперь использоваться для создания систем не только на основе ограниченного числа поддерживаемых инструментальных модулей, но и на основе плат с произвольной конфигурацией, разрабатываемых пользователем. Поэтому в следующей публикации будет представлен процесс проектирования встраиваемых микропроцессорных систем с применением мастера Base System Builder.
Литература
- Зотов В.
MicroBlaze — семейство тридцатидвухразрядных микропроцессорных ядер, реализуемых на основе ПЛИС фирмы Xilinx //
Компоненты и технологии. 2003. № 9. - Зотов В.
Система команд микропроцессорного ядра MicroBlaze // Компоненты и технологии. 2004. № 1-3. - Зотов В.
Embedded Development Kit — система проектирования встраиваемых микропроцессорных систем на основе ПЛИС серий FPGA фирмы Xilinx.
2004. № 3. - Зотов В.
Организация памяти микропроцессорного ядра MicroBlaze //
Компоненты и технологии. 2004. № 5. - Зотов В.
Создание проекта микропроцессорной системы на основе ядра MicroBlaze, реализуемой в ПЛИС семейств FPGA фирмы Xilinx // Компоненты и технологии. 2004. № 3. - Зотов В.
Формирование спецификации аппаратной платформы микропроцессорной системы на основе ядра MicroBlaze, реализуемой в ПЛИС семейств FPGA фирмы Xilinx //Компоненты и технологии. 2004. №№
7–
8. - Зотов В.
Реализация аппаратной платформы микропроцессорной системы, проектируемой на основе ядра MicroBlaze, в ПЛИС семейств FPGA фирмы Xilinx // Компоненты и технологии.
2004. № 9. - Зотов В.
Разработка спецификации программных средств микропроцессорной системы на основе ядра MicroBlaze, реализуемой в ПЛИС семейств FPGA фирмы Xilinx // Компоненты и технологии.
2005. № 1. - Зотов В. Проектирование цифровых устройств на основе ПЛИС фирмы Xilinx в САПР WebPack ISE. М.: Горячая линия-Телеком. 2003.
- Кнышев Д. А., Кузелин М. О. ПЛИС фирмы «Xilinx»: описание структуры основных семейств. М.: Издательский дом «Додека-XXI». 2001.