Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 08.11.2012
Сообщений: 5

Механизм обработки прерывания от внешнего источника

08.11.2012, 16:07. Показов 2252. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Заранее прошу прощения за банальный(наверное) вопрос.. Я программирую микроконтроллеры и у нас это все просто и понятно... Появляется изменение на ноге прерывания(событие) - проц прерывает текущую обработку и идет на определенный адрес, где сидит программа обработки прерывания. Потом возвращается к основной программе.. Но тут понадобилось прога под PCI плату входов-выходов.. Драйвер есть, все даже работает(плата сама с прерываниями работает и себе в ресурсы зарезервировала IRQ17)...
Но все крайне медленно..У меня мегагерцовый ПИК быстрее отрабатывает. И я не понимаю механизм...Как я понимаю - создается событие CreateEvent, и вроде бы следует написать SUB по его обработке... Но не получается, а в примерах изготовителя вот такой код (непонятное я там красным выделил) --- Т.е. событие ожидается и обрабатывается в цикле FOR-Next (они ждут прерывание девять раз и закрывают)... Получается следующий алгоритм - цикл крутит свою программу, доходит до оператора, проверяющего прерывание,если было - обрабатывает его.... А до этого это прерывание еще где-то в Виндовс в очереди постояло... Это какое же быстродействие выходит? Проще тогда уж тупо в цикле сразу ногу проверять, не заморачиваясь.. что-то я не так понимаю.. Собственно, в этом мой вопрос - алгоритм организации обработки прерывания от стороннего события?
Код тут не особо важен,да и драйверные команды специфичные.. но вот он..


Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
'/****************************************************************************/
'/* For the proper operation the PIODIO, the following functions must be used.  */
'/*    PIODIO_DriverInit(     <--   initial the driver                        */
'/*    PIODIO_DriverClose(    <--   close the driver                          */
'/****************************************************************************/
 
Option Explicit
Dim wBaseAddr As Long
Dim wIrq As Integer
Dim wSubVendor As Integer, wSubDevice As Integer, wSubAux As Integer
Dim wSlotBus As Integer, wSlotDevice As Integer
Dim wTotalBoards, wInitialCode As Integer
Dim dwIntCount As Long
Dim hEvent As Long
 
 
Private Sub Command1_Click()
    Dim wRetVal As Integer
    Dim wBoard As Integer
    Dim i As Integer
    Dim lRtn As Long
    Dim psource As Integer
    List1.Clear
 
    wBoard = Val(eSelectBoard.Text)
    If wBoard > Val(eTotalBoards.Text) - 1 _
    Or wBoard < 0 Then
        List1.AddItem "Invalid board number, Pls retry!!"
        Exit Sub
    End If
 
    'Get board's Configuration Space
    wRetVal = PIODIO_GetConfigAddressSpace(wBoard, wBaseAddr, wIrq, _
                      wSubVendor, wSubDevice, wSubAux, _
                      wSlotBus, wSlotDevice)
    If wRetVal <> PIODIO_NoError Then
        List1.AddItem "Get Config-Address-Space Error !!"
        Exit Sub
    End If
    
    
     '************************************************************
     ' enable all DI/DO port
     '************************************************************
     List1.AddItem "Enable all DI/DO"
     PIODIO_OutputByte wBaseAddr, 1  ' enable DI/DO
     List1.AddItem "set P2C3 and P5C3 as interrupt source"
     If cbxSource.ListIndex = 1 Then
     dwIntCount = 0
     PIODIO_IntResetCount
     hEvent = CreateEvent(0, False, False, 0)              ' ВОТ СОЗДАЕТСЯ СОбЫТИЕ
     If hEvent = 0 Then
        List1.AddItem "Create Event Error!!"
        Exit Sub
     Else
        List1.AddItem "Create Event OK!!"
     End If
     
     '// Initial Low and Active High
     '// The Interrupt-Source can be:
     '//         0:P2C3  ==>  CN1.Pin26
     '//         1:P5C3  ==>  CN2.Pin9
     psource = Val(cbxSource.ListIndex) 'Selece Source for P2C3/P5C3
     Dim actmode As Integer
     actmode = cbxActMode.ListIndex
     wRetVal = PIODIO_IntInstall(wBoard, hEvent, psource, actmode)
     List1.AddItem "Active Mode:" + Str(actmode)
     If wRetVal <> PIODIO_NoError Then
        List1.AddItem "Interrupt Install Error!!"
     Else
        List1.AddItem "Interrupt Install OK!!"
     End If
 
     [COLOR="Red"][COLOR="red"]
      For i = 0 To 9                                ' ВОТ ЭТОТ САМЫЙ ЦИКЛ
        If opnLow.Value = True Then
        List1.AddItem " "
        Sleep 100
 
        
        wRetVal = PIODIO_IntGetCount(dwIntCount)                 ' ИЗ сЧЕТЧИКА ПРЕРЫВАНИЙ МОЕЙ ПЛАТЫ
        List1.AddItem "Interrupt Counter(0):" + Str(dwIntCount)
        
        Sleep 100
 
        
        wRetVal = PIODIO_IntGetCount(dwIntCount)
        List1.AddItem "Interrupt Counter(1):" + Str(dwIntCount)
        
        Else
        
        List1.AddItem " "
        Sleep 100
       
        wRetVal = PIODIO_IntGetCount(dwIntCount)
        List1.AddItem "Interrupt Counter(1):" + Str(dwIntCount)
        
        Sleep 100
 
        End If
        List1.AddItem "   Wait Event ....."
        DoEvents
        
        lRtn = WaitForSingleObject(hEvent, 10)     ' УЗНАЕМ ЧТО ПРЕРЫВАНИЕ СОСТОЯЛОСЬ
        If lRtn = 0 Then
            List1.AddItem "   Got Event !!"            ' РАДУЕМСЯ
            DoEvents
        End If
        
        
        
        '***** Do some thing in here ****
        '   :
        '   :
        '   :
 
        DoEvents
     
     Next
[/COLOR][/COLOR]
     List1.AddItem " "
 
     '// Revmove the Interrupt
     PIODIO_IntRemove
     List1.AddItem "Stop Interrupt!!"
     CloseHandle hEvent
 
     '// How many times the interrupt occur
     wRetVal = PIODIO_IntGetCount(dwIntCount)
     If wRetVal <> PIODIO_NoError Then
        List1.AddItem "Get Interrupt Counter Error!!"
     Else
        List1.AddItem "Interrupt Counter:" + Str(dwIntCount)
     End If
 
     List1.AddItem "end"
End Sub
 
 
Private Sub Command2_Click()
    End
End Sub
 
Private Sub Form_Load()
    Dim rtn
    
    Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
    
    '********************************************************************
    '* NOTICE: call PIODIO_DriverInit() to initialize the driver.        *
    '* Initial the device driver, and return the board number in the PC *
    '********************************************************************
    wInitialCode = PIODIO_DriverInit()
    Command1.Caption = "Test the PIODIO Card."
    eSelectBoard.Text = 0
    If wInitialCode <> PIODIO_NoError Then
        rtn = MsgBox("Driver initialize error!!!", , "PIODIO Card Error")
        Command1.Enabled = False
        Exit Sub
    End If
    
    If PIODIO_SearchCard(wTotalBoards, PIO_D48) <> PIODIO_NoError Then
        rtn = MsgBox("Search Card Error!!", , "PIODIO Card Error")
        Command1.Enabled = False
    Else
        Command1.Enabled = True
    End If
    
    eTotalBoards.Text = wTotalBoards
    VScroll1.Min = wTotalBoards - 1
    VScroll1.Max = 0
    cbxSource.ListIndex = 0
    opnHigh.Value = True
    cbxActMode.ListIndex = 0
    
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
        PIODIO_DriverClose
End Sub
 
 
 
Private Sub VScroll1_Change()
    eSelectBoard.Text = VScroll1.Value
End Sub
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.11.2012, 16:07
Ответы с готовыми решениями:

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

PIC18F14K22. MPLab. Выбор источника прерывания
Доброе время суток. Имеется микроконтроллер pic18f14k22, нужно настроить прерывания по изменению логического уровня на одном из входов....

Таймер из внешнего источника
Добрый день! Фрилансер сделал мне сайт tingotoma.ru. Но я решил добавить один блок с таймером. (см. в приложении - new block). Таймер...

8
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
08.11.2012, 17:59
Цитата Сообщение от alex6002 Посмотреть сообщение
Но все крайне медленно.
А зачем тогда 4 раза Sleep?
0
0 / 0 / 0
Регистрация: 08.11.2012
Сообщений: 5
08.11.2012, 19:16  [ТС]
Это фрагмент демки от изготовителей платы(Корея)... для задержки визуализации срабатывания прерывания..
И если оператор Sleep не блокирует прерывание( а в таком продвинутом компиляторе это вряд ли), то какая разница сколько их там и на какую задержку ... должно быть - появилось прерывание -прога все бросила, и кинулась его обрабатывать..
У меня в в проекте их, естественно нет и оператор if-then заменен на while в непрерывном цикле...
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
08.11.2012, 20:11
DoEvents - ы тоже не добавляют скорости.

Может лучше по таймеру крутить код, который находится в Command1_Click ?
0
0 / 0 / 0
Регистрация: 08.11.2012
Сообщений: 5
08.11.2012, 21:18  [ТС]
Неправильно спросил, что-ли... Мужики, да неважно какой код в основной программе... понятно и со слипами и с Doevents ..и чего там еще, пусть хоть NOPы сидят или базу данных обсчитывает... Как сделать, чтобы при возникновении прерывания комп это все бросил и пошел прерывание обрабатывать.??..Пусть не реалтайм, но хоть что-то близко.. У меня там на входе убогий оптический энкодер висит (100 имп/об) - это и килогерца нет, а прога уже не успевает... 20мгц микроконтроллер влегкую тянет квадратурник 5000имп/об... а тут 2ггц монстр в нашем понимании дохнет... Не верю. Что-то делаю совсем не так ...
Что-то вот нашел...

Можете прокомментировать мне вот этот фрагмент как для чайника (спер на другом форуме)?:

В классе пишем. (Это где в классе? Там где в форме глобальные переменные объявляю?)

Visual Basic
1
1.   Public Event ТвоеСобытие( )
Visual Basic
1
1.    If ТвояПеременная >= ОпределенноеЗначение Then
Visual Basic
1
2.     RaiseEvent ТвоеСобытие(ТвояПеременная) 'инициируем событие
Visual Basic
1
3.  End If
(это где писать? Если в (General) то разве можно туда можно писать If-then вне процедуры или функции? )

Там где нужно обрабатывать событие: (Это где? в какой-нить процедуре вроде Form_Load ?)
Visual Basic
1
1. Public WithEvents ИмяЭкземпляраКласса As ТвойКласс
Visual Basic
1
1. Set ИмяЭкземпляраКласса = New ТвойКласс
Visual Basic
1
1.  Private Sub ИмяЭкземпляраКласса_ТвоеСобытие(ByVal Значение As Integer)
Visual Basic
1
2. MsgBox Значение
Visual Basic
1
3. End Sub


Синее - мои вопросы..
Поскольку я пишу в форме, то мой класс - это Form1 ( или Forms? - но эт уже вроде коллекция) , а экземпляр класса - это какое я ей имя задал.. Правильно ?
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
08.11.2012, 21:50
Цитата Сообщение от alex6002 Посмотреть сообщение
(Это где в классе? Там где в форме глобальные переменные объявляю?)
Нет, это в отдельном модуле класса
Миниатюры
Механизм обработки прерывания от внешнего источника  
0
0 / 0 / 0
Регистрация: 08.11.2012
Сообщений: 5
10.11.2012, 18:29  [ТС]
НИ фига ничего не выходит... Плюнул на свою плату, сделал крошечный проект.. Нажимаем кнопку, в Text1.text отображается счетчик цикла n1 (второй вложенный цикл у меня - просто задержка). Создал класс, в нем Event... далее в форме основанную на нем SUB.... По идее теперь при счете цикла Event Sob должен отлавливать, когда tt1 станет равным 15 и выбрасывать Msgbox... Но ничего не происходит...



Есть тут гуру по VB6 ?! Подскажите,ради бога, чего не так..!!! Уже достало...Спасибо заранее..
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
10.11.2012, 20:52
Не будет он так сам отслеживать событие.

Прикрепил образец проекта, надеюсь, разберетесь.
Вложения
Тип файла: rar User Defined Class.rar (2.4 Кб, 21 просмотров)
2
0 / 0 / 0
Регистрация: 08.11.2012
Сообщений: 5
12.11.2012, 19:22  [ТС]
Спасибо еще раз. Разобрался. Выкладываю скриншот и переработанный проект - может кому еще пригодится...штука полезная.
Мне все равно медленно и неточно. точнее, все работает, но уже к пределу близко, а мне еще грузить и грузить.. По сути, как я понял, реального прерывания не происходит - оно просто выставляет флаг, и ждет пока некий цикл до него доберется и обработает..Зато теперь понимаю, что такое прерывания в понятии Windows...
Миниатюры
Механизм обработки прерывания от внешнего источника  
Вложения
Тип файла: rar OTL1.rar (2.6 Кб, 17 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.11.2012, 19:22
Помогаю со студенческими работами здесь

Считывание данных из внешнего источника
Доброго времени суток! Тут неожиданно появилась необходимость собрать термокамеру. Теперь необходимо автоматизировать процесс...

питание 5в от внешнего источника disc1
Ув. знатоки вопрос по поводу подключения внешнего блока питания 5в к stm32disc1 при подключении светодиод LD1 моргает, а залитый скетч...

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

Метод JSON.parse из внешнего источника
Можно ли без доп. библиотек получить данные с json файла по ссылке, который находится на другом сайте? И как получит значение...

Импорт данных из внешнего источника, файла
Всем привет! Задумался тут на чем лучше, практичнее и работоспособнее организовывать импорт данных в Нотес-БД. Вот, к примеру, есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru