Требования
Оборудование: 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
Настройка программной части
- Запускаем Xilinx Platform Studio и открываем проект (system.xmp)
- Из списка файлов проекта открываем файл system.mss и вносим в него
следущие изменения:
- указываем название библиотеки xilkernel
- заполняем таблицу процессов
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.
Настройка аппаратной части
- Создаем netlist. Для этого в пункте меню Tools выбираем Generate Netlist. После выполнения этого действия синтезатор XST создаст netlist, описывающий аппаратную часть системы. В дальнейшем этот список используется для создания файла конфигурации FPGA
- Создаем файл конфигурации FPGA. Существует два способа создания файла
конфигурации:
- при помощи EDK
- при помощи ISE
Для простоты, создадим файл прошивки из 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
На сегодня все. До встречи в следующем упражнении! :-).
Итоговый проект - скачать