• Реклама


C + asm

Разработка и Написание программ, вопросы, идеи...

C + asm

Сообщение Aragaer 03 дек 2003 08:26

Имеются COM и LPT порты. Надо написать программу для их сопритюкивания. Отдельно кусок асемблерного кода для каждой из 4-х операций (посылка/чтение из сом/лпт) я вроде как написал (проверить бы еще на работоспособность...). Хочется найти следующие вещи:
- Как в С обрабатываются прерывания, правильно ли я понимаю, что через try catch?
- Как отловить непосредственно прерывания на получение байта из СОМа и получение сигнала Busy по ЛПТ (так повезло, что появление его равносильно началу байта)?
- В чем вообще бы все это компилировать?
- И еще вопрос возник насчет таймера - надо узнать, сколько машинных циклов приходится на 1 секунду. Как это сделать программно?
Open your eyes.
And Awaken.
Аватара пользователя
Aragaer
Склеротик.
Склеротик.
 
Сообщения: 113
Зарегистрирован: 28 сен 2003 19:32
Откуда: From Dreaming.

Реклама

Сообщение SLAY`ee`K 03 дек 2003 17:05

Если С - то try/catch/throw
Если С(MFC) - try/catch(CExeption* smth), что на мой взгляд удобнее.

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

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

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

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

Вообще тебе дорога для поиска соотвествующих классов:
www.codeguru.com
www.codeproject.com
www.rsdn.ru - если ничего не надёшь...
Аватара пользователя
SLAY`ee`K
Модератор
Модератор
 
Сообщения: 125
Зарегистрирован: 07 окт 2003 20:57
Откуда: Виннипег (Манитоба, Канада)

Сообщение Aragaer 03 дек 2003 18:25

Машинный цикл - единица измерения времени выполнения команды. Не знаю, как все это в нормальных процессорах, но на 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.
Open your eyes.
And Awaken.
Аватара пользователя
Aragaer
Склеротик.
Склеротик.
 
Сообщения: 113
Зарегистрирован: 28 сен 2003 19:32
Откуда: From Dreaming.

Сообщение Aragaer 03 дек 2003 18:38

Получил предложение пользоваться таймером... *забил на последний из вопросов*
Open your eyes.
And Awaken.
Аватара пользователя
Aragaer
Склеротик.
Склеротик.
 
Сообщения: 113
Зарегистрирован: 28 сен 2003 19:32
Откуда: From Dreaming.

Сообщение SLAY`ee`K 03 дек 2003 19:15

Да, если с таймером и MFC, то определённо Cwnd::OnTimer(int nEvent); если в WinAPI 32, то ::OnTimer(HWND hwnd,int nEvent);

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

А обязательно ассемблер использовать? Что за задача?
Аватара пользователя
SLAY`ee`K
Модератор
Модератор
 
Сообщения: 125
Зарегистрирован: 07 окт 2003 20:57
Откуда: Виннипег (Манитоба, Канада)

Сообщение Aragaer 03 дек 2003 19:36

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

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

Вроде бы для СОМа-то и не обязательно пользовться асмом, там нужно посылать и читать нормальные 5-тибитные пачки с битом четности и двумя стопбитами со скоростью 115200. А вот с лпт плохо - нужно эти же самые пачки читать прямо из порта и ловить каждый бит вручную. По чистой случайности пачки приходят по каналу Busy, который должен быть в 1, если с принтером все в порядке. Стартбит - 0, т.е. начало пачки аналогично тому, что принтер вдруг стал занят. Отловить это, перескочить в подпрограмму обработки прерывания и там все биты похватать. Теоретически, скорость данных - микросекунды (а частота - килогерцы), поэтому перескочить успеем, может даже успеем отловить сам стартбит. Вопрос только в том, как отлавливать.
Open your eyes.
And Awaken.
Аватара пользователя
Aragaer
Склеротик.
Склеротик.
 
Сообщения: 113
Зарегистрирован: 28 сен 2003 19:32
Откуда: From Dreaming.

Сообщение Aragaer 03 дек 2003 19:42

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

вот только надо мне было сегодня внимательнее слушать на лекции.... :roll:
Open your eyes.
And Awaken.
Аватара пользователя
Aragaer
Склеротик.
Склеротик.
 
Сообщения: 113
Зарегистрирован: 28 сен 2003 19:32
Откуда: From Dreaming.

Сообщение SLAY`ee`K 04 дек 2003 00:22

Слушай, а тебе сколько лет? =)
Аватара пользователя
SLAY`ee`K
Модератор
Модератор
 
Сообщения: 125
Зарегистрирован: 07 окт 2003 20:57
Откуда: Виннипег (Манитоба, Канада)

Сообщение Aragaer 04 дек 2003 01:17

20. Тебя почти на год старше (двух недель до года не хватает) 8)

Тут еще вопрос возник - как в С метки объявлять?
Open your eyes.
And Awaken.
Аватара пользователя
Aragaer
Склеротик.
Склеротик.
 
Сообщения: 113
Зарегистрирован: 28 сен 2003 19:32
Откуда: From Dreaming.

Сообщение SLAY`ee`K 04 дек 2003 02:43

Метки всмысле #define MEGAMETKA и-тут-что-то ?
Аватара пользователя
SLAY`ee`K
Модератор
Модератор
 
Сообщения: 125
Зарегистрирован: 07 окт 2003 20:57
Откуда: Виннипег (Манитоба, Канада)

Сообщение Aragaer 04 дек 2003 11:47

А черт его знает.. Лучше я сегодня преподавателя на эту тему помучаю.
Open your eyes.
And Awaken.
Аватара пользователя
Aragaer
Склеротик.
Склеротик.
 
Сообщения: 113
Зарегистрирован: 28 сен 2003 19:32
Откуда: From Dreaming.

Сообщение SLAY`ee`K 04 дек 2003 15:13

Перехотел изучать ассемблер... ну его на фиг =)
Аватара пользователя
SLAY`ee`K
Модератор
Модератор
 
Сообщения: 125
Зарегистрирован: 07 окт 2003 20:57
Откуда: Виннипег (Манитоба, Канада)

Сообщение Aragaer 08 дек 2003 20:03

А в итоге вот что: http://www.livejournal.com/users/aragaer/65010.html
Копировать очень ломает.
Open your eyes.
And Awaken.
Аватара пользователя
Aragaer
Склеротик.
Склеротик.
 
Сообщения: 113
Зарегистрирован: 28 сен 2003 19:32
Откуда: From Dreaming.

Сообщение SLAY`ee`K 21 дек 2003 02:52

ну так задачка удалась?
Аватара пользователя
SLAY`ee`K
Модератор
Модератор
 
Сообщения: 125
Зарегистрирован: 07 окт 2003 20:57
Откуда: Виннипег (Манитоба, Канада)


Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


  • Реклама
cron