Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Microblaze и прерывания
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
pepelats
Здравствуйте,

Я в соседней ветке уже задавал вопрос по поводу проблемы с прерываниями на 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
Golikov A.
не стоит паниковать.

берете 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
Цитата(Golikov A. @ Mar 26 2014, 16:18) *
не стоит паниковать.

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


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

Если там все соединить и все галочки поставить, то все настроится само и надо только правильно настроить контроллер и саму структуру.
pepelats
Цитата(Golikov A. @ Mar 26 2014, 17:46) *
вы писали про план-ахед, но может оговорились, нужна именно платформ студия.

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


Я не оговорился, именно PlanAhead. Но он используется в основном как менеджер проекта. Сама схема собирается в XPS как и раньше, просто XPS вызывается из PlanAhead'a. Это такой промежуточный вариант между голым XPS и нынешним Vivado. К слову сказать, после Vivado, XPS это просто разрыв мозга wacko.gif . Но Vivado правда тоже сыроват.
pepelats
Цитата(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.
Нажмите для просмотра прикрепленного файла
Люди добрые, дайте пожалуйста рабочий пример с Microblaze и прерыванием. help.gif
Golikov A.
надо по шагам.
1. таймер работает? надо на порт повыкидывать значение регистра чтобы убедиться что он тикает.
2. поглядеть вообще калбаки какие - либо идут, екцепшен вызывается?
3. поглядеть разбор в экцепшене.

также стоит проверить код ошибки что возвращает ваша функция.
А еще обратите внимания что ваш код выполняется всего 3 раза, вы можете и проглядеть момент когда возникает 3 прерывания... Покажите лог что на порт валится...
pepelats
Цитата(Golikov A. @ Mar 27 2014, 09:20) *
надо по шагам.
1. таймер работает? надо на порт повыкидывать значение регистра чтобы убедиться что он тикает.
2. поглядеть вообще калбаки какие - либо идут, екцепшен вызывается?
3. поглядеть разбор в экцепшене.

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


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

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

Теперь вопрос по вашему совету посмотреть вызывается ли екцепшен и вообще какие либо калбеки. Как это посмотреть?
Golikov A.
ну либо вывод отладочной информации на порт, либо брекпоинт на функции экцепшена.
XIntc_InterruptHandler - вот эта функция.

и еще проверьте состояние дефайна
TESTAPP_GEN - он по идее должен быть вообще не определен, иначе у вас половина инициализации отваливается...
pepelats
Цитата(Golikov A. @ Mar 27 2014, 12:52) *
ну либо вывод отладочной информации на порт, либо брекпоинт на функции экцепшена.
XIntc_InterruptHandler - вот эта функция.

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


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

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

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

Пробовал добавлять как некоторые советуют microblaze_enable_interrupts() тоже никакого эффекта.
Golikov A.
а проводок от контроллера прерываний к микроблайзу есть, это надо в платформ студио поглядеть?

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

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

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

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

вот код примера
CODE
/* $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
Цитата(Golikov A. @ Mar 27 2014, 14:37) *
а проводок от контроллера прерываний к микроблайзу есть, это надо в платформ студио поглядеть?

Подключен
Цитата(Golikov A. @ Mar 27 2014, 14:37) *
поглядел, правда есть настройки, но в первой закладке экцепшенов все сняты по шинам и прочему
а в закладке прерывания и ресет, в моем микроблайзе вообще ничего менять нельзя...

та же фигня sad.gif
Цитата(Golikov A. @ Mar 27 2014, 14:37) *
в SDK если открыть bsp проект, и тыкнуть в *.mss, там в списке всех модулей для каждого есть примеры и описание. Может у вас какие библиотеки другие и надо по другому инициализировать контроллер прерываний. Поглядите пример работы с контроллером прерываний, сравните с тем что у вас.

Посмотрел примеры там все так же как я делаю.
Цитата(Golikov A. @ Mar 27 2014, 14:37) *
И еще пока не получите результат, для каждого нового тестового проца лучше делать новый проект в новой папке, то есть если вы правили ваш прошлый проц, то иногда ничего не работает из за косяков среды...

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

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

проверьте все коды ошибок возвращаемые функциями! Потому что есть шанс что функциям не понравилась какая-то константа, они не подключили нужные калбеки, и никаких вызовов не будет.
pepelats
Цитата(Golikov A. @ Mar 27 2014, 18:10) *
главное не отчаиваться.

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


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

Я использую версию EDK 14.7
pepelats
Цитата(pepelats @ Mar 28 2014, 06:52) *
Да почему то у меня уже подозрения, что возможно проблема где то у них. Т.к. я пытался исключить свою потенциальную криворукость/невнимательнось используя чисто ихние примеры и визарды. Попробовал для интереса создать визард на шине PLB, так там еще интереснее вышло. В XPS я не могу подключить Interrupt xps_intc к INTERRUPT входу Microblaze, т.к. выход Irq у xps_intc описан в портах и виден в портах. То ли кривые MPD файлы, то ли я чего то не понимаю.

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


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

Решил на удачу поставить предыдущую версию ISE DS 14.6 и проделать все тоже самое. И вуа ля. Все заработало. Обработчик прерывания вызвался 3 раза как положено. Причем заметно, что в XPS проект выглядит несколько иначе по шинам и портам.
Так что всем спасибо за помощь. beer.gif В общем индусы "жгут напалмом" 01.gif
Golikov A.
Тут пришлось порыться в настройках SDK проекта, и нашел вот что. Когда модифицируешь настройки bsp проекта, для проца standalone с lwip, standalone раскрывается как список, внутри которого микроблайз, потому на саму надпись standalone по привычке не тыкаешь, однако там тоже есть настройки. Там выбирается ввод-вывод, а также там можно включить - выключить прерывания. Я так понимаю, что с этим пунктиком тоже может быть конфликт, чтобы все было хорошо через внешний модуль обработки прерываний, здесь они должны быть выключены, а если включены, то надо сделать какие-то дополнительные телодвижения в обработчике, как я понимаю...

может разница между 14.6 - 14.7 как раз в значении данного пункта по умолчанию?
misyachniy
У меня не вызывались прерывания от таймера, решил так
http://electronix.ru/forum/index.php?showt...p;hl=misyachniy
pepelats
Здравствуйте,

Нашел немного времени поразбираться с проблемой прерываний. Все оказалось не так как казалось cranky.gif

Сами по себе прерывания работают, просто я привык запускать программу в режиме Debug, т.е. через меню Debug As..., при этом в самом обработчике прерываний делал вывод на экран. Раньше все работало. В версии 14.7 они что то сломали и на экран, в момент когда должно сработать прерывание, ничего не выводится. Может конечно при этом прерывание и не срабатывает (не стал заморачиваться с проверкой на какой нить GPIO). Но если приложение запустить в режиме Run As..., то все становится нормально и на экран выводится сообщение из обработчика. Пробовал и на Linux машине и на Windows. Результат одинаковый. Так что будьте внимательны. smile3046.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.