Отговори на тема  [ 22 мнения ]  Отиди на страница 1, 2  Следваща
DOS, "С", прексъвания и управление на COM порта 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 19, 2005 12:49 am
Мнения: 61
Мнение DOS, "С", прексъвания и управление на COM порта
Здравейте,
да ви се намира сорс на програмка писана на "С" за управление на СОМ порт посредством прекъсвания. Намерих един подобен код на паскал, но този език ми е непонятен :roll: . Под управление на СОМ порт имам предвид изпращане на байт, получаване на байт, елементарни неща. Колкото да се запозная с прексъванията и използването им в "С".
Мреси предварително.


Пон Яну 23, 2006 7:52 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
уф? защо ти е на дос точно да се учиш на прекъсвания? както и да е, твоя работа.

сподели обаче какъв ти е компилатора, щото едно време подходите бяха много различни


Пон Яну 23, 2006 7:56 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 19, 2005 12:49 am
Мнения: 61
Мнение 
ДедоБоре написа:
уф? защо ти е на дос точно да се учиш на прекъсвания? както и да е, твоя работа.

сподели обаче какъв ти е компилатора, щото едно време подходите бяха много различни


Какво да ти кажа, падам си малко мазохист :lol: . Компилатора е Borland C++ 3.1 (класика :wink: )


Пон Яну 23, 2006 8:25 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Авг 08, 2005 9:29 pm
Мнения: 17
Мнение 
Не знам точно каква ти е целта .
Ако става въпрос за сериен порт там нещата са доста сложни за DOS по добре да се използва някаква готова библиотека тук слагам една ако не те интересува този похват трябва да се използват bios прекъсванията . Когато се занимавах с прекъсвания стигнах до извода че с какъвто и език да ползваш се прави процедура на асемблер защото преди прекъсването се зареждат нужните регистри и след генерирането на нужното прекъсване се прочитат пак регистри а на език от високо ниво това не може да стане . Ако те интересува точно това е добре да прочетеш книгата “ тайните прекъсвания на Microsoft & IBM “ там са описани всички прекъсвания на DOS .Ако не я намериш задай конкретен въпрос и ще ти дам справочните данни .
За паралелен порт нещата са доста прости ето пример не е на С но е елементарен ще се оправиш
Директен достъп до LPT върши работа защото няма реализиран буфер на никакво ниво на достъп така че прекъсванията не са нужни
alex_lpt декларираш една променлива от 0 до 255
asm директива за начало на асемвлера
mov dx,$378 регистър dx = $378 това обикновено е номера на порта на LPT
mov al,alex_lpt регистър al= alex_lpt
out dx , al извеждане към порта
end ; край на asm
Ако това за LPT ти върши работа ще ти дам по подробна информация


Прикачени файлове:
pcl4c62.zip [154.62 KiB]
189 пъти
Пон Яну 23, 2006 11:22 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 19, 2005 12:49 am
Мнения: 61
Мнение 
alex11 написа:
Не знам точно каква ти е целта .
Ако става въпрос за сериен порт там нещата са доста сложни за DOS по добре да се използва някаква готова библиотека тук слагам една ако не те интересува този похват трябва да се използват bios прекъсванията . Когато се занимавах с прекъсвания стигнах до извода че с какъвто и език да ползваш се прави процедура на асемблер защото преди прекъсването се зареждат нужните регистри и след генерирането на нужното прекъсване се прочитат пак регистри а на език от високо ниво това не може да стане . Ако те интересува точно това е добре да прочетеш книгата “ тайните прекъсвания на Microsoft & IBM “ там са описани всички прекъсвания на DOS .Ако не я намериш задай конкретен въпрос и ще ти дам справочните данни .


Мерси за библиотеката, мисля че ще мие от ползна. Иначе конкретно став авъпрос за получаване на данни от серийния порт. Т.е. да се хване момента в който пристигат данните, текущата работа на програмата да се преустанови и да се премине към обработка на получаваните данни както при едн а ембедет система. Иначе за изпращането на данни проблем няма, то С-то си има и библиотечна функция за това.
То има и по-лесен начин с един готов компоненд за Borlad C++ Builder, но немога да го открия този компонент.
Благодаря за билиотеката, ще я разгледам подробно.


Вто Яну 24, 2006 12:00 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Готов компонент: аз ползвам Async32 , свалил съм го от www.torry.ru. Безплатен е, добре се справя. Има ги и за Delphi.


Вто Яну 24, 2006 10:57 am
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Авг 08, 2005 9:29 pm
Мнения: 17
Мнение 
Мисля че не трябва да се забравя че това е DOS. Структурата на програмата под DOS обикновено е такава че не обработва събития както под WINDOWS стартира се приложението и то заема цялото процесурно време . За серийния порт има една специфика при инициализацията му се определя буфер местоположение в RAM и големина единственото което трябва да правиш от време на време да го проверяваш . Поддръжката на буфера се осигурява от BIOS така че не е нужно да разработваш собствен буфер защото и да направиш собствена резидентна програма за обработка на серийния порт тя едва ли ще е по добра от BIOS а и ще загубиш универсалността на програмата тя ще работи само на твоето PC.
Тези общи приказки едва ли ще ти свършат работа за това ще кача малко литература на български по въпроса .


Вто Яну 24, 2006 2:48 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Авг 08, 2005 9:29 pm
Мнения: 17
Мнение 
Ако ти се занимава има и още


Прикачени файлове:
com.zip [465.09 KiB]
208 пъти
Вто Яну 24, 2006 3:08 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Сеп 19, 2005 12:49 am
Мнения: 61
Мнение 
alex11 написа:
Мисля че не трябва да се забравя че това е DOS. Структурата на програмата под DOS обикновено е такава че не обработва събития както под WINDOWS стартира се приложението и то заема цялото процесурно време . За серийния порт има една специфика при инициализацията му се определя буфер местоположение в RAM и големина единственото което трябва да правиш от време на време да го проверяваш . Поддръжката на буфера се осигурява от BIOS така че не е нужно да разработваш собствен буфер защото и да направиш собствена резидентна програма за обработка на серийния порт тя едва ли ще е по добра от BIOS а и ще загубиш универсалността на програмата тя ще работи само на твоето PC.
Тези общи приказки едва ли ще ти свършат работа за това ще кача малко литература на български по въпроса .


Абсолютно точно описа проблема, ако наистина качиш и малко литература направо ще си златен, защото тука с инициализирането на серийния порт не ми е мнгого ясно иначе за проберката на буфера отвреме на време няма проблем.


Мерси ина bateAz за компонента.


Вто Яну 24, 2006 3:13 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
алекс, извинявай, ама много лаишко изявление...

биоса на РС не поддържа буфери за серйните порти. дори не поддържа и FIFO-то в чиповете. да не се бъркаш с клавиатурата?

в същност, биоса е най-най-най-бъгавото нещо в РС-то (след хардуера, разбира се). ако беше читав, всички щяха да го ползват, но никой за нищо не го ползва като функции (имам предвид програмни прекъсвания). така беше едно време, така е и днес. сега биоса се ползва само да инициализира чипсета и да зареди първия сектор от диска. това, по мое скромно мнение, може да стане с програмка на асемблер от максимално 2-3К, но днешните биоси имат менюта, сплашове, резервни копия, борба с вируси и са по 2Мбайта. но посъщество основните функции на биоса не са променени.

джони,
не можах да намеря сламка за борландско С от онази епоха... сигурно съм ги раздал преди години, защото по не си спомням да съм ги мяркал последните десетина. а може и праха върху тях да е толкова, че да не се виждат вече :wink:

няколко правила (по спомен)
- в инициализиращата част на твоята програма трябва някъде да запазиш стария вектор на прекъсване
- правиш функция на С, която е с атрибут interrupt. трябва да поровиш хелпа как точно се пише, но тази функция е по-особена, най-малкото защото има RETI сместо RET накрая. мисля, че за забраната на прекъсвания п овреме на тази фунция трябва да се грижиш сам (sei/cli), май нямаше атрибут/прагма на компилатора за това.
- в функията си четеш директно порта на серйния чип и интерпретираш от къде ти е дошло прекъсването и какво да правиш с него
- сменяш вектора на прекъсването да сочи твоята функция и уведомяваш за това интеръпт контролера
- ако е предвидено от твоята програма да се излиза, трябва във функцията преди излизане (по спомен трябва да е нещо като onexit) да възстановиш стария стария вектор.


Вто Яну 24, 2006 3:21 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Авг 08, 2005 9:29 pm
Мнения: 17
Мнение 
Дедоборе мнението е като гъза всеки го има даже и ти .Съвет: не давай квалификации защото това което се вижда, през живота си не си прехващал нито едно прекъсване, за идеята това се прави така:
Пише се самостоятелна резидентна програма не процедура каквото ти дрънкаш. Заделя се памет за нея защото трябва постоянно да е в паметта да не реши някоя програма да се намести на нейно място . Програмата има ред особености компилира се като .COM а не .EXE няма да обяснявам защо много си далеко от това, началото трябва да е на асемблер за да се съхранят регистрите в стека защото това не WINDOWS и никои не му пука за регистрите, после прави каквото ще прави възстановяват се регистрите и край . При първото стартиране на програмата се извлича вектора на оригиналната обработка на прекъсването за да може в края да се предаде управлението на нея, после се променя вектора на прекъсването в този случаи е 14h да сочи началото на програмата. Програмата има за цел да извлече информацията от порта и да я сложи в буфер .
Егати колко съм умен аз съм първия, който се е сетил за това ( ирония защото може и да не се досетиш ) това всъщност не е вярно това е толкова умно че хората са го сложили като стандартна функция в BIOS които обикновено е по малко бъгав от моя софтуер вероятно и от твоя . А четенето с буфер е прекъсване 14h функция A5h
За другите ако ви трябва ще ви дам пълно описание на 14h на български.


Вто Яну 24, 2006 5:56 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
@alex11, колега, уважения към труда ти за детайлно описване на работа с прекъсвания, нямам забележки освен тона ти... и с риск да подкладя огъня, в който така смело наливаш масло, да те попитам случайно ако ползваш повече от едно прекъсване (клавиатура, сериен порт, etc) не те ли бърка състоянието на работните регистри? Означава ли че трябва след като си компилирам самостоятелния .COM изпълним файл трябва обстойно да разгледам дали случайно компилатора не използва някой регистри които аз пренебрегвам докато чета char от серийната връзка в interrupt?


Вто Яну 24, 2006 6:10 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Вто Окт 25, 2005 10:54 am
Мнения: 896
Мнение 
алех11, брато, това че даваш едно от решенията на проблема не означава че е единственото или че е най доброто!!! ама никакав проблем не е да се хване кое да е прекъсване в ДОС в собствена програмка КОЯТО НЕ Е РЕЗИДЕНТНА а нормална узерска - та даже е за предпочитане щото е по просто.
Твоята идея е просто нещо като драйвер кой да могат да го ползват всички ДОС програмки - ама кому е нужно това??? На пича просто му трябва да си работи с кома с неговата си програмка.
И недей да ми спориш че не съм прав щото мога да се подкрепя с сорсове :)


Вто Яну 24, 2006 6:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
мери си приказките, момче!

много ще е интересно да постнеш кода на една твоя резидентна програма за обслужване на прекъсване, която да няма процедури(функции). по-дълбок анализ на писанията ти не ми се прави, ще е търкане на клавиатурата.

също, ще съм ти много благодарен, ако намериш някъде работа със серйния буфер през биос на тази страница http://www.ctyme.com/intr/int-14.htm. от написаната от теб функция A5h ми се струва, че се бъркаш с BAPI?


Вто Яну 24, 2006 6:30 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Авг 08, 2005 9:29 pm
Мнения: 17
Мнение 
ок че накой ще ме бие


Вто Яну 24, 2006 6:55 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 22 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни