Перейти к содержанию
    

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

 

Я в соседней ветке уже задавал вопрос по поводу проблемы с прерываниями на Miroblaze. Решить я ее пока так и не могу. Я к сожалению не ПЛИСовед, а программист, которому приходится собирать проект в PlanAhead'e + XPS, потом перегонять в SDK и это дело программить. В данный момент никак не могу заставить Microblaze реагировать на прерывания. Перепробовал разные проекты которые предлагает Xilinx, никакого эффекта. :cranky: 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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

берете 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 которую надо вызвать если что.

 

 

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

 

на все это дело есть и готовый пример. если что пишите

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

берете platform studio из EDK, делаете проц.

Новый проект используя base system builder на основе axi

...

на все это дело есть и готовый пример. если что пишите

 

Спасибо за ответ! В принципе я все именно так и делал, только вместо таймера использовал другую корку и вектора прерываний соответственно использовал от нее. Например был вариант c AXI FIFO Memory Mapped.

Попробую завтра Ваш вариант с таймером, может он заведется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вы писали про план-ахед, но может оговорились, нужна именно платформ студия.

 

Если там все соединить и все галочки поставить, то все настроится само и надо только правильно настроить контроллер и саму структуру.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вы писали про план-ахед, но может оговорились, нужна именно платформ студия.

 

Если там все соединить и все галочки поставить, то все настроится само и надо только правильно настроить контроллер и саму структуру.

 

Я не оговорился, именно PlanAhead. Но он используется в основном как менеджер проекта. Сама схема собирается в XPS как и раньше, просто XPS вызывается из PlanAhead'a. Это такой промежуточный вариант между голым XPS и нынешним Vivado. К слову сказать, после Vivado, XPS это просто разрыв мозга :wacko: . Но Vivado правда тоже сыроват.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробую завтра Ваш вариант с таймером, может он заведется.

 

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

 

Создал в 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:

 

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

 

На всякий случай выкладываю MHS файл. Может собрал че не так. Хотя собирал все wizard.

system.mhs.txt

Люди добрые, дайте пожалуйста рабочий пример с Microblaze и прерыванием. :help:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

надо по шагам.

1. таймер работает? надо на порт повыкидывать значение регистра чтобы убедиться что он тикает.

2. поглядеть вообще калбаки какие - либо идут, екцепшен вызывается?

3. поглядеть разбор в экцепшене.

 

также стоит проверить код ошибки что возвращает ваша функция.

А еще обратите внимания что ваш код выполняется всего 3 раза, вы можете и проглядеть момент когда возникает 3 прерывания... Покажите лог что на порт валится...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

надо по шагам.

1. таймер работает? надо на порт повыкидывать значение регистра чтобы убедиться что он тикает.

2. поглядеть вообще калбаки какие - либо идут, екцепшен вызывается?

3. поглядеть разбор в экцепшене.

 

также стоит проверить код ошибки что возвращает ваша функция.

А еще обратите внимания что ваш код выполняется всего 3 раза, вы можете и проглядеть момент когда возникает 3 прерывания... Покажите лог что на порт валится...

 

Пока посмотрел следующее:

 

1. Почитал регистр Timer 0 Counter Register (TCR0). Видно что таймер тикает.

2. Почитал Timer 0 Control and Status Register (TCSR0). Видно что через некоторое время взводится бит T0INT, что соответствует тому что Interrupt has occurred.

 

Теперь вопрос по вашему совету посмотреть вызывается ли екцепшен и вообще какие либо калбеки. Как это посмотреть?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну либо вывод отладочной информации на порт, либо брекпоинт на функции экцепшена.

XIntc_InterruptHandler - вот эта функция.

 

и еще проверьте состояние дефайна

TESTAPP_GEN - он по идее должен быть вообще не определен, иначе у вас половина инициализации отваливается...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ну либо вывод отладочной информации на порт, либо брекпоинт на функции экцепшена.

XIntc_InterruptHandler - вот эта функция.

 

и еще проверьте состояние дефайна

TESTAPP_GEN - он по идее должен быть вообще не определен, иначе у вас половина инициализации отваливается...

 

Проверил, XIntc_InterruptHandler не вызывается. Так же прочитал ISR регистр Interrupt контроллера microblaze_intc. Там тоже видно, что появляется бит означающий что сработало прерывание.

 

TESTAPP_GEN у меня не определен, с этим все нормально.

 

В общем получается, что прерывание доходит до контроллера прерываний, но Microblaze упорно не хочет этого замечать :05:

 

Пробовал добавлять как некоторые советуют microblaze_enable_interrupts() тоже никакого эффекта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а проводок от контроллера прерываний к микроблайзу есть, это надо в платформ студио поглядеть?

 

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

 

поглядел, правда есть настройки, но в первой закладке экцепшенов все сняты по шинам и прочему

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

 

в SDK если открыть bsp проект, и тыкнуть в *.mss, там в списке всех модулей для каждого есть примеры и описание. Может у вас какие библиотеки другие и надо по другому инициализировать контроллер прерываний. Поглядите пример работы с контроллером прерываний, сравните с тем что у вас.

 

И еще пока не получите результат, для каждого нового тестового проца лучше делать новый проект в новой папке, то есть если вы правили ваш прошлый проц, то иногда ничего не работает из за косяков среды...

 

вот код примера

/* $Id: xintc_low_level_example.c,v 1.1.2.1 2011/05/24 07:09:38 vidhum Exp $ */
/******************************************************************************
*
* © Copyright 2002-2009 Xilinx, Inc. All rights reserved.
*
* This file contains confidential and proprietary information of Xilinx, Inc.
* and is protected under U.S. and international copyright and other
* intellectual property laws.
*
* DISCLAIMER
* This disclaimer is not a license and does not grant any rights to the
* materials distributed herewith. Except as otherwise provided in a valid
* license issued to you by Xilinx, and to the maximum extent permitted by
* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
* and (2) Xilinx shall not be liable (whether in contract or tort, including
* negligence, or under any other theory of liability) for any loss or damage
* of any kind or nature related to, arising under or in connection with these
* materials, including for any direct, or any indirect, special, incidental,
* or consequential loss or damage (including loss of data, profits, goodwill,
* or any type of loss or damage suffered as a result of any action brought by
* a third party) even if such damage or loss was reasonably foreseeable or
* Xilinx had been advised of the possibility of the same.
*
* CRITICAL APPLICATIONS
* Xilinx products are not designed or intended to be fail-safe, or for use in
* any application requiring fail-safe performance, such as life-support or
* safety devices or systems, Class III medical devices, nuclear facilities,
* applications related to the deployment of airbags, or any other applications
* that could lead to death, personal injury, or severe property or
* environmental damage (individually and collectively, "Critical
* Applications"). Customer assumes the sole risk and liability of any use of
* Xilinx products in Critical Applications, subject only to applicable laws
* and regulations governing limitations on product liability.
*
* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
* AT ALL TIMES.
*
******************************************************************************/
/******************************************************************************/
/**
*
* @file xintc_low_level_example.c
*
* This file contains a design example using the low level-0 driver, interface
* of the Interrupt Controller driver.
*
* This example shows the use of the Interrupt Controller both with a PowerPC
* and a MicroBlaze processor.
*
* @note
*
* <pre>
*
* MODIFICATION HISTORY:
*
* Ver   Who  Date	 Changes
* ----- ---- -------- ---------------------------------------------------------
* 1.00c rpm  12/04/03 First release
* 1.00c sv   06/29/05 Minor changes to comply to Doxygen and coding guidelines
* 2.00a ktn  10/20/09 Updated to use HAL Processor APIs and _m is removed from
*		      all the macro names/definitions. Minor changes done as per
*		      coding guidelines.
* </pre>
******************************************************************************/

/***************************** Include Files *********************************/

#include "xparameters.h"
#include "xstatus.h"
#include "xintc_l.h"
#include "xil_exception.h"

/************************** Constant Definitions *****************************/

/*
* The following constants map to the XPAR parameters created in the
* xparameters.h file. They are defined here such that a user can easily
* change all the needed parameters in one place.
*/
#define INTC_BASEADDR		XPAR_INTC_0_BASEADDR
#define INTC_DEVICE_ID		XPAR_INTC_0_DEVICE_ID
#define INTC_DEVICE_INTR_ID	XPAR_INTC_0_UARTLITE_0_VEC_ID
#define INTC_DEVICE_INT_MASK	XPAR_RS232_UART_1_INTERRUPT_MASK


/**************************** Type Definitions *******************************/


/***************** Macros (Inline Functions) Definitions *********************/


/************************** Function Prototypes ******************************/

int IntcLowLevelExample(u32 IntcBaseAddress);

void SetupInterruptSystem();

void DeviceDriverHandler(void *CallbackRef);


/************************** Variable Definitions *****************************/

/*
* Create a shared variable to be used by the main thread of processing and
* the interrupt processing
*/
volatile static int InterruptProcessed = FALSE;

/*****************************************************************************/
/**
*
* This is the main function for the Interrupt Controller Low Level example.
*
* @param	None.
*
* @return	XST_SUCCESS to indicate success, otherwise XST_FAILURE.
*
* @note		None.
*
******************************************************************************/
int main(void)
{
int Status;

/*
 * Run the low level example of Interrupt Controller, specify the Base
 * Address generated in xparameters.h.
 */
Status = IntcLowLevelExample(INTC_BASEADDR);
if (Status != XST_SUCCESS) {
	return XST_FAILURE;
}

return XST_SUCCESS;

}

/*****************************************************************************/
/**
*
* This function is an example of how to use the interrupt controller driver
* component (XIntc) and the hardware device.  This function is designed to
* work without any hardware devices to cause interrupts. It may not return
* if the interrupt controller is not properly connected to the processor in
* either software or hardware.
*
* This function relies on the fact that the interrupt controller hardware
* has come out of the reset state such that it will allow interrupts to be
* simulated by the software.
*
* @param	IntcBaseAddress is Base Address of the the Interrupt Controller
*		Device.
*
* @return	XST_SUCCESS to indicate success, otherwise XST_FAILURE.
*
* @note		None.
*
******************************************************************************/
int IntcLowLevelExample(u32 IntcBaseAddress)
{

/*
 * Connect a device driver handler that will be called when an interrupt
 * for the device occurs, the device driver handler performs the
 * specific interrupt processing for the device.
 */
XIntc_RegisterHandler(IntcBaseAddress, INTC_DEVICE_INTR_ID,
			(XInterruptHandler)DeviceDriverHandler,
			(void *)0);

/*
 * Enable interrupts for all devices that cause interrupts, and enable
 * the INTC master enable bit.
 */
XIntc_EnableIntr(IntcBaseAddress, INTC_DEVICE_INT_MASK);


/*
 * Set the master enable bit. Note that we do not enable hardware
 * interrupts yet since we want to simulate an interrupt from software
 * down below.
 */
XIntc_Out32(IntcBaseAddress + XIN_MER_OFFSET, XIN_INT_MASTER_ENABLE_MASK);

/*
 * This step is processor specific, connect the handler for the
 * interrupt controller to the interrupt source for the processor.
 */
SetupInterruptSystem();

/*
 * Cause (simulate) an interrupt so the handler will be called. This is
 * done by writing a 1 to the interrupt status bit for the device
 * interrupt.
 */
XIntc_Out32(IntcBaseAddress + XIN_ISR_OFFSET, INTC_DEVICE_INT_MASK);

/*
 * Wait for the interrupt to be processed, if the interrupt does not
 * occur this loop will wait forever.
 */
while (1)
{
	/*
	 * If the interrupt occurred which is indicated by the global
	 * variable which is set in the device driver handler, then
	 * stop waiting.
	 */
	if (InterruptProcessed) {
		break;
	}
}


return XST_SUCCESS;

}
/*****************************************************************************/
/**
*
* This function connects the interrupt handler of the interrupt controller to
* the processor. This function is seperate to allow it to be customized for
* each application. Each processor or RTOS may require unique processing to
* connect the interrupt handler.
*
* @param	None.
*
* @return	None.
*
* @note		None.
*
******************************************************************************/
void SetupInterruptSystem()
{
/*
 * Initialize the exception table.
 */
Xil_ExceptionInit();

/*
 * Register the interrupt controller handler with the exception table.
 */
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
		(Xil_ExceptionHandler)XIntc_DeviceInterruptHandler,
		INTC_DEVICE_ID);

/*
 * Enable exceptions.
 */
Xil_ExceptionEnable();

}



/*****************************************************************************/
/**
*
* This function is designed to look like an interrupt handler in a device
* driver. This is typically a 2nd level handler that is called from the
* interrupt controller interrupt handler.  This handler would typically
* perform device specific processing such as reading and writing the registers
* of the device to clear the interrupt condition and pass any data to an
* application using the device driver.
*
* @param	CallbackRef is passed back to the device driver's interrupt
*		handler by the XIntc driver.  It was given to the XIntc driver
*		in the XIntc_Connect() function call. It is typically a pointer
*		to the device driver instance variable if using the Xilinx Level
*		1 device drivers. In this example, we do not care about the
*		callback reference, so we passed it a 0 when connecting the
*		handler to the XIntc driver and we make no use of it here.
*
* @return	None.
*
* @note		None.
*
******************************************************************************/
void DeviceDriverHandler(void *CallbackRef)
{
/*
 * Indicate the interrupt has been processed using a shared variable.
 */
InterruptProcessed = TRUE;

}

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а проводок от контроллера прерываний к микроблайзу есть, это надо в платформ студио поглядеть?

Подключен

поглядел, правда есть настройки, но в первой закладке экцепшенов все сняты по шинам и прочему

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

та же фигня :(

в SDK если открыть bsp проект, и тыкнуть в *.mss, там в списке всех модулей для каждого есть примеры и описание. Может у вас какие библиотеки другие и надо по другому инициализировать контроллер прерываний. Поглядите пример работы с контроллером прерываний, сравните с тем что у вас.

Посмотрел примеры там все так же как я делаю.

И еще пока не получите результат, для каждого нового тестового проца лучше делать новый проект в новой папке, то есть если вы правили ваш прошлый проц, то иногда ничего не работает из за косяков среды...

Да, так и приходится делать, поэтому проектов уже вагон...

 

Попробуй ваш пример, но чую что результат будет тот же.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

главное не отчаиваться.

Я когда с микроблайзом начинал тоже бился как об стену, мне сказали что с ними всегда медленно начинаешь, зато потом быстро едешь. Когда все где надо подоткнешь, так он сразу работать начинает, и не понятно почему не работал до этого...

 

проверьте все коды ошибок возвращаемые функциями! Потому что есть шанс что функциям не понравилась какая-то константа, они не подключили нужные калбеки, и никаких вызовов не будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

главное не отчаиваться.

 

проверьте все коды ошибок возвращаемые функциями! Потому что есть шанс что функциям не понравилась какая-то константа, они не подключили нужные калбеки, и никаких вызовов не будет.

 

Да почему то у меня уже подозрения, что возможно проблема где то у них. Т.к. я пытался исключить свою потенциальную криворукость/невнимательнось используя чисто ихние примеры и визарды. Попробовал для интереса создать визард на шине PLB, так там еще интереснее вышло. В XPS я не могу подключить Interrupt xps_intc к INTERRUPT входу Microblaze, т.к. выход Irq у xps_intc описан в портах и виден в портах. То ли кривые MPD файлы, то ли я чего то не понимаю.

 

Я использую версию EDK 14.7

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да почему то у меня уже подозрения, что возможно проблема где то у них. Т.к. я пытался исключить свою потенциальную криворукость/невнимательнось используя чисто ихние примеры и визарды. Попробовал для интереса создать визард на шине PLB, так там еще интереснее вышло. В XPS я не могу подключить Interrupt xps_intc к INTERRUPT входу Microblaze, т.к. выход Irq у xps_intc описан в портах и виден в портах. То ли кривые MPD файлы, то ли я чего то не понимаю.

 

Я использую версию EDK 14.7

 

Ну что я могу сказать чтобы не сматериться. :maniac: Почти ничего.

 

Решил на удачу поставить предыдущую версию ISE DS 14.6 и проделать все тоже самое. И вуа ля. Все заработало. Обработчик прерывания вызвался 3 раза как положено. Причем заметно, что в XPS проект выглядит несколько иначе по шинам и портам.

Так что всем спасибо за помощь. :beer: В общем индусы "жгут напалмом" :01:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...