Реклама:

la. polar = 0; // Запуск по положительному перепаду

la.pre_reg = 0; // Предпусковая регистрация не нужна

// Запуск регистрации if (lnit_LA (&la) == -1)

{

printf ("\пОшибка.").' exit (-1);

}

// Проверка окончания регистрации while (Check_Ready() != 0)

t

// Чтение данных Read_Data (&data);

// Определение соотношений единиц и нулей по всем линиям // ЮОмкс — это 1000 кадров регистрации на частоте 10 МГц for (j=0;i<32;j++) // Обнуление счетчиков

{ // единиц и нулей

num0[j] = 0; // по всем линиям

num1[j] = 0;

}

for (i=0;i<1000;i++) // Подсчет числа нулей и единиц

for (j=0;j<32;j++) // по всем линиям, (1L «j) -

if ( (datafi] & (1L « j)) == 0 ) // маска j-го бита

num0[j]++; else

num1[j]++;

for (j=0;j<32;j++) // Вывод на экран соотношений

{

printf ("\пЛиния №%d. ", j);

if (numO[i] != 0) // Был ли ноль вообще ?

printf (Отношение 1/0 - %f.", num1(j]/num0(j]);

else // He было

printf ("Нуля не было."); } }

// Конец программы

В предложенных драйверах окончание регистрации определялось опросом флага готовности логического анализатора. Однако во многих случаях удобнее использовать аппаратное прерывание, которое анализатор вырабатывает по окончании регистрации (см. п. 2.1.10). Например, если синхропереход приходит редко, можно построить систему таким образом, чтобы после запуска регистрации программа переходила на выполнение другой задачи (например, обработка ранее полученных данных), а по прерыванию от логического анализатора переходила на его обработку. В этом случае необходимо написать программу обработки прерывания, в которую включить все необходимые действия. Драйвер Check_Ready становится не нужен.

// *** Программа обработки прерывания от логического анализатора

void interrupt LA_handler (unsigned long *data) {

disable(); // Запрет прерываний на время обработки

... // Какие-то действия

Read_Data (data); // Чтение данных из буфера ... // Какие-то действия епаЫе(); // Разрешение прерываний

}

// Конец программы

В тело основной программы следует включить установку вектора прерывания от логического анализатора:

setvect (INT, LAJiandler); // INT — номер прерывания

2.2.4. К вопросу о программировании сетевого контроллера

Описанные в п. 2.1.12 варианты реализации узлов контроллера локальной сети требуют пересылки информационных пакетов из ОЗУ компьютера в буферное ОЗУ контроллера и наоборот. При этом скорость пересылки должна быть максимальной для повышения информационного быстродействия сети. Написанная "в лоб" даже на ассемблере (цикл команд MOV), эта процедура оказывается слишком медленной. Однако не следует спешить использовать прямой доступ к памяти. В системе команд имеется инструкция для пересылки массива из одного места памяти в другое — MOVS. Например, если буфер контроллера сети занимает адреса В0000Н — B0FFFH, то процедура записи в него пакета длиной 4Кбайта из адресов 80000Н—80FFFH выглядит следующим образом:

MOV СХ, 1000H; длина пакета


⇐ Предыдущая страница| |Следующая страница ⇒