Jeśli używasz na pętle, lepiej wiedzą, co do kompilacji i jak długo te instrukcje wziąć na swoim danym taktowaniu , i upewnij się, że procesor wykonuje instrukcje i nic więcej (można to zrobić w systemach wbudowanych, ale jest to trudne, ponieważ blokuje przerwania).
W przeciwnym razie nie będziesz w stanie stwierdzić, ile czasu zajmie.
Wczesne gry komputerowe miały ten problem - zostały zbudowane na komputerze o prędkości 4,7 MHz, a gdy pojawiły się szybsze komputery, nie można ich było odtworzyć.
Najlepszy sposób, w jaki "sen" może zadziałać, zależy od tego, czy procesor wie, która jest godzina w danym punkcie. Niekoniecznie faktyczny czas (7:15), ale przynajmniej względny czas (8612 sekund od pewnego momentu).
W ten sposób może zastosować deltę do bieżącego czasu i czekać w pętli, aż zostanie osiągnięty bieżący + delta.
Wszystko, co zależy od liczby cykli procesora, jest z natury niewiarygodne, ponieważ procesor może przejść do innego zadania i zawiesić pętlę.
Załóżmy, że masz 16-bitowy port I/O odwzorowywany w pamięci, który procesor zwiększa się raz na sekundę. Załóżmy też, że jest w lokalizacji pamięci 0x33 w twoim systemie wbudowanym, gdzie int są również 16 bitami. Funkcja nazywa sen staje się czymś w rodzaju:
void sleep (unsigned int delay) {
unsigned int target = peek(0x33) + delay;
while (peek(0x33) != target);
}
Musisz upewnić się, że peek() zwraca zawartość pamięci za każdym razem (tak optymalizacji kompilatorów nie syf się logiki), a chwilę biegnie rachunku więcej niż raz na sekundę, więc nie przegapisz celu, ale są to kwestie operacyjne, które nie mają wpływu na przedstawioną przeze mnie koncepcję.
ok w moim środowisku jest komputer biurkowy Windows i kompilator turbo c, czy dla środowiska komputerowego istnieje alternatywa dla snu()? (nie dla systemów wbudowanych) –
Dlaczego potrzebujesz alternatywy do snu? Tradycyjnie sen będzie realizowany w sposób, który nie wymaga wykonywania pętli, jak opisujesz. Zamiast tego wątek po prostu nie zostałby zaplanowany. –