Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
54 / 54 / 9
Регистрация: 24.09.2011
Сообщений: 149

Проблема с прерыванием

17.10.2011, 14:22. Показов 1398. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вобщем необходимо написать программу, в которой бы две функции передавали бы друг другу управление по прерыванию от таймера. Программу написал, есть задание её модифицировать:
Изменить программу так, чтобы использовать не вектор 8 прерывания от таймера, а вектор 1СН «пользовательского прерывания от таймера». При этом не обязательно использовать переустановку вектора на 60Н и вызывать вектор 60Н, но необходимо в процедуре Handler дать команду «завершение прерывания»: Port[$20] := $20;
У меня почему то не работает.
Пишу
C
1
#define INTR 0x1С
, а затем в обработчике пишу
C
1
2
3
4
void interrupt handler(...){
...
asm{ mov al,0x20; out 0x20,al; }
}
исходник выше описанного)

C
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
#include <stdio.h>
#include <setjmp.h>
#include <dos.h>
#include <conio.h>
#include <windows.h>
#include <alloc.h>
 
 
#define INTR 0x8
//#define INTR 0x1C
 
jmp_buf  jmpc1;
jmp_buf  jmpc2;
jmp_buf  jmpmn;
 
unsigned int far *screen;
 
void swt(jmp_buf from,jmp_buf to) {
  if (0 == setjmp(from))
      longjmp(to,1);
}
 
void migaet(char ch, int pos_x)
{
     long k;
     screen[pos_x] = 0x0700 + ch;
     for (k = 0; k < 500000; k++);
 
     screen[pos_x] = 0x0700 + ' ';
     for (k = 0; k < 500000; k++);
}
 
int proc = 0;
int i_T = 0;
const int T=2;
 
void interrupt ( *oldhandler)(...);
 
void interrupt handler(...)
{
     disable();
     oldhandler();
     if(++i_T == T)
     {
    i_T = 0;
    if (proc == 0)
    {
        proc = 1;
        swt(jmpc1,jmpc2);
    }
    else if (proc == 1)
    {
        proc = 0;
        swt(jmpc2,jmpc1);
    }
     }
     enable();
     //outport(0x20,0x20);
     // or
     //asm{ mov al,0x20; out 0x20,al; }
     // for 1C interrupt
}
 
void cor1(void) {
  long k;
  while (1)
     migaet('1',10);
}
 
void cor2(void)
{
  while (1)
  {
 
     migaet('2',15);
 
     if (inport(0x60) == 0x1)
     {
        disable();
        setvect(INTR,oldhandler);
        swt(jmpc2,jmpmn);
     }
 
  }
}
 
void main() {
 
  clrscr();
  printf("\n%d",coreleft());
  screen = (unsigned int*)MK_FP(0xB800,0);
 
  int *stack1 = new int[1000];
  int *stack2 = new int[1000];
 
  struct SREGS segs;
 
  segread(&segs);
 
  jmpc1->j_sp   =  FP_OFF(stack1) + sizeof stack1 - 4;
  jmpc1->j_ss   =  FP_SEG(stack1);
  jmpc1->j_flag =  0x200;       //enable interrupt
  jmpc1->j_cs   =  FP_SEG(cor1);
  jmpc1->j_ip   =  FP_OFF(cor1);
  jmpc1->j_bp   =  jmpc1[0].j_sp;
  jmpc1->j_di   =  0;
  jmpc1->j_es   =  segs.es;
  jmpc1->j_si   =  0;
  jmpc1->j_ds   =  segs.ds;
 
  jmpc2->j_sp   =  FP_OFF(stack2) + sizeof stack2 - 4;
  jmpc2->j_ss   =  FP_SEG(stack2);
  jmpc2->j_flag =  0x200;
  jmpc2->j_cs   =  FP_SEG(cor2);
  jmpc2->j_ip   =  FP_OFF(cor2);
  jmpc2->j_bp   =  jmpc2[0].j_sp;
  jmpc2->j_di   =  0;
  jmpc2->j_es   =  segs.es;
  jmpc2->j_si   =  0;
  jmpc2->j_ds   =  segs.ds;
 
  oldhandler = getvect(INTR);
  disable();
  setvect(INTR,handler);
  swt(jmpmn,jmpc1);
  printf("\n%d",coreleft());
  sleep(1);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.10.2011, 14:22
Ответы с готовыми решениями:

проблема с прерыванием
Всем здравствуйте! Не могу понять в чем проблема. Программа компилируется в AVR Studyo 5. Эмулируется в Proteus 7. Имеется ATMEGA32 с...

Проблема с прерыванием UART
Здравствуйте! Не могу разобраться с прерыванием UART. При приёме данных программа должна переходить на обработку прерывания, вместо этого...

проблема с таймером и прерыванием
Решил подключить к stm32vldiscovery двухразрядный семисегментный индикатор. Включить отдельно каждый разряд несложно. Но вот как сделать...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.10.2011, 14:22
Помогаю со студенческими работами здесь

Проблема с прерыванием по нажатию кнопки.
Помогите пожалуйста! У меня есть две функции с непрерывным циклом внутри. Мне нужно по прерыванию от нажатия кнопки перейти от одной...

Проблема с прерыванием TIM6 на STM32F4DISCAVERY
Лирику пропущу, сразу к проблеме. Написал в кокосе код. В прерывание мк ходит. (мигает светодиодом каждые 50 ms) При этом пустой главный...

Ошибка с прерыванием
Здравствуйте. При вводе в программу (mega 128, AVR Studyo 4): ldi temp,(1&lt;&lt;ISC11)|(1&lt;&lt;ISC10) ;прерывание по нарастающему фронту для...

Непонятки с прерыванием!
Запустил F429 камень, настроил таймер TIM4, разрешил прерывание UIE в таймере, разрешил его в NVIC - №30, разрешил прерывания глобально. ...

Работа с дисплеем и прерыванием
Необходимо задать три колонки символов в правой части экрана и задать их перемещение в левую часть экрана. Получилось создать только три...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru