C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Размер временного периода в 2000/XP, Как изменить размер временной период
NemoAs
Отправлено: 04.02.2006, 13:23


Не зарегистрирован







Народ! Помогите. Проблемка возникла.
Появилась необходимость изменить квант времени под 2000/xp. нужна 1мл, но на худой конец и 5 сойдет. Сейчас у меня под 2000 10мл, а под ХР 15. Как уменьшить?
Работаю под С++ Builder. SetSystemTimeAdjustment ругается ошибкой 1314(0x522). В тексте — "Клиент не обладает требуемыми правами".

Grigoriy
Отправлено: 04.02.2006, 19:29


Мастер участка

Группа: Участник
Сообщений: 381



Вторичный вопрос.
А как можно в Windows XP SP1
записать байт в какой-нибудь порт ввода-вывода.
Ругается с ошибкой.
Сообщает — у вас нет привилегий. Ваш программный код имеет низкий уровень привилегий. Для операции с портом ввода-вывода нужен уровень привилегий 0.

Но я помню, полтора года назад стояла у меня какая-то ОС Windows XP, может без пакета обновления, так мне удавалось программировать через порты системный таймер.
Этот системный таймер имеет 3 канала.
0 канал — служит для аппаратного прерывания от таймера. Двухбайтный делитель частоты 1193180 Гц записывается для этого канала в порт 0x40. Следует заметить, что система записывает туда сравнительно большое число. Уменьшив это число — увеличим частоту прерывания от таймера !
Раньше мне это удавалось сделать на ассемблере, но теперь под новой ОС Windows вдруг ни с того ни с сего низкий уровень привилегий получился !
1 канал — связан с микросхемой DMA.
2 канал — связан с системным динамиком. Правда никакого динамика в системном блоке уже нет. Но полтора года назад вместо него издавали писк колонки, когда я программировал этот канал.

Теперь попробуйте, чтобы заработал вот этот код
CODE


void delay_()
{ asm{
push ecx;
mov ecx,5000000;
@1:loop @1;
pop ecx;};
};

void __fastcall TForm1::Button1Click(TObject *Sender)
{
short int tonelow = 2651;
short int temp;
short int cnt;
asm{
//заносим слово состояния 10110110b(0В6h) в командный регистр (порт 43h)
@go: mov al,0B6h
out 43h,al
in al,61h //получим значение порта 61h в al
or al,3 //инициализируем динамик и подаем ток в порт 61h
out 61h,al
mov cx,2083 //количество шагов ступенчатого изменения тона
@musicup:
//в ax значение нижней границы частоты
mov ax,tonelow
out 42h,al //в порт 42h младшее слово ax :al
xchg al,ah //обмен между al и ah
out 42h,al //в порт 42h старшее слово ax:ah
add tonelow,1 //повышаем тон
call delay_ //задержка на 1 мкс
mov dx,tonelow //в dx текущее значение высоты
mov temp,dx //temp — верхнее значение высоты
loop @musicup //повторить цикл повышения
mov cx,2083 // восстановить счетчик цикла
@musicdown:
mov ax,temp //в ax верхнее значение высоты
out 42h,al //в порт 42h младшее слово ax :al
mov al,ah //обмен между al и ah
out 42h,al//в порт 42h старшее слово ax :ah
sub temp,1 //понижаем высоту
call delay_ //задержка на 1 мкс
loop @musicdown //повторить цикл понижения
@nosound:
in al,61h //получим значение порта 61h в AL
and al,0FCh //выключить динамик
out 61h,al //в порт 61h
mov dx,2651 //для последующих циклов
mov tonelow,dx
inc cnt //увеличиваем счётчик проходов, то есть
//количество звучаний сирены
cmp cnt,5 //5 раз ?
jne @go }
}



А этот код по идее должен изменять квант времени.

CODE

short int delitel;
delitel=10000;//К ПРИМЕРУ
asm{
mov al,0x36;
out 0x43,al;
mov ax, delitel;
out 0x40,al;
xchg al,ah;
out 0x40,al;
};


Отредактировано Grigoriy — 04/02/2006, 19:32
Rius
Отправлено: 06.02.2006, 07:34


Мастер участка

Группа: Участник
Сообщений: 321



1. если нужна задержка, можно подсчитывать тики процессора, там интервалы маленькие
CODE
void __fastcall delay(DWORD del)
{
   LARGE_INTEGER pc1;
   LARGE_INTEGER pc0;
   LARGE_INTEGER pf;
   unsigned long ticks;
   if(QueryPerformanceFrequency(&pf))
   {
         ticks  = pf.QuadPart * del / 1000000;
         QueryPerformanceCounter(&pc0);
         do
         {
               QueryPerformanceCounter(&pc1);
         } while (pc1.QuadPart — pc0.QuadPart < ticks);
    };

}

2. на этом форуме когда-то встречал такие разработки.

Вернуться в Вопросы программирования в C++Builder