Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: RTX проблемы с прерываниями  (Прочитано 23645 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Vinnich
Интересующийся

ru
Offline Offline

« : 22-04-2011 05:42 » 

Здравствуйте, форумчане)
Может кто работал с RTX?
При работе возникла проблема. Если собрать exe-шник, то все нормально:  хэндл при атаче не нулевой, реакция есть.
Собираю rtss и начинаются чудеса. хэндл при атаче не нулевой (!!!!), а реакции нету.  Код для работы с plx9054 и там и там одинаковый(
Плата точно рабочая.
(тута код)
#if UNDER_RTSS
   if(!RtQueryPciMsiCapability(busNumber[0], slotNumber[0]))
   {
      //сюда и попадаем если rtss
      AttachParams0.AttachVersion = ATTACH_LINE_BASED;             // Line based version
      AttachParams0.LineBased.pThreadAttributes = NULL;            // Security attributes (default)
      AttachParams0.LineBased.StackSize = 0;                       // Use default value
      AttachParams0.LineBased.pRoutine = DeviceIST0;      // IST
      AttachParams0.LineBased.Context = NULL;                  // Context passed to IST and ISR
      AttachParams0.LineBased.Priority = IST_PRIORITY;            // IST priority
      AttachParams0.LineBased.InterfaceType = PCIBus;              // PCI bus
      AttachParams0.LineBased.BusNumber = busNumber[0];            // Bus number
      AttachParams0.LineBased.SlotNumber = slotNumber[0];            // Slot number
      AttachParams0.LineBased.BusInterruptLevel = irqLevel[0];      // Interrupt level
      AttachParams0.LineBased.BusInterruptVector = irqVector[0];      // Interrupt vector
      AttachParams0.LineBased.Shared = bShared;                      // Not shared
      AttachParams0.LineBased.InterruptMode = LevelSensitive;      // Type of interrupt
      AttachParams0.LineBased.MyInterrupt =DeviceISR0;            // ISR
      AttachParams0.LineBased.ProcessorEnableMask = 1 << RtGetCurrentProcessorNumber();   // Rtss Processor Mask
   }
   else
   {
      RtPrintf("4\n");
      AttachParams0.AttachVersion = ATTACH_MESSAGE_BASED;            // Message based version
      AttachParams0.MessageBased.pThreadAttributes = NULL;            // Security attributes (default)
      AttachParams0.MessageBased.StackSize = 0;                  // Use default value
      AttachParams0.MessageBased.pRoutine = DeviceIST0;         // IST
      AttachParams0.MessageBased.Context = NULL;                  // Context passed to IST and ISR
      AttachParams0.MessageBased.Priority = IST_PRIORITY;            // IST priority
      AttachParams0.MessageBased.BusNumber = busNumber[0];            // Bus number
      AttachParams0.MessageBased.SlotNumber = slotNumber[0];            // Slot number
      AttachParams0.MessageBased.MyInterrupt = DeviceISR0;            // ISR
      AttachParams0.MessageBased.ProcessorEnableMask = 1 << RtGetCurrentProcessorNumber();   // Rtss Processor Mask
   }

   // Attach interrupt
   RtPrintf("5\n");
   intHandler[0] = RtAttachInterrupt(&AttachParams0);//не нулевой
//   RtEnableInterrupts();
   RtPrintf("6\n");
#else
             //сюда в exe попадаем
   intHandler[0] = RtAttachInterruptVectorEx (
                  NULL,           // security attributes (default)
                        0,              // stack size (default)
                        DeviceIST0,      // pointer to Interrupt Service Thread (IST).
                        NULL,           // context argument
                        IST_PRIORITY,   // thread priority for the handler routine
                        PCIBus,         // interface type
                        busNumber[0],      // bus number
                        irqLevel[0],       // interrupt level
                        irqVector[0],      // interrupt vector
                        bShared,        // prepared to share the interrupt vector
                        LevelSensitive,   // interrupt Mode
                        DeviceISR0      // pointer to Interrupt Service Routine (ISR)
                  );//хэндл так же н нулевой
#endif
Подскажите, пожалуйста, что не так(
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 22-04-2011 06:51 » 

с RTX дело имел. но прерывания, не использовал, обошелся таймером и простейшим DMA.
у вас - какие прерывания? msi? работаете с реальной железкой?
версия rtx? обновления все стоят? кажется одно из обновлений 8-й версии что то с msi исправляла...хотя могу путать.
расшаренное прерывание или нет? кто из обработчиком на нем еще висит?
каким образом ресурсы устройства у винды забираете, через inf?

у меня больше проблем было когда я начал разбираться какие либы подключать в rtss какие в exe) так и не понял до конца)
« Последнее редактирование: 22-04-2011 08:48 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Vinnich
Интересующийся

ru
Offline Offline

« Ответ #2 : 22-04-2011 09:20 » 

Железка реальная (контроллер обработки информации и через Plx9054 на pci). всю инфу по ресурсам беру с помощью RtGetBusDataByOffset. Она возвращает в структуру адреса всех баров и линию прерывания. Дальше мапом получаю бары и RtAttachInterrupt атачу прерывание. Прерывания точно не msi. Версия rtx 8.1 со вторым сервис паком. По-поводу расшариности прерывания. Пробовал и так и так. Но на нем висит только это устройство, поэтому шарить его думаю не нужно.
Никак не дается(( А черт его знает...
Думал уже по-поводу таймера, но хочется разобраться)))
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 22-04-2011 11:03 » 

тоже получаете по процедуре DeviceSearch() из их примера?

тогда два варианта... либо что то программится не так, что прерывания не возникают, то ли их кто то замаскировал,  то ли они не доходят.
inf для rtx девайса вы устанавливали? через их утилиту RTX Prop вкладка Hardware - "Settings" и контекстной менюшкой Add RTX support.
попробуйте поставить какой нить отладчик ядра и повесить бряк на прерывание.... syser например... правда не знаю как он с RTX уживется...
« Последнее редактирование: 22-04-2011 11:05 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Vinnich
Интересующийся

ru
Offline Offline

« Ответ #4 : 22-04-2011 11:14 » 

inf не устанавливал. Сейчас гляну. А отладчиком уже пробовал. правда Windbg)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 22-04-2011 13:13 » 

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

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Vinnich
Интересующийся

ru
Offline Offline

« Ответ #6 : 22-04-2011 16:29 » 

в общем, результат) inf нужен. Сделал, как Вы сказали.
1) Устройства появились в диспетчере в Windows, как rtx driver. Ресурсы и линия там появилась.2)
 Если смотреть в диспетчере RTX. там есть разделение на совместимые с rtx драйверы и сами rtx. Есть там мой драйвер) Опять же вроде все хорошо.
Захожу в свойства. Статус: Устройство с MSI совместимо. Ниже запрос на ресурсы (линия прерывания). Посмотрел какое в Винде стоит, поставил то же. Для примера пусть будет 18) Вроде все хорошо. Проверил. Хэндл атача теперь нулевой А черт его знает... Ставил брэйки и в ist и isr никакой реакции ( думаю логично, раз хэндл нулевой).
Начал копать дальше. В системе на irq18 висит еще контроллер юсб. Винда не ругается и rtx тоже.  А черт его знает...
Запрос на линию можно сделать 3 видов ( в дисптечере rtx). варианты : а)не определн. б) эксклюзив в) расшаренный rtx. Вот тут у меня возник вопрос. Расшаренный rtx это расшаренный с виндой или расшаренный между несколькими утсройствами rtx?
в общем, попробовал все)))) Сам rtx советовал сделать эксклюзивом. Последовал его совету) эффект - хэндл нулевой. Попробовал все варианты эффект тот же( В Понедельник буду продолжать попытки( Но все больше и больше склоняюсь к таймеру)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 22-04-2011 17:16 » 

хм. еще попробуйте в сторону RtSetBusDataByOffset глянуть...
у меня какие то смутные воспоминания... вот только не помню о чем.
быть может прерывания надо както....включить дополнительно)

но странно то что хендл нулевой.
кстати... а одновременно  AttachParams0.LineBased.pRoutine и  AttachParams0.LineBased.MyInterrupt одновременно - есть смысл?
и насчет BShared - оно откуда? из функции перечисления? соответствует настройкам?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Vinnich
Интересующийся

ru
Offline Offline

« Ответ #8 : 22-04-2011 18:59 » 

хм... что-то где-то я видел  RtSetBusDataByOffset. по-моему в примере каком-то. Но мне показалось, что она делает настройки pci-моста. Посмотрю еще разок.
pRoutine - связывает с потоком обработки прерывания, а MyInterrupt c функцией до потока, которая решает запускать поток или нет. Хотя если shared = false, то все делает поток.  bShared объявлена раньше. в зависимости от сборки она либо false, либо true. Попробую с SetBusData) отпишусь как чего))
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 22-04-2011 21:55 » 

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

да. устройство с MSI совместимо, а что RtQueryPciMsiCapability выдает?
стоит посмотреть баг листы на update RTX, по моему там были ошибки в свое время на msi. и кстати msi только виста и выше поддерживала.
кстати... процессор на два ядра? RTX на монопольное использование включено?

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

попробуйте сравнить все поля
busNumber[0], irqLevel[0], irqVector[0], slotNumber[0]
для случая когда работает в винде и когда работает в rtss.

пока других глупых идей у меня нет)

Добавлено через 3 минуты и 17 секунд:
то есть можно еще в поддержку intervalZero написать.... они кстати даже отвечают) я пробовал)
« Последнее редактирование: 22-04-2011 21:58 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Vinnich
Интересующийся

ru
Offline Offline

« Ответ #10 : 25-04-2011 14:21 » 

Да( RtSetBusDataByOffset  не помог, что и ожидалось(
Устройство MSI не совместимо( RtQueryPciMsiCapability с этим солидарен))
RTX dedicate'ом включен. Ядро правильное подцепляет.
Проверил bus, irqlevel, slotnumber все одинаковое(
последнее до чего добился - это в диспетчере устройств в Windows установленный драйвер не вызывает конфликтов. Прерывание у него есть. Смотришь в RTX в Device в статусе "Device is not MSI or MSI-X capable.  No IRQ resource is available for line-based interrupts." Хотя стоит запрос того же прерывания, что и Windows дает( Танцы с бубном с вариантами запросов ничего не дают(
Отсюда у меня возник вопрос) А если сделать его рабочим exe'шником и работать с ним. Уважаемый, Ochkarik, как Вы думаете будет ли успевать обрабатывать прерывания, которые идут каждые 5 мс? Не будет ли сильные задержки вноситься? Или сразу стоит делать поток в rtss, который будет регистры смотреть каждые 300мкс например?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 25-04-2011 15:09 » new

я честно говоря, не знаю зачем там этот режим компиляции exe. раньше думал, что это чисто для отладки.
подозреваю что нити и процессы при этом становятся чисто виндовыми, с вытекающими последствиями. а синхронизацию они при этом через объекты windows делают.
да и какой тогда смысл в использовании RTX, если вопрос только в прерывании и 5мс? это и обычным драйвером можно было решить.

последнее до чего добился - это в диспетчере устройств в Windows установленный драйвер не вызывает конфликтов. Прерывание у него есть. Смотришь в RTX в Device в статусе "Device is not MSI or MSI-X capable.  No IRQ resource is available for line-based interrupts." Хотя стоит запрос того же прерывания, что и Windows дает( Танцы с бубном с вариантами запросов ничего не дают(
так позвольте... это значит что прерывание не назначено.
еще раз. попробуйте открыть хелп на RTX.
раздел Using RTX Runtime->Managing Devices->Checking IRQ Availability
у вас не MSI, поэтому статус у вас должен стоять "No IRQ resource is available for line-based interrupts." из 3х возможных
Цитата
PCI line-based status messages:
 -  The [shared/unique] IRQ [IRQ_Number] is available for line-based interrupts.
 -  No IRQ resource is available for line-based interrupts.
 -  The device was unable to get the requested line-based IRQ resource, but was able to acquire [shared/unique] IRQ [IRQ_Number].

просто, потому что пока не сконфигурировано. видимо RTX предлагает это сделать в ручную. (кстати возможно имеет смысл в другой слот переткнуть... а вдруг?)
теперь надо сконфигурить согласно пункту 5
Цитата
   5. If the requested IRQ is not available, click Cancel in the RTX PCI/ISA Device Properties dialog box, then continue with the next procedure to view a list of currently used IRQs. Use this list to determine which IRQs are available, then edit the properties for this device to use one of the unused IRQs. See Modifying RTX PCI Device Properties or Modifying RTX ISA Device Properties for details.
раздел как это сделать:
Using RTX Runtime->Managing Devices->Modifying RTX PCI Device Properties

пункт 5-8.
Цитата
5. If you are configuring a non-MSI device or you have an MSI/MSI-X device that will use line-based interrupts, do the following:

a) Enter an unused interrupt value in the IRQ box. For instructions on how to check IRQ availability, click here
(раздел Using RTX Runtime->Managing Devices->Checking IRQ Availability)
Цитата
b) Select a disposition from the Disposition menu:
      -Device Exclusive (default) requests that the IRQ value is exclusive to this device. No other plug and play devices can share this IRQ.
      -Shared by RTX allows the IRQ value to be shared.

Not all PCI slots can be set to an IRQ disposition of Device Exclusive. If you want your interrupt device to have an unshared IRQ, you should try to locate an empty, unshared PCI slot. Some interrupt devices, such as PCI NIC devices, may need an unshared, bus-mastering PCI slot. It may take several tries to figure out the right slot.

6. Click OK to close the RTX Device Properties dialog box and then click Apply or OK in the PnP Device Settings dialog box.

7. Reboot the machine so your IRQ changes take effect.

8. To verify that there is no resource conflict with the requested IRQ, go to the Hardware tab in RTX Properties, double-click the device you just updated, and check to see if it is working properly.

PS попробуйте по шагам эти пункты пройти. описание у них на редкость скупое, поэтому надо все делать дословно и очень внимательно читать каждую букву.
« Последнее редактирование: 25-04-2011 15:22 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines