|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 12:00 pm
DOS, "С", прексъвания и управление на COM порта
| Автор |
Съобщение |
|
CM600
Ранг: Новодошъл
Регистриран на: Пет Окт 21, 2005 9:35 pm Мнения: 152 Местоположение: Варна
|
jony++ Програма, която ползва директен достъп до портовете може да тръгне под ДОС/Win9x но NT базираните Windows
няма да ти позволят такива *своеволности*  . и ще трябва да правиш други магии... Ползвай Win API-тата
CreateFile, WriteFile, ReadFile.... Ако пък толкова искаш да пишеш драйвери за Win-а потърси си Microsoft DDK.
|
| Вто Яну 24, 2006 6:58 pm |
|
 |
|
Bezmozachen
Ранг: Популярен
Регистриран на: Сря Апр 27, 2005 2:47 pm Мнения: 349 Местоположение: Varna
|
Джони, това което правиш за обикновено ПЦ-е ли е или за някво ембедед?
|
| Вто Яну 24, 2006 7:04 pm |
|
 |
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 11:31 pm Мнения: 10088
|
не се засягай, но тук се опитваме да спорим аргументирано. всеки, като каже нещо, може да се наложи да го защити.
онзи линк по-горе е към интеръпт листа на ралф браун. ако там го няма, значи може да се счита че го няма в 99% от случите.
затова ще е интересно да качиш материала за тайните на IBM & M$, да видим на какво се базира тази твоя убеденост в наличието на функция A5.
|
| Вто Яну 24, 2006 7:09 pm |
|
 |
|
jony++
Ранг: Минаващ
Регистриран на: Пон Сеп 19, 2005 12:49 am Мнения: 61
|
За връзка между ПС и ембедед. Ама като гледам какъв спор се разрази направо се чувствам виновен че постнах тази тема само да скарвам хората  . А и съвсем се опърках вече 
|
| Сря Яну 25, 2006 5:29 pm |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Изпревари ме.  Действително, TSR не е задължителен при обработката на прекъсвания. То е един пач, с който се заобикаля липсата на многозадачност на ДОС-а. Това за .EXE и .COM също няма нищо общо с истината. Правил съм обработка на прекъсвания с Турбо Паскал.
Единствения подводен камък е ползването на АПИ-то на системата, когато си в прекъсване. Получаваха се едни много шибани сривове и последващи забивания. Имаше някакъв начин да се работи около този проблем, но вече не си спомням нищо. 
|
| Сря Яну 25, 2006 6:16 pm |
|
 |
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 11:31 pm Мнения: 10088
|
добре...
малко си загубих време да изровя някой стар пример.
 |  |  |  | Код: // тези инклуди ти трябват задължително #include <stdio.h> #include <dos.h> #include <conio.h> #include <stdlib.h>
// прототипи void interrupt (*oldirq3)(...); void interrupt (*oldirq4)(...);
// твоята фунция, обслужваща IRQ3 void interrupt my_int3(...) { disable(); // disable ints
// тука правиш каквото трябва в прекъсването
outportb(0x20,0x20); // reset PIC enable(); // ints ok now }
// твоята фунция, обслужваща IRQ4 void interrupt my_int4(...) { disable(); // disable ints
// тука правиш каквото трябва в прекъсването
outportb(0x20,0x20); // reset PIC enable(); // ints ok now }
// другите твои функции
main ( void ) {
int PIC1mask=0; // define vars and set default values int tmp;
disable(); // disable interrupts PIC1mask = 0x1C; // bits set for IRQ3, IRQ4 and IRQ2(cascade)
// save old vectors and set new ones oldirq3=getvect(0xB); // IRQ 3 setvect(0xB,my_int3);
oldirq4=getvect(0xC); // IRQ 4 setvect(0xC,my_int4);
printf("Old vectors: %Fp, %Fp\n", oldirq3, oldirq4 ); printf("New vectors: %Fp, %Fp\n", getvect(0xB), getvect(0xC) );
tmp=inportb(0x21)&~PIC1mask; outportb(0x21,tmp); // clear bits for IRQ2,3,4 in PIC1
enable(); // re-enable interrupts
// end interrupt enable
// // други неща, които ти трябват // и накрая // main_loop
// тука вече си решил, че трябва да се излиза // turn off our interrupts and reset vectors disable();
// restore old vectors setvect(0x0B,oldirq3); setvect(0x0C,oldirq4);
outportb(0x21,inportb(0x21) | PIC1mask );
printf("\nInterrupt vectors reset to: %Fp %Fp\n", getvect(0xB), getvect(0xC) );
enable();
return 0; }
|  |  |  |  |
дано сега да ти е ясно какво съм писъл по-нагоре
ако имаш още питания, не се стеснявай
това по принцип е за турбо-С 2.х, но трябва да се компилира и на С++4.х
не мога да го пробвам, щото нямам дос от поне 15 години
и още нещо ВАЖНО: ако ще обслужваш прекъсвания >=9, трябва да работиш И с втория PIC (8259 = Programmable Interrupt Controller)
|
| Сря Яну 25, 2006 6:21 pm |
|
 |
|
jony++
Ранг: Минаващ
Регистриран на: Пон Сеп 19, 2005 12:49 am Мнения: 61
|
Мерси ДедоБоре, когато има акод вече си е друго. И извинявай за загубеното време.
|
| Сря Яну 25, 2006 7:48 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|