pepelats 0 26 марта, 2014 Опубликовано 26 марта, 2014 · Жалоба Здравствуйте, Я в соседней ветке уже задавал вопрос по поводу проблемы с прерываниями на 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.... Буду очень признателен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 26 марта, 2014 Опубликовано 26 марта, 2014 · Жалоба не стоит паниковать. берете 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 которую надо вызвать если что. когда происходит прерывание, произойдет экцепшен проца, который позовет главную функцию, которая найдет структуру обработчик, и позовет из нее функцию обработчик уже того что вам надо.... вот на все это дело есть и готовый пример. если что пишите Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pepelats 0 26 марта, 2014 Опубликовано 26 марта, 2014 · Жалоба не стоит паниковать. берете platform studio из EDK, делаете проц. Новый проект используя base system builder на основе axi ... на все это дело есть и готовый пример. если что пишите Спасибо за ответ! В принципе я все именно так и делал, только вместо таймера использовал другую корку и вектора прерываний соответственно использовал от нее. Например был вариант c AXI FIFO Memory Mapped. Попробую завтра Ваш вариант с таймером, может он заведется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 26 марта, 2014 Опубликовано 26 марта, 2014 · Жалоба вы писали про план-ахед, но может оговорились, нужна именно платформ студия. Если там все соединить и все галочки поставить, то все настроится само и надо только правильно настроить контроллер и саму структуру. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pepelats 0 26 марта, 2014 Опубликовано 26 марта, 2014 · Жалоба вы писали про план-ахед, но может оговорились, нужна именно платформ студия. Если там все соединить и все галочки поставить, то все настроится само и надо только правильно настроить контроллер и саму структуру. Я не оговорился, именно PlanAhead. Но он используется в основном как менеджер проекта. Сама схема собирается в XPS как и раньше, просто XPS вызывается из PlanAhead'a. Это такой промежуточный вариант между голым XPS и нынешним Vivado. К слову сказать, после Vivado, XPS это просто разрыв мозга . Но Vivado правда тоже сыроват. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pepelats 0 27 марта, 2014 Опубликовано 27 марта, 2014 · Жалоба Попробую завтра Ваш вариант с таймером, может он заведется. Попробовал. Что то совсем не пруха. Тоже не работает. Что я сделал: Создал в 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 и прерыванием. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 27 марта, 2014 Опубликовано 27 марта, 2014 · Жалоба надо по шагам. 1. таймер работает? надо на порт повыкидывать значение регистра чтобы убедиться что он тикает. 2. поглядеть вообще калбаки какие - либо идут, екцепшен вызывается? 3. поглядеть разбор в экцепшене. также стоит проверить код ошибки что возвращает ваша функция. А еще обратите внимания что ваш код выполняется всего 3 раза, вы можете и проглядеть момент когда возникает 3 прерывания... Покажите лог что на порт валится... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pepelats 0 27 марта, 2014 Опубликовано 27 марта, 2014 · Жалоба надо по шагам. 1. таймер работает? надо на порт повыкидывать значение регистра чтобы убедиться что он тикает. 2. поглядеть вообще калбаки какие - либо идут, екцепшен вызывается? 3. поглядеть разбор в экцепшене. также стоит проверить код ошибки что возвращает ваша функция. А еще обратите внимания что ваш код выполняется всего 3 раза, вы можете и проглядеть момент когда возникает 3 прерывания... Покажите лог что на порт валится... Пока посмотрел следующее: 1. Почитал регистр Timer 0 Counter Register (TCR0). Видно что таймер тикает. 2. Почитал Timer 0 Control and Status Register (TCSR0). Видно что через некоторое время взводится бит T0INT, что соответствует тому что Interrupt has occurred. Теперь вопрос по вашему совету посмотреть вызывается ли екцепшен и вообще какие либо калбеки. Как это посмотреть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 27 марта, 2014 Опубликовано 27 марта, 2014 · Жалоба ну либо вывод отладочной информации на порт, либо брекпоинт на функции экцепшена. XIntc_InterruptHandler - вот эта функция. и еще проверьте состояние дефайна TESTAPP_GEN - он по идее должен быть вообще не определен, иначе у вас половина инициализации отваливается... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pepelats 0 27 марта, 2014 Опубликовано 27 марта, 2014 · Жалоба ну либо вывод отладочной информации на порт, либо брекпоинт на функции экцепшена. XIntc_InterruptHandler - вот эта функция. и еще проверьте состояние дефайна TESTAPP_GEN - он по идее должен быть вообще не определен, иначе у вас половина инициализации отваливается... Проверил, XIntc_InterruptHandler не вызывается. Так же прочитал ISR регистр Interrupt контроллера microblaze_intc. Там тоже видно, что появляется бит означающий что сработало прерывание. TESTAPP_GEN у меня не определен, с этим все нормально. В общем получается, что прерывание доходит до контроллера прерываний, но Microblaze упорно не хочет этого замечать :05: Пробовал добавлять как некоторые советуют microblaze_enable_interrupts() тоже никакого эффекта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 27 марта, 2014 Опубликовано 27 марта, 2014 · Жалоба а проводок от контроллера прерываний к микроблайзу есть, это надо в платформ студио поглядеть? и сейчас у меня начинают в памяти всплывать какие-то смутные познания, что у микроблайза можно было разрешить или запретить обработку прерываний в целом, в платформ студии, во время настройки... сейчас попробую поискать, может вспомню... поглядел, правда есть настройки, но в первой закладке экцепшенов все сняты по шинам и прочему а в закладке прерывания и ресет, в моем микроблайзе вообще ничего менять нельзя... в 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; } он отличается от того как у меня написано, и функции другие вызываются... попробуйте такой вариант, поправьте под ваш таймер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pepelats 0 27 марта, 2014 Опубликовано 27 марта, 2014 · Жалоба а проводок от контроллера прерываний к микроблайзу есть, это надо в платформ студио поглядеть? Подключен поглядел, правда есть настройки, но в первой закладке экцепшенов все сняты по шинам и прочему а в закладке прерывания и ресет, в моем микроблайзе вообще ничего менять нельзя... та же фигня :( в SDK если открыть bsp проект, и тыкнуть в *.mss, там в списке всех модулей для каждого есть примеры и описание. Может у вас какие библиотеки другие и надо по другому инициализировать контроллер прерываний. Поглядите пример работы с контроллером прерываний, сравните с тем что у вас. Посмотрел примеры там все так же как я делаю. И еще пока не получите результат, для каждого нового тестового проца лучше делать новый проект в новой папке, то есть если вы правили ваш прошлый проц, то иногда ничего не работает из за косяков среды... Да, так и приходится делать, поэтому проектов уже вагон... Попробуй ваш пример, но чую что результат будет тот же. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 27 марта, 2014 Опубликовано 27 марта, 2014 · Жалоба главное не отчаиваться. Я когда с микроблайзом начинал тоже бился как об стену, мне сказали что с ними всегда медленно начинаешь, зато потом быстро едешь. Когда все где надо подоткнешь, так он сразу работать начинает, и не понятно почему не работал до этого... проверьте все коды ошибок возвращаемые функциями! Потому что есть шанс что функциям не понравилась какая-то константа, они не подключили нужные калбеки, и никаких вызовов не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pepelats 0 27 марта, 2014 Опубликовано 27 марта, 2014 · Жалоба главное не отчаиваться. проверьте все коды ошибок возвращаемые функциями! Потому что есть шанс что функциям не понравилась какая-то константа, они не подключили нужные калбеки, и никаких вызовов не будет. Да почему то у меня уже подозрения, что возможно проблема где то у них. Т.к. я пытался исключить свою потенциальную криворукость/невнимательнось используя чисто ихние примеры и визарды. Попробовал для интереса создать визард на шине PLB, так там еще интереснее вышло. В XPS я не могу подключить Interrupt xps_intc к INTERRUPT входу Microblaze, т.к. выход Irq у xps_intc описан в портах и виден в портах. То ли кривые MPD файлы, то ли я чего то не понимаю. Я использую версию EDK 14.7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pepelats 0 28 марта, 2014 Опубликовано 28 марта, 2014 · Жалоба Да почему то у меня уже подозрения, что возможно проблема где то у них. Т.к. я пытался исключить свою потенциальную криворукость/невнимательнось используя чисто ихние примеры и визарды. Попробовал для интереса создать визард на шине PLB, так там еще интереснее вышло. В XPS я не могу подключить Interrupt xps_intc к INTERRUPT входу Microblaze, т.к. выход Irq у xps_intc описан в портах и виден в портах. То ли кривые MPD файлы, то ли я чего то не понимаю. Я использую версию EDK 14.7 Ну что я могу сказать чтобы не сматериться. :maniac: Почти ничего. Решил на удачу поставить предыдущую версию ISE DS 14.6 и проделать все тоже самое. И вуа ля. Все заработало. Обработчик прерывания вызвался 3 раза как положено. Причем заметно, что в XPS проект выглядит несколько иначе по шинам и портам. Так что всем спасибо за помощь. :beer: В общем индусы "жгут напалмом" :01: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться