реклама на сайте
подробности

 
 
> Microblaze и прерывания, Примеры работы с прерываниями
pepelats
сообщение Mar 26 2014, 08:52
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 20-01-10
Из: Томск
Пользователь №: 54 958



Здравствуйте,

Я в соседней ветке уже задавал вопрос по поводу проблемы с прерываниями на Miroblaze. Решить я ее пока так и не могу. Я к сожалению не ПЛИСовед, а программист, которому приходится собирать проект в PlanAhead'e + XPS, потом перегонять в SDK и это дело программить. В данный момент никак не могу заставить Microblaze реагировать на прерывания. Перепробовал разные проекты которые предлагает Xilinx, никакого эффекта. cranky.gif Microblaze мне нужен с AXI шиной. Пробовал использовать как отдельную корку AXI Interrupt Controller, так и какой то Microblaze Interrupt Controller который он добавляет в Wizard'e если указать что необходимо обрабатывать прерывания.

Сам проблему уже решить не могу, а решить ее надо срочно, т.к. встала работа из-за этого. Хотелось бы попросить, может есть у кого простенький проект для Spartan 6, который имеет на борту Microblaze c AXI шиной и контроллер прерываний ну и корка какая нить, которая тупо генерит периодически прерывание. И код на Си ко всему этому который инициализирует контроллер прерываний, и по прерыванию выводит сообщение на экран.
Пробовал делать как описано тут http://www.xilinx.com/support/answers/51138.html, там каждые 15 секунд должно срабатывать прерывание и выводиться сообщение на экран. Ждал минут 20, ничего не случилось. Только надпись:

Код
******************************

* User Peripheral Self Test

******************************


User logic slave module test...

   - slave register write/read passed

   - slave register write/read passed

   - slave register write/read passed

   - slave register write/read passed

Soft reset test...

   - write 0x0000000A to software reset register

   - soft reset passed


Wait for Interrupts....


Буду очень признателен. help.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Mar 26 2014, 09:18
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



не стоит паниковать.

берете platform studio из EDK, делаете проц.
Новый проект используя base system builder на основе axi
отвечаете на вопросы визарда
добавляете в проект таймер на 2 экране, и ставите галочку чтобы тот прерывания использовал

ждете...

получите проц где все соединено.

собираете его и экспортите в SDK, там есть стандартный тест перефирии.
Общий принцип прерываний микроблайза - это вызов экцепшена, общий для всех прерываний, внутри которого вы смотрите что именно произошло.

чтобы все работало вам надо
сделать функцию
Код
void InterruptHandler_Timer(void *CallbackRef, int TmrCtrNumber)
- эта функция будет вызываться когда сработает прерывание

инициализировать контроллер прерываний, зарегистрировав в нем прерывание от таймера

Код
XIntc_Connect(int_controller, XPAR_INTC_0_TMRCTR_0_VEC_ID, XTmrCtr_InterruptHandler, (void *)TimerCounter);

где
XIntc *int_controller - указатель на контроллер прерываний
XPAR_INTC_0_TMRCTR_0_VEC_ID - это идентификатор прерывания таймера, кажется генерится в хедере сам
XTmrCtr_InterruptHandler - стандартная функция обработки прерываний, как раз там идет разбор кто куда
TimerCounter - это указатель на структуру обработки таймера
static XTmrCtr _TimerCounter; //структура настройки Таймера
XTmrCtr *TimerCounter = &(_TimerCounter); //указатель для удобства использования функций


далее запустить контроллер
Код
XIntc_Start(int_controller, XIN_REAL_MODE);



включить прерывание
Код
XIntc_Enable(int_controller, XPAR_INTC_0_TMRCTR_0_VEC_ID);


еще я вот такое дописал

Код
//на момент написания программы это пустая функция, вызовим
    //на случай если в будующем эта функция станет наполнена
    Xil_ExceptionInit();

    //добавим указатель на функцию обработки исключения "прерывание"
    //это уже настроено через libgen, добавим явное определение на всякий случай
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
                    (Xil_ExceptionHandler)XIntc_InterruptHandler,
                    int_controller);

    //Запустим исключение и включим прерывания (глобально)
       Xil_ExceptionEnable();



при настройке самого таймера надо указать ему обработчик его прерываний
Код
XTmrCtr_SetHandler(TimerCounter,(XTmrCtr_Handler)InterruptHandler_Timer,(void *)TimerCounter);




вот и все. Очень много сделано не логично. Смысл действий такой. libgen тот что запускается при создании проекта, делает так что при прирывании будет вызвана главная функция разбора. Которая пробежится по всему и вся, и запустит то что надо.
При этом создается хедер с кучей констант среди которых есть и
XPAR_INTC_0_TMRCTR_0_VEC_ID
функция
XIntc_Connect
добавляет в таблицу указатель на структуру обработчик данного "вектора" то есть в нашем случае на структуру таймера.
а в структуре таймера есть функция callback которую надо вызвать если что.


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

на все это дело есть и готовый пример. если что пишите
Go to the top of the page
 
+Quote Post
pepelats
сообщение Mar 26 2014, 10:32
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 20-01-10
Из: Томск
Пользователь №: 54 958



Цитата(Golikov A. @ Mar 26 2014, 16:18) *
не стоит паниковать.

берете platform studio из EDK, делаете проц.
Новый проект используя base system builder на основе axi
...
на все это дело есть и готовый пример. если что пишите


Спасибо за ответ! В принципе я все именно так и делал, только вместо таймера использовал другую корку и вектора прерываний соответственно использовал от нее. Например был вариант c AXI FIFO Memory Mapped.
Попробую завтра Ваш вариант с таймером, может он заведется.
Go to the top of the page
 
+Quote Post
pepelats
сообщение Mar 27 2014, 00:57
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 20-01-10
Из: Томск
Пользователь №: 54 958



Цитата(pepelats @ Mar 26 2014, 17:32) *
Попробую завтра Ваш вариант с таймером, может он заведется.


Попробовал. Что то совсем не пруха. Тоже не работает. Что я сделал:

Создал в XPS через визард проект с Microblaze и AXI шиной. Указал там что мне нужен axi timer с использованием interrupt. Схема создалась автоматически. Я синтезировал и все сгенерил, после чего сделал export в SDK. Там создал standalone проект типа Hello World, и заменил файл на вот такой:

http://www.cs.indiana.edu/hmg/le/project-h..._intr_example.c

в нем только добавил вывод на экран сообщения в обработчике прерывания
Код
void TimerCounterHandler(void *CallBackRef, u8 TmrCtrNumber)
{
    XTmrCtr *InstancePtr = (XTmrCtr *)CallBackRef;

    print("TimerCounterHandler\n");

чтобы видно было что он срабатывает. После чего все собрал, зашил bitstream и запустил программу. В итоге ничего... Судя по всему обработчик опять не вызывается. cranky.gif

Что еще я мог сделать не так, непонятно.

На всякий случай выкладываю MHS файл. Может собрал че не так. Хотя собирал все wizard.
Прикрепленный файл  system.mhs.txt ( 8.44 килобайт ) Кол-во скачиваний: 258

Люди добрые, дайте пожалуйста рабочий пример с Microblaze и прерыванием. help.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- pepelats   Microblaze и прерывания   Mar 26 2014, 08:52
- - Golikov A.   вы писали про план-ахед, но может оговорились, нуж...   Mar 26 2014, 10:46
|- - pepelats   Цитата(Golikov A. @ Mar 26 2014, 17:46) в...   Mar 26 2014, 10:58
- - Golikov A.   надо по шагам. 1. таймер работает? надо на порт по...   Mar 27 2014, 02:20
|- - pepelats   Цитата(Golikov A. @ Mar 27 2014, 09:20) н...   Mar 27 2014, 05:00
- - Golikov A.   ну либо вывод отладочной информации на порт, либо ...   Mar 27 2014, 05:52
|- - pepelats   Цитата(Golikov A. @ Mar 27 2014, 12:52) н...   Mar 27 2014, 06:06
- - Golikov A.   а проводок от контроллера прерываний к микроблайзу...   Mar 27 2014, 07:37
|- - pepelats   Цитата(Golikov A. @ Mar 27 2014, 14:37) а...   Mar 27 2014, 09:46
- - Golikov A.   главное не отчаиваться. Я когда с микроблайзом на...   Mar 27 2014, 11:10
|- - pepelats   Цитата(Golikov A. @ Mar 27 2014, 18:10) г...   Mar 27 2014, 23:52
|- - pepelats   Цитата(pepelats @ Mar 28 2014, 06:52) Да ...   Mar 28 2014, 00:59
- - Golikov A.   Тут пришлось порыться в настройках SDK проекта, и ...   Apr 10 2014, 06:30
|- - misyachniy   У меня не вызывались прерывания от таймера, решил ...   Apr 17 2014, 19:42
- - pepelats   Здравствуйте, Нашел немного времени поразбираться...   Jun 24 2014, 06:23


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 09:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016