Разработка программного обеспечения встраиваемых микропроцессорных систем, проектируемых на базе расширяемых вычислительных платформ семейства Zynq‑7000 AP SoC фирмы Xilinx.
Часть 3

PDF версия
Каждая прикладная программа для встраиваемой микропроцессорной системы, реализуемой на основе кристаллов расширяемых вычислительных платформ семейства Zynq‑7000 AP SoC, разрабатывается в виде соответствующего программного проекта (Application project).

Все статьи цикла

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

Такой проект в конечном итоге, как правило, включает следующие компоненты:

  • файлы, содержащие основной исходный текст прикладной программы (source files) на одном из языков программирования — C или C++;
  • заголовочные файлы (header files);
  • файл директив для компоновщика (linker script);
  • исполняемый файл прикладной программы, предназначенный для загрузки непосредственно в кристалл расширяемой вычислительной платформы;

текстовые файлы, предоставляющие информацию о создаваемом программном приложении.

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

Процесс создания нового проекта прикладной программы можно активизировать одним из трех способов: посредством команды основного меню или контекстно-зависимого всплывающего меню, а также с помощью кнопки быстрого доступа. При использовании первого способа следует выделить пункт File главного меню основного окна среды разработки программного обеспечения Xilinx SDK, после чего в одноименном открывшемся всплывающем меню выбрать команду New, при выполнении которой появляется всплывающее меню следующего уровня. В последнем всплывающем меню нужно воспользоваться командой Application Project, как показано на рис. 1.

Создание нового проекта прикладной программы в среде Xilinx SDK с помощью основного меню

Рис. 1. Создание нового проекта прикладной программы в среде Xilinx SDK с помощью основного меню

В случае выбора второго способа для создания нового проекта прикладной программы нужно, прежде всего, открыть контекстно-зависимое всплывающее меню, расположив курсор во встроенной панели Project Explorer основного окна средств Xilinx SDK, и щелкнуть правой кнопкой мыши. В появившемся меню, представленном на рис. 2, нужно выделить строку New, после чего появляется всплывающее меню следующего уровня, в котором надо выбрать команду Project. После выполнения указанной команды открывается диалоговая панель с заголовком New Project, в которой необходимо развернуть раздел Xilinx и выполнить команду Application Project, как демонстрирует рис. 2.

Создание нового проекта прикладной программы в среде Xilinx SDK с помощью контекстно-зависимого всплывающего меню

Рис. 2. Создание нового проекта прикладной программы в среде Xilinx SDK с помощью контекстно-зависимого всплывающего меню

Третий способ запуска процесса формирования нового проекта программного приложения заключается в использовании кнопки быстрого доступа кнопка, совмещенной с кнопкой кнопка, которая представлена на оперативной панели управления основного окна средств Xilinx SDK. При нажатии указанной кнопки сразу же открывается всплывающее меню второго уровня (рис. 1), предоставляющее непосредственный доступ к команде Application Project. В результате выполнения этой команды на экран выводится стартовая диалоговая панель мастера создания нового проекта прикладной программы с подзаголовком Application Project, вид которой показан на рис. 3.

Вид стартовой диалоговой панели мастера создания нового проекта прикладной программы

Рис. 3. Вид стартовой диалоговой панели мастера создания нового проекта прикладной программы

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

После этого целесообразно уточнить информацию о месте расположения файлов создаваемого проекта программного приложения на диске. Информация представлена в поле редактирования значения параметра Location. По умолчанию в этом поле редактирования для записи формируемого проекта прикладной программы предлагается рабочий каталог проекта программного обеспечения, указанный в диалоговой панели с заголовком Workspace Launcher [16]. При открытии стартовой диалоговой панели мастера создания нового проекта программного приложения поле редактирования значения параметра Location находится в заблокированном состоянии, недоступном для редактирования (индикатор состояния параметра Use default location установлен в положение «включено»). Чтобы изменить предлагаемый раздел для записи файлов создаваемого проекта, нужно переключить указанный индикатор состояния в положение «выключено» и воспользоваться клавиатурой или клавишей Browse, которая находится справа от поля редактирования значения параметра Location.

Далее следует проконтролировать и при необходимости изменить основные сведения об аппаратной платформе, для которой формируется проект прикладной программы. Эти сведения отображаются в полях выбора значений соответствующих параметров, расположенных во встроенной панели Target Hardware (рис. 3). В поле выбора значения параметра Hardware Platform представлен идентификатор аппаратной платформы разрабатываемой встраиваемой системы, для которой предназначено создаваемое программное приложение. По умолчанию в этом поле выбора предлагается идентификатор, указанный в поле редактирования значения параметра Project name диалоговой панели New Hardware Project при импортировании информации о конфигурации аппаратной части проектируемой микропроцессорной системы [16]. В выпадающем списке поля выбора значения параметра Hardware Platform кроме идентификатора, предлагаемого по умолчанию, представлены названия предопределенных аппаратных платформ для инструментальных модулей Xilinx Zynq‑7000 SoC ZC702 Evaluation Board, Xilinx Zynq‑7000 SoC ZC706 Evaluation Board и ZedBoard [12, 13, 14].

В поле выбора значения параметра Processor следует уточнить идентификатор процессорного ядра, которое будет выполнять создаваемую прикладную программу. Возможные варианты идентификаторов перечислены в выпадающем списке, открывающемся нажатием кнопки, расположенной в правой части поля выбора значения указанного параметра. Для кристаллов семейства Zynq‑7000 AP SoC этот список предусматривает два варианта — ps7_cortexa9_0 и ps7_cortexa9_1, соответствующих ядрам процессорного блока Processing System (PS) кристалла расширяемой вычислительной платформы. По умолчанию в поле выбора значения параметра Processor предлагается идентификатор ps7_cortexa9_0.

После уточнения сведений об аппаратной платформе, для которой создается проект прикладной программы, нужно указать основную информацию о конфигурации программных средств разрабатываемой встраиваемой системы. Для этой цели следует воспользоваться полями выбора значений соответствующих параметров и кнопками с зависимой фиксацией, которые представлены во встроенной панели Target Software (рис. 3). Прежде всего, рекомендуется определить тип операционной системы, в чьей среде должна функционировать создаваемая прикладная программа. Применяемый тип операционной системы указывается с помощью поля выбора значения параметра OS Platform. Для кристаллов семейства Zynq‑7000 AP SoC выпадающий список возможных значений этого параметра содержит два варианта — standalone и Linux. В случае формирования проекта прикладного программного обеспечения, функционирующего автономно без операционной системы, в поле выбора значения параметра OS Platform предлагается вариант standalone. При создании проекта программного приложения, которое должно выполняться под управлением операционной системы Linux, в выпадающем списке возможных значений этого параметра необходимо указать одноименный вариант.

Затем нужно выбрать язык программирования, который будет использоваться для формирования исходного кода в создаваемом проекте прикладной программы. Выбор языка программирования и соответствующего компилятора осуществляется с помощью группы кнопок с зависимой фиксацией Language (рис. 3). Средства разработки программного обеспечения встраиваемых микропроцессорных систем, реализуемых на базе кристаллов расширяемых вычислительных платформ, предоставляют возможность использования языков программирования высокого уровня C и C++ для подготовки исходного кода прикладных программ. Для выбора требуемого языка программирования и соответствующего компилятора необходимо зафиксировать во включенном положении одноименную кнопку (C или C++), расположив курсор на ее изображении и щелкнув левой кнопкой мыши.

Далее нужно указать пакет поддержки платы Board Support Package, который будет использоваться в создаваемом проекте прикладной программы. Средства Xilinx SDK предоставляют возможность выбора одного из ранее сформированных пакетов BSP, процесс подготовки которых был рассмотрен в [17]. Кроме того, средства разработки программного обеспечения предусматривают автоматическую генерацию нового пакета поддержки платы в процессе создания проекта прикладной программы. При этом следует учитывать, что автоматическое формирование пакета BSP осуществляется со значениями параметров, установленными по умолчанию. Поэтому для разработки прикладных программ, использующих различные библиотеки и драйверы периферийных устройств, которые не указаны по умолчанию, рекомендуется заранее сгенерировать пакет поддержки платы с требуемыми значениями параметров, как было представлено в [16, 17].

Выбор вида пакета поддержки платы (нового или сформированного ранее) для создаваемого проекта прикладной программы осуществляется с помощью группы кнопок с зависимой фиксацией Board Support Package (рис. 3). Для автоматической генерации нового пакета BSP следует зафиксировать во включенном состоянии кнопку Create New. При этом становится доступным поле редактирования, расположенное справа от указанной кнопки, — в нем автоматически появляется название создаваемого пакета поддержки платы. По умолчанию предлагается идентификатор, составленный из названия создаваемого проекта прикладной программы, которое было задано в поле редактирования Project Name, и суффикса _bsp. При необходимости идентификатор для автоматически генерируемого пакета поддержки платы может быть изменен с помощью клавиатуры после активизации поля редактирования Create New. Чтобы использовать в формируемом проекте прикладной программы сгенерированный ранее пакет BSP, необходимо переключить в нажатое положение кнопку Use existing. В результате в доступное состояние переключается поле выбора, находящееся справа от этой кнопки. Выпадающий список этого поля содержит названия всех пакетов поддержки платы, представленные в рабочем каталоге проекта разрабатываемого программного обеспечения, заданном с помощью параметра Workspace при запуске средств Xilinx SDK [16]. Название пакета BSP, указанного в предлагаемом списке, затем автоматически отображается в поле выбора Use existing (рис. 3).

Для завершения процесса создания нового проекта прикладной программы нужно перейти к заключительной диалоговой панели мастера, нажав клавишу Далее (Next), расположенную в нижней части диалоговой панели с подзаголовком Application Project. Открывшаяся диалоговая панель, имеющая подзаголовок Templates (рис. 4), предоставляет возможность выбора шаблона для формируемого проекта прикладной программы.

Вид заключительной диалоговой панели мастера создания нового проекта прикладной программы

Рис. 4. Вид заключительной диалоговой панели мастера создания нового проекта прикладной программы

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

Для прикладных программ, функционирующих автономно без операционной системы и разрабатываемых с использованием языка программирования C, в составе средств Xilinx SDK, предоставляемых совместно с САПР серии Xilinx ISE (Integrated Synthesis Environment/Integrated Software Environment) Design Suite последней версии (14.7), предусмотрено семь шаблонов: Dhrystone, Empty Application, Hello World, lwIP Echo Server, Memory Tests, Peripheral Tests и Zynq FSBL. Большинство из них представляют собой законченные проекты, демонстрирующие примеры прикладных программ, предназначенных для работы с различными аппаратными ресурсами кристаллов расширяемых процессорных платформ. Шаблон Dhrystone является проектом прикладной программы, предназначенной для оценки производительности разрабатываемой микропроцессорной системы. Шаблон Empty Application содержит заготовку проекта программного приложения, в которой отсутствуют модули исходного описания программы. Шаблон Hello World — это проект простейшей прикладной программы, осуществляющей отправку одноименного сообщения через стандартное устройство ввода/вывода. Шаблон lwIP Echo Server предоставляет проект программного приложения, реализующего функции сервера, который возвращает информационные пакеты протокола TCP/IP, передаваемые ему по интерфейсу Ethernet. Шаблон Memory Tests содержит проект прикладной программы, выполняющей тесты различных разделов памяти создаваемой микропроцессорной системы. Шаблон Peripheral Tests является проектом программного приложения, предназначенного для тестирования периферийных устройств процессорного блока. Шаблон Zynq FSBL представляет собой проект начального загрузчика First Stage Boot Loader (FSBL). В более поздних версиях средств разработки программного обеспечения Xilinx SDK, которые поставляются в комплекте с САПР Xilinx Vivado Design Suite, состав предлагаемых шаблонов проектов программных приложений постоянно расширяется.

После выбора требуемого шаблона для формирования нового проекта прикладной программы следует нажать клавишу Готово (Finish), расположенную в нижней части диалоговой панели с подзаголовком Templates. При этом запускается процесс формирования исходных модулей создаваемого проекта, который выполняется в автоматическом режиме. При успешном завершении этого процесса в рабочем каталоге проекта программного обеспечения для разрабатываемой встраиваемой системы появляется папка, чье название совпадает с идентификатором формируемого программного приложения. Папка используется для записи всех исходных модулей проекта прикладной программы. Кроме того, во встроенной панели Project Explorer основного окна средств Xilinx SDK добавляется новый раздел, название которого совпадает с идентификатором создаваемого проекта программного приложения. В качестве примера на рис. 5 представлен вид интегрированной среды разработки программного обеспечения после формирования проекта прикладной программы Tst_application на основе шаблона Empty Application. Для управления процедурами создания и редактирования исходных модулей сформированного проекта нужно развернуть указанный одноименный раздел, как показано на рис. 5.

Структура нового проекта прикладной программы, созданного на основе шаблона Empty Application

Рис. 5. Структура нового проекта прикладной программы, созданного на основе шаблона Empty Application

В состав структуры автоматически сформированного раздела нового проекта программного приложения входят два подраздела — Includes и src. Подраздел Includes содержит список названий каталогов, включающих полный путь доступа к ним, в которых в процессе компиляции разрабатываемой прикладной программы будет осуществляться автоматический поиск необходимых заголовочных файлов. В указанном подразделе перечислены идентификаторы каталогов, содержащих заголовочные файлы, предоставляемые в рамках средств разработки программного обеспечения встраиваемых систем Xilinx SDK для микропроцессорных ядер с архитектурой ARM. Кроме того, в список включен одноименный подкаталог, входящий в состав каталога пакета поддержки платы BSP, используемого в создаваемом проекте прикладной программы.

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

 

Разработка проекта прикладной программы на основе шаблона Empty Application

В случае выбора шаблона Empty Application после завершения работы мастера создания нового проекта прикладной программы в подкаталоге исходных модулей src представлены только два файла — README.txt и lscript.ld. Текстовый файл README.txt содержит краткую информацию о назначении и использовании рассматриваемого шаблона. Для ознакомления с приведенной информацией достаточно расположить курсор в строке с названием файла, представленной во встроенной панели Project Explorer, и дважды щелкнуть левой кнопкой мыши. После этого в основном окне средств Xilinx SDK появляется новая вкладка интегрированного текстового редактора, название которой совпадает с идентификатором указанного файла (рис. 5). На открывшейся вкладке отображается автоматически сформированное содержимое файла README.txt, в дальнейшем его целесообразно заменить краткой информацией об особенностях разрабатываемого проекта прикладной программы.

Файл lscript.ld представляет собой шаблон файла директив компоновщика (linker script) для создаваемого проекта программного приложения, определяющий размещение различных секций исполняемого кода в адресном пространстве памяти разрабатываемой микропроцессорной системы. Чтобы получить сведения о расположении секций программного кода, которое устанавливается с помощью соответствующих директив в этом шаблоне, нужно во встроенной панели Project Explorer указать курсором строку с названием файла lscript.ld и дважды щелкнуть левой кнопкой мыши. При этом в основном окне интегрированной среды разработки программного обеспечения добавляется новая вкладка, первоначальный вид которой показан на рис. 6.

Отображение значений параметров, определяющих размещение секций исполняемого кода в адресном пространстве памяти

Рис. 6. Отображение значений параметров, определяющих размещение секций исполняемого кода в адресном пространстве памяти

Открывшаяся вкладка содержит две страницы с названиями Summary и Source. На странице Summary отображаются значения параметров, определяющих размещение секций исполняемого кода в адресном пространстве памяти, установленные в файле директив (linker script). Страница Source, вид которой демонстрирует рис. 7, предоставляет исходный текст шаблона файла директив компоновщика, сгенерированного мастером создания нового проекта прикладной программы.

Отображение исходного текста шаблона файла директив для компоновщика

Рис. 7. Отображение исходного текста шаблона файла директив для компоновщика

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

/***************************************************************/
/*                                                                                                       */
/* This file is automatically generated by linker script generator    */
/*                                                                                                       */
/* Version: Xilinx EDK 14.7 EDK_P.20131013                               */
/*                                                                                                       */
/* Copyright (c) 2010 Xilinx, Inc. All rights reserved.                      */
/*                                                                                                       */
/* Description : Cortex-A9 Linker Script                                           */
/*                                                                                                       */
/***************************************************************/
_STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x2000;
_HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x2000;
_ABORT_STACK_SIZE = DEFINED(_ABORT_STACK_SIZE) ? _ABORT_STACK_SIZE : 1024;
_SUPERVISOR_STACK_SIZE = DEFINED(_SUPERVISOR_STACK_SIZE) ? _SUPERVISOR_STACK_SIZE : 2048;
_FIQ_STACK_SIZE = DEFINED(_FIQ_STACK_SIZE) ? _FIQ_STACK_SIZE : 1024;
_UNDEF_STACK_SIZE = DEFINED(_UNDEF_STACK_SIZE) ? _UNDEF_STACK_SIZE : 1024;

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

/* Define Memories in the system */
MEMORY
{
ps7_ddr_0_S_AXI_BASEADDR : ORIGIN = 0x00100000, LENGTH = 0x1FF00000
ps7_ram_0_S_AXI_BASEADDR : ORIGIN = 0x00000000, LENGTH = 0x00030000
ps7_ram_1_S_AXI_BASEADDR : ORIGIN = 0xFFFF0000, LENGTH = 0x0000FE00
}

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

/* Specify the default entry point to the program */
ENTRY(_vector_table)

/* Define the sections, and where they are mapped in memory */
SECTIONS
{
.text : {
*(.vectors)
*(.boot)
*(.text)
*(.text.*)
*(.gnu.linkonce.t.*)
*(.plt)
*(.gnu_warning)
*(.gcc_execpt_table)
*(.glue_7)
*(.glue_7t)
*(.vfp11_veneer)
*(.ARM.extab)
*(.gnu.linkonce.armextab.*)
} > ps7_ddr_0_S_AXI_BASEADDR
.init : {
KEEP (*(.init))
} > ps7_ddr_0_S_AXI_BASEADDR
.fini : {
KEEP (*(.fini))
} > ps7_ddr_0_S_AXI_BASEADDR
.rodata : {
__rodata_start = .;

*(.rodata)
*(.rodata.*)
*(.gnu.linkonce.r.*)
__rodata_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.rodata1 : {
__rodata1_start = .;
*(.rodata1)
*(.rodata1.*)
__rodata1_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.sdata2 : {
__sdata2_start = .;
*(.sdata2)
*(.sdata2.*)
*(.gnu.linkonce.s2.*)
__sdata2_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.sbss2 : {
__sbss2_start = .;
*(.sbss2)
*(.sbss2.*)
*(.gnu.linkonce.sb2.*)
__sbss2_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.data : {
__data_start = .;
*(.data)
*(.data.*)
*(.gnu.linkonce.d.*)
*(.jcr)
*(.got)
*(.got.plt)
__data_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.data1 : {
__data1_start = .;
*(.data1)
*(.data1.*)
__data1_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.got : {
*(.got)
} > ps7_ddr_0_S_AXI_BASEADDR
.ctors : {
__CTOR_LIST__ = .;
___CTORS_LIST___ = .;
KEEP (*crtbegin.o(.ctors))
KEEP (*(EXCLUDE_FILE(*crtend.o) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
__CTOR_END__ = .;

___CTORS_END___ = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.dtors : {
__DTOR_LIST__ = .;
___DTORS_LIST___ = .;
KEEP (*crtbegin.o(.dtors))
KEEP (*(EXCLUDE_FILE(*crtend.o) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*(.dtors))
__DTOR_END__ = .;
___DTORS_END___ = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.fixup : {
__fixup_start = .;
*(.fixup)
__fixup_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.eh_frame : {
*(.eh_frame)
} > ps7_ddr_0_S_AXI_BASEADDR
.eh_framehdr : {
__eh_framehdr_start = .;
*(.eh_framehdr)
__eh_framehdr_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.gcc_except_table : {
*(.gcc_except_table)
} > ps7_ddr_0_S_AXI_BASEADDR
.mmu_tbl (ALIGN(16384)) : {
__mmu_tbl_start = .;
*(.mmu_tbl)
__mmu_tbl_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.ARM.exidx : {
__exidx_start = .;
*(.ARM.exidx*)
*(.gnu.linkonce.armexidix.*.*)
__exidx_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.preinit_array : {
__preinit_array_start = .;
KEEP (*(SORT(.preinit_array.*)))
KEEP (*(.preinit_array))
__preinit_array_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.init_array : {
__init_array_start = .;
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
__init_array_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.fini_array : {

__fini_array_start = .;
KEEP (*(SORT(.fini_array.*)))
KEEP (*(.fini_array))
__fini_array_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.ARM.attributes : {
__ARM.attributes_start = .;
*(.ARM.attributes)
__ARM.attributes_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.sdata : {
sdata_start = .;
*(.sdata)
*(.sdata.*)
*(.gnu.linkonce.s.*)
__sdata_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.sbss (NOLOAD) : {
__sbss_start = .;
*(.sbss)
*(.sbss.*)
*(.gnu.linkonce.sb.*)
__sbss_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.tdata : {
__tdata_start = .;
*(.tdata)
*(.tdata.*)
*(.gnu.linkonce.td.*)
__tdata_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.tbss : {
__tbss_start = .;
*(.tbss)
*(.tbss.*)
*(.gnu.linkonce.tb.*)
__tbss_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
.bss (NOLOAD) : {
__bss_start = .;
*(.bss)
*(.bss.*)
*(.gnu.linkonce.b.*)
*(COMMON)
__bss_end = .;
} > ps7_ddr_0_S_AXI_BASEADDR
_SDA_BASE_ = __sdata_start + ((__sbss_end - __sdata_start) / 2 );
_SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start) / 2 );

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

/* Generate Stack and Heap definitions */
.heap (NOLOAD) : {
. = ALIGN(16);
_heap = .;
HeapBase = .;
_heap_start = .;
. += _HEAP_SIZE;
_heap_end = .;
HeapLimit = .;
} > ps7_ddr_0_S_AXI_BASEADDR

.stack (NOLOAD) : {
. = ALIGN(16);
_stack_end = .;
. += _STACK_SIZE;
_stack = .;
__stack = _stack;
. = ALIGN(16);
_irq_stack_end = .;
. += _STACK_SIZE;
__irq_stack = .;
_supervisor_stack_end = .;
. += _SUPERVISOR_STACK_SIZE;
. = ALIGN(16);
__supervisor_stack = .;
_abort_stack_end = .;
. += _ABORT_STACK_SIZE;
. = ALIGN(16);
__abort_stack = .;
_fiq_stack_end = .;
. += _FIQ_STACK_SIZE;
. = ALIGN(16);
__fiq_stack = .;
_undef_stack_end = .;
. += _UNDEF_STACK_SIZE;
. = ALIGN(16);
undef_stack = .;
} > ps7_ddr_0_S_AXI_BASEADDR
_end = .;
}

Представленный текст файла директив для компоновщика может быть скорректирован при необходимости и дополнен в соответствии со структурой и требованиями разрабатываемой прикладной программы. Способы редактирования исходного кода этого файла будут рассмотрены в последующих разделах. Для формирования законченного проекта программного приложения на основе шаблона Empty Application необходимо, прежде всего, создать или импортировать модули, содержащие исходный текст разрабатываемой программы на языке C или C++.

 

Формирование исходных модулей прикладной программы для разрабатываемой микропроцессорной системы

Для создания нового исходного модуля, содержащего основной текст прикладной программы на языке C или C++, рекомендуется в первую очередь во встроенной панели Project Explorer в разделе формируемого проекта программного приложения выделить строку с названием подраздела src. Затем нажать кнопку быстрого доступа кнопка, совмещенную с кнопкой кнопка, или выполнить команду New, которая представлена во всплывающем меню File и контекстно-зависимом всплывающем меню, открываемом щелчком правой кнопки мыши. При этом появляется всплывающее меню следующего уровня, в котором необходимо выбрать строку Source File, после чего на экране появляется диалоговая панель с заголовком New Source File, как показано на рис. 8.

Создание нового исходного модуля прикладной программы

Рис. 8. Создание нового исходного модуля прикладной программы

В открывшейся диалоговой панели в поле редактирования значения параметра Source Folder отображается полное название подкаталога (с указанием пути доступа к нему), выделенного во встроенной панели Project Explorer, в который будет записываться создаваемый файл. Для изменения предлагаемого места расположения создаваемого файла на диске следует воспользоваться клавишей Browse, расположенной справа от указанного поля редактирования. Далее нужно активизировать поле редактирования значения параметра Source File и, используя клавиатуру, задать идентификатор создаваемого файла с соответствующим расширением (c или cpp, в зависимости от выбранного языка программирования). При создании нового исходного модуля прикладной программы целесообразно воспользоваться соответствующим шаблоном. Требуемый шаблон указывается в поле выбора значения параметра Template. В выпадающем списке возможных вариантов этого поля выбора представлены названия различных шаблонов для языков программирования C и C++. Если при создании нового файла не планируется применять предлагаемые шаблоны, то в поле выбора значения параметра Template следует указать вариант None. По умолчанию в этом поле выбора предложен шаблон Default C source template или Default C++ source template в зависимости от языка программирования, указанного при создании разрабатываемого проекта прикладной программы.

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

Вид диалоговой панели Code Templates

Рис. 9. Вид диалоговой панели Code Templates

Открывшаяся диалоговая панель содержит две встроенные панели с названиями Configure generated code and comments и Pattern. Встроенная панель Configure generated code and comments предназначена для выбора интересующего шаблона. При открытии диалоговой панели Code Templates в этой встроенной панели автоматически выделяется строка с названием шаблона, который был указан в поле выбора значения параметра Template (рис. 8). Во встроенной панели Pattern отображается исходный код шаблона, выбранного во встроенной панели Configure generated code and comments. Для изменения содержимого этого шаблона нужно воспользоваться клавишей Edit, расположенной в правой части диалоговой панели Code Templates. После нажатия клавиши на экране появляется диалоговая панель редактирования шаблона, имеющая заголовок
Edit Template, вид которой представлен на рис. 10.

Вид диалоговой панели Edit Template

Рис. 10. Вид диалоговой панели Edit Template

В верхней части этой диалоговой панели находится поле редактирования значения параметра Description. В данном поле отображается краткое описание редактируемого шаблона. Исходный код шаблона представлен во встроенной панели Pattern. Для редактирования краткого описания выбранного шаблона или его содержимого необходимо щелчком левой кнопки мыши активизировать соответственно поле редактирования Description или встроенную панель Pattern, после чего воспользоваться клавиатурой. В процессе редактирования шаблона разработчику предоставляется возможность использовать предопределенные переменные. Чтобы включить такую переменную в состав кода редактируемого шаблона, нужно нажать кнопку Insert Variables, которая находится в нижней части диалоговой панели Edit Template (рис. 10). После нажатия кнопки на экране появляются две всплывающие панели, вид которых показан на рис. 11.

Включение в текст шаблона предопределенных переменных

Рис. 11. Включение в текст шаблона предопределенных переменных

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

Диалоговая панель с заголовком Code Templates позволяет не только корректировать выбранный шаблон файла исходного описания прикладной программы, но и создавать новые. Чтобы сформировать новый шаблон файла, нужно нажать клавишу New, расположенную в правой части указанной диалоговой панели (рис. 9). После этого появляется диалоговая панель с заголовком New Template, вид которой демонстрирует рис. 12.

Создание нового шаблона файла исходного описания прикладной программы

Рис. 12. Создание нового шаблона файла исходного описания прикладной программы

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

Выбрав подходящий шаблон для создаваемого исходного модуля прикладной программы, нужно нажать клавишу «Готово» (Finish), расположенную в нижней части диалоговой панели New Source File (рис. 8). После закрытия этой диалоговой панели в указанном каталоге раздела формируемого проекта прикладной программы, представленном во встроенной панели Project Explorer, появляется идентификатор созданного файла, а также добавляется новая вкладка встроенного текстового редактора интегрированной среды разработки программного обеспечения, название которой совпадает с указанным идентификатором (рис. 13).

Отображение содержимого файла исходного описания программы, сгенерированного с помощью выбранного шаблона

Рис. 13. Отображение содержимого файла исходного описания программы, сгенерированного с помощью выбранного шаблона

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

 

Создание заголовочных файлов для разрабатываемой прикладной программы

Кроме исходных файлов, включающих основной код разрабатываемой программы, в составе проекта программного приложения имеются заголовочные файлы. Они, как правило, содержат выражения декларации используемых переменных, констант, функций и классов. Процесс создания нового заголовочного файла целесообразно начинать с выделения во встроенной панели Project Explorer названия соответствующего подраздела, в состав которого он должен быть включен. В большинстве случаев для этого выбирают подраздел src, представленный в составе раздела формируемого проекта программного приложения. Затем нужно воспользоваться командой New из всплывающего меню File или контекстно-зависимого всплывающего меню, открываемого щелчком правой кнопки мыши, или же кнопкой быстрого доступа кнопка, совмещенной с кнопкой кнопка. В открывающемся всплывающем меню следующего уровня нужно выбрать команду Header File, в результате выполнения которой на экран выводится диалоговая панель с названием New Header File, как демонстрирует рис. 14.

Создание нового заголовочного файла для прикладной программы

Рис. 14. Создание нового заголовочного файла для прикладной программы

В этой диалоговой панели в поле редактирования значения параметра Header File нужно указать идентификатор нового заголовочного файла с расширением .h, а в поле выбора значения параметра Template — соответствующий шаблон. Следует обратить внимание на то, что в выпадающем списке возможных значений поля выбора Template представлена другая группа шаблонов (рис. 14). По умолчанию в поле выбора предлагается вариант Default C header template или Default C++ header template в зависимости от языка программирования, используемого в разрабатываемом проекте программного приложения.

При необходимости шаблоны могут быть отредактированы таким же образом, как было рассмотрено выше. Процесс создания нового заголовочного файла завершается нажатием клавиши «Готово» (Finish), находящейся в нижней части диалоговой панели New Header File, после чего его идентификатор появляется в выбранном подразделе во встроенной панели Project Explorer и автоматически открывается одноименная вкладка интегрированного текстового редактора (рис. 15).

Отображение содержимого заголовочного файла, сгенерированного с помощью выбранного шаблона

Рис. 15. Отображение содержимого заголовочного файла, сгенерированного с помощью выбранного шаблона

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

Литература
  1. Зотов В. Расширение семейства программируемых систем на кристалле Zynq‑7000 AP SoC // Компоненты и технологии. № 12. 2014. № 1.
  2. Zynq‑7000 All Programmable SoC Overview. Advance Product Specification. — Xilinx, 2013.
  3. Zynq‑7000 All Programmable SoC (XC7Z010, XC7Z015, and XC7Z020): DC and AC Switching Characteristics. — Xilinx, 2013.
  4. Zynq‑7000 All Programmable SoC (XC7Z030, XC7Z045, and XC7Z100): DC and AC Switching Characteristics. — Xilinx, 2013.
  5. Zynq‑7000 All Programmable SoC Technical Reference Manual. — Xilinx, 2013.
  6. Zynq‑7000 All Programmable SoC: Concepts, Tools, and Techniques (CTT) A Hands-On Guide to Effective Embedded System Design. — Xilinx, 2013.
  7. Zynq‑7000 All Programmable SoC Software Developers Guide. — Xilinx, 2013.
  8. Zynq‑7000 All Programmable SoC PCB Design and Pin Planning Guide. — Xilinx, 2013.
  9. 7 Series FPGAs and Zynq‑7000 All Programmable SoC XADC Dual 12‑Bit 1 MSPS Analog-to-Digital Converter User Guide. — Xilinx, 2012.
  10. Зотов В. Средства автоматизированного проектирования и этапы разработки встраиваемых микропроцессорных систем на базе расширяемых процессорных платформ семейства Zynq‑7000 AP SoC // Компоненты и технологии. 2014. № 2–3.
  11. Зотов В. Проектирование встраиваемых микропроцессорных систем на базе расширяемых процессорных платформ семейства Zynq‑7000 AP SoC в САПР Xilinx ISE Design Suite // Компоненты и технологии. 2014. № 4–12. 2015. № 1.
  12. Зотов В. Аппаратные средства разработки и отладки встраиваемых микропроцессорных систем, проектируемых на основе расширяемых вычислительных платформ фирмы Xilinx семейства Zynq‑7000 AP SoC // Компоненты и технологии. 2013. № 1.
  13. Зотов В. ZedBoard — эффективный инструмент разработки и отладки встраиваемых микропроцессорных систем, проектируемых на основе расширяемых вычислительных платформ фирмы Xilinx семейства Zynq‑7000 AP SoC // Компоненты и технологии. 2013. № 6.
  14. Зотов В. MicroZed — семейство унифицированных модулей для отладки и реализации встраиваемых микропроцессорных систем, проектируемых на основе платформ фирмы Xilinx серии Zynq‑7000 AP SoC // Компоненты и технологии. 2013. № 11.
  15. Embedded System Tools Reference Manual. — Xilinx, 2013.
  16. Зотов В. Разработка программного обеспечения встраиваемых микропроцессорных систем, проектируемых на базе расширяемых вычислительных платформ семейства Zynq‑7000 AP SoC фирмы Xilinx. Часть 1 // Компоненты и технологии. 2015. № 2.
  17. Зотов В. Разработка программного обеспечения встраиваемых микропроцессорных систем, проектируемых на базе расширяемых вычислительных платформ семейства Zynq‑7000 AP SoC фирмы Xilinx. Часть 2 // Компоненты и технологии. 2015. № 3.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *