Xilinx FPGA Portal

subglobal1 link | subglobal1 link | subglobal1 link | subglobal1 link | subglobal1 link | subglobal1 link | subglobal1 link
subglobal2 link | subglobal2 link | subglobal2 link | subglobal2 link | subglobal2 link | subglobal2 link | subglobal2 link
subglobal3 link | subglobal3 link | subglobal3 link | subglobal3 link | subglobal3 link | subglobal3 link | subglobal3 link
subglobal4 link | subglobal4 link | subglobal4 link | subglobal4 link | subglobal4 link | subglobal4 link | subglobal4 link
subglobal5 link | subglobal5 link | subglobal5 link | subglobal5 link | subglobal5 link | subglobal5 link | subglobal5 link
subglobal6 link | subglobal6 link | subglobal6 link | subglobal6 link | subglobal6 link | subglobal6 link | subglobal6 link
subglobal7 link | subglobal7 link | subglobal7 link | subglobal7 link | subglobal7 link | subglobal7 link | subglobal7 link
subglobal8 link | subglobal8 link | subglobal8 link | subglobal8 link | subglobal8 link | subglobal8 link | subglobal8 link

Упражнение 1

Управление процессами

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

В упражнении мы создадим 3, процесса, которые будут выводит слово "Hello" на экран терминала. Процессы будут управляться средствами планировщика Xilkernel (Xilkernel Sheduler)

Требования

Оборудование: Memec 2VP7 FG456 Rev 3 board, нуль-модемный кабель
Программное обеспечение: ISE 5.2 SP2& EDK 3.2

 

Выполнение работы

Настройка аппаратной части

В данном примере аппаратная часть уже сконфигурирована и включает в себя следущие модули:

  • процессор PowerPC405 (PPC)
  • мост PLB2OBP
  • контроллер BRAM (на шины PLB)
  • контроллер SDRAM (на шине PLB)
  • контроллеры ввода-вывода (на шине OPB)
  • UART Lite (на шине OBP)
  • контроллер JTAG, для отладки PPC
  • память BRAM
  • модуль глобального сброса

Контроллеры сконфигуриваны со следующими адресами:
PLB SDRAM
Base Address - 0x00000000
High Address - 0x01FFFFFF

PLB BRAM
Base Address - 0xFFFF0000
High Address - 0xFFFF3FFF

PLB BRAM
Base Address - 0xFFFFC000
High Address - 0xFFFFFFFF

Настройка программной части

  1. Запускаем Xilinx Platform Studio и открываем проект (system.xmp)
  2. Из списка файлов проекта открываем файл system.mss и вносим в него следущие изменения:
    1. указываем название библиотеки xilkernel
    2. заполняем таблицу процессов

parameter library_name = xilkernel
parameter process_table = ( (0x00f00000, 28) (0x00f10000, 28)(0x00f20000, 29) )

Последней строкой мы назначаем приоритеты процессам. Первые 2 процесса будут выполняться с приоритетом 28, а третий процесс будет выполняться с меньшим проритетом - 29.
Привязка процессов к конкретным адресам осуществляется в компоновочном скрипте, расположенном в <каталог упражнения>/sw_services/xilkernel_v1_00_a/src/linker_script.sh
MEMORY
{
   extmem : ORIGIN = 0x00000000, LENGTH = 16M
   bram1 : ORIGIN = 0xFFFF0000, LENGTH = 16K
   bram2 : ORIGIN = 0xFFFFC000, LENGTH = 16K-4
   boot : ORIGIN = 0xfffffffc, LENGTH = 4
}

3. Генеруем библиотеки. Для этого в меню Tools выбираем пункт Generate Libraries. После этого среда XPS используя makefile system.make, находящийся в корневой папке проекта, запустит libgen, который создаст папку ppc405_i, содержащую необходимые для данного проекта компоненты xilkernel.
4. Компилируем исходный код. Существует несколько способов, которыми можно скомпилировать исходный код для процессора PowerPC. В этом упражнении мы скомпилируем его используя makefile, находящийся в подпапке code. Но прежде посмотрим что делается в makefile. Для этого необходимо запустим Xygwin из меню tools и при помощи команды cd перейдем в каталог code. Для того чтобы посмотреть какие действия будут выполнятся при выполнении makefile можно воспользовать стандартным ключем команды make -n

Здесь, при помощи команды powerpc-eabi-ar мы создаем инициализационный файл xilkernel - crt0.o. Потом, используя gcc, мы компилируем исходные файлы, входящие в упражнение. Для компиляции исходных кодов необходимо запустить make.

Настройка аппаратной части

  1. Создаем netlist. Для этого в пункте меню Tools выбираем Generate Netlist. После выполнения этого действия синтезатор XST создаст netlist, описывающий аппаратную часть системы. В дальнейшем этот список используется для создания файла конфигурации FPGA
  2. Создаем файл конфигурации FPGA. Существует два способа создания файла конфигурации:
    • при помощи EDK
    • при помощи ISE
    Принципиальных различий между этими способами нет. В обоих случаях файл конфигурации создается утилитами, входящими в ISE (ngbuild, map, par и т.д.). Именно по этому для работы EDK необходимо ISE. Главное же отличие состоит в том, что при использовании ISE возможно редактирование VHDL-описания аппаратной платформы.
    Для простоты, создадим файл прошивки из EDK. Для этого в меню Tools выберем пункт Generate Bitsream.
    Отметим, что в случае создания файла прошивки из EDK, ucf-файл описывающий закрепления сигналов, должен называться system.ucf и находится в подпапке проекта - data. Если же файл создается в ISE, то ucf -файл необходимо будет подключить вручную, при этом ограничений на его название не накладываются.

 

Отладка и запуск программной части

Существуют различные способы загрузки исполняемого кода в адресное пространство процессора. В этом упражнении для загрузки исполняемого кода мы воспользуемся отладчиком, а выходные данные будем наблюдать на терминале. Для этого нужно запустить HyperTerminal и настроить COM-порт следующим образом:

Для отладки программ, выполняемых PowerPC используется GNU Debugger. Система отладки состоит из двух основных компонент:

- XMD сервер
- GDB (GNU Debugger)

XMD сервер используется для установления связи с PowerPC через JTAG. Он предоставляет интерфейса для GDB, который в свою очередь используется как средство отладки кода, исполняемого на PowwrPC.

С помощью XMD сервера загрузим исполняемые модули в блочную память процессора. Для этого запустим сервер XMD из меню Tools, подключимся к PowerPC и загрузим в него исполняемые файлы при помощи скрипта dow.scr

Запускаем отладчик GDB, Tools->Software Debugger и в меню File->Open загружаем исполняемый файл ядра ppc405_i/code/xilkernel.elf
Подключаемся к серверу XMD - File->Target Settings и выбираем следующие настройки:

После этого модуль xilkernel.elf будет загружен в отладчик. После нажатия "Run" начанется выполнение программы, до первой точки останова - функции main(). Так как нас интересует работа планировщика задач, мы в меню выберем файл shed.c и ставим breakpoint на 79 строку. В этой строке вызывается метод планировщика задач, при помощи которого организуется выполнение процессов с разными приорететами. Напомним, что приоритеты были заданы в mss-файле проекта.

Посмотрим состояния процессов. Для этого в watch-лист добавим следущие переменные:
- ptable[0].state
- ptable[1].state
- ptable[2].state
- ptable[3].state

Здесь, поле state массива ptable[] определяет текущее состояние процесса. Описание состояний процессов можно найти в файле proccess.h
Новый процесс- 0
Готов - 1
Ожидает - 2
Завершается - 3
Индексом массива является PID-процесса. 0 индекс является индексом процесса IDLE, а остальные индексами соответствующий процессов printf.с

Нажимая кнопку Continue и смотря на то что происходит в HyperTerminal можно увидеть как происходит смена состояний процессов.

Знающие люди спросят: "А почему не выпыполняется процесс 3?" А потому что для процесса 3 мы определили приоритет 29 и так как приоритеты вытесняющие, то процесс 3 не будет запущен до тех пор пока не завершаться процессы с приоритетом 28

На сегодня все. До встречи в следующем упражнении! :-).

Итоговый проект - скачать

 О нас | Privacy Policy | Обратная связь | ©2003 Лаборатория Сетевых Технологий, ФКН, ВГУ