Страница 1 из 1

C + asm

СообщениеДобавлено: 03 дек 2003 08:26
Aragaer
Имеются COM и LPT порты. Надо написать программу для их сопритюкивания. Отдельно кусок асемблерного кода для каждой из 4-х операций (посылка/чтение из сом/лпт) я вроде как написал (проверить бы еще на работоспособность...). Хочется найти следующие вещи:
- Как в С обрабатываются прерывания, правильно ли я понимаю, что через try catch?
- Как отловить непосредственно прерывания на получение байта из СОМа и получение сигнала Busy по ЛПТ (так повезло, что появление его равносильно началу байта)?
- В чем вообще бы все это компилировать?
- И еще вопрос возник насчет таймера - надо узнать, сколько машинных циклов приходится на 1 секунду. Как это сделать программно?

СообщениеДобавлено: 03 дек 2003 17:05
SLAY`ee`K
Если С - то try/catch/throw
Если С(MFC) - try/catch(CExeption* smth), что на мой взгляд удобнее.

По-поводу LPT Ничего сказать не могу.

По-поводу COM-а - я просто открывал потом и считывал всё что идёт, ну и потом разбирал, что пришло...

Компилится всё это в Visual C++.

А про машинные циклы... объясни мне - что это? Может что подскажу.

Вообще тебе дорога для поиска соотвествующих классов:
www.codeguru.com
www.codeproject.com
www.rsdn.ru - если ничего не надёшь...

СообщениеДобавлено: 03 дек 2003 18:25
Aragaer
Машинный цикл - единица измерения времени выполнения команды. Не знаю, как все это в нормальных процессорах, но на 51-й серии один цикл - 12 тактов. Таким образом все команды выполняются по 1-3 цикла, т.е. 12-36 тактов. откуда получаем скорость работы программы и собственно реальное время (если знаем частоту процессора). А вот если не знаем, то надо как-то посчитать.

В моем случае, необходимо поставить задержку, дабы выполнять некий цикл на асме раз в 1/115200 секунды. Огранизуется это примерно так:
Код: Выделить всё
          push      cx
          mov       cx,       del_int
@L1       loop      @L1
          pop       cx

Плюс какие-то операции до задержки. Надо высчитать число del_int. При этом надо учесть, что команда loop выполняется ровно (сколько-то и надо узнать сколько именно, но мне кажется, что) 3 цикла, а все остальные команды (до задержки) тоже сколько-то. И таким образом получить требуемую 1/115200.

СообщениеДобавлено: 03 дек 2003 18:38
Aragaer
Получил предложение пользоваться таймером... *забил на последний из вопросов*

СообщениеДобавлено: 03 дек 2003 19:15
SLAY`ee`K
Да, если с таймером и MFC, то определённо Cwnd::OnTimer(int nEvent); если в WinAPI 32, то ::OnTimer(HWND hwnd,int nEvent);

На счёт цикла... Ассемблер не очень хорошо знаю, но если возможно,
то завести переменную, и в цикле увеличивать её... Не знаю... пока не совсем въехал...

А обязательно ассемблер использовать? Что за задача?

СообщениеДобавлено: 03 дек 2003 19:36
Aragaer
Цикл в асме организуется с помощью команды loop, она уменьшает на 1 регистр cx и если он 0, то идет дальше, иначе прыгает на метку. С этим проблем нет. Во-вторых, прямо из асма можно пользоваться таймером, осталось только понять, где именно он там спрятан.

А какие именно библиотеки надо использовать для отлова прерываний СОМа и принтера? Может я разберусь там в них.

Вроде бы для СОМа-то и не обязательно пользовться асмом, там нужно посылать и читать нормальные 5-тибитные пачки с битом четности и двумя стопбитами со скоростью 115200. А вот с лпт плохо - нужно эти же самые пачки читать прямо из порта и ловить каждый бит вручную. По чистой случайности пачки приходят по каналу Busy, который должен быть в 1, если с принтером все в порядке. Стартбит - 0, т.е. начало пачки аналогично тому, что принтер вдруг стал занят. Отловить это, перескочить в подпрограмму обработки прерывания и там все биты похватать. Теоретически, скорость данных - микросекунды (а частота - килогерцы), поэтому перескочить успеем, может даже успеем отловить сам стартбит. Вопрос только в том, как отлавливать.

СообщениеДобавлено: 03 дек 2003 19:42
Aragaer
К слову о спрятанном таймере. Логика подсказывает, что его я вытащить смогу простым
Код: Выделить всё
in       a,       t0

вот только надо мне было сегодня внимательнее слушать на лекции.... :roll:

СообщениеДобавлено: 04 дек 2003 00:22
SLAY`ee`K
Слушай, а тебе сколько лет? =)

СообщениеДобавлено: 04 дек 2003 01:17
Aragaer
20. Тебя почти на год старше (двух недель до года не хватает) 8)

Тут еще вопрос возник - как в С метки объявлять?

СообщениеДобавлено: 04 дек 2003 02:43
SLAY`ee`K
Метки всмысле #define MEGAMETKA и-тут-что-то ?

СообщениеДобавлено: 04 дек 2003 11:47
Aragaer
А черт его знает.. Лучше я сегодня преподавателя на эту тему помучаю.

СообщениеДобавлено: 04 дек 2003 15:13
SLAY`ee`K
Перехотел изучать ассемблер... ну его на фиг =)

СообщениеДобавлено: 08 дек 2003 20:03
Aragaer
А в итоге вот что: http://www.livejournal.com/users/aragaer/65010.html
Копировать очень ломает.

СообщениеДобавлено: 21 дек 2003 02:52
SLAY`ee`K
ну так задачка удалась?