0 / 0 / 0
Регистрация: 08.11.2012
Сообщений: 5

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

08.11.2012, 16:07. Показов 2216. Ответов 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
18030 / 7733 / 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru