Bunu genel olarak yapamazsınız, ancak bazı açılardan, çok fazla şey yapabilirsiniz ve gerçekten yapmak zorunda olduğunuz birkaç tarihsel durum olmuştur .
Atari 2600 (veya Atari Video Bilgisayar Sistemi), Atari işlemci zorunda anlamı cihaza bir çerçeve tampon vermek yetmeyeceğini en erken ev video oyun sistemleri biriydi ve ilk dönemin daha sonraki sistemlerin aksine 1978'de serbest bırakıldı ne üretileceğini belirlemek için her tarama satırında kod çalıştırmak - bu kodun çalışması 17.08 mikrosaniyeyi geçerse (HBlank aralığı), grafikler tarama çizgisi çizilmeye başlamadan önce uygun şekilde ayarlanmayacaktır. Daha kötüsü, programcı Atari'nin normalde izin verdiğinden daha karmaşık bir içerik çizmek istiyorsa, talimatlar için tam süreleri ölçmek ve ışın çizilirken grafik kayıtlarını değiştirmek için tüm tarama çizgisi için 57.29 mikrosaniye aralıklarla değiştirmek zorunda kaldılar.
Bununla birlikte, Atari 2600, 6502 tabanlı birçok diğer sistemde olduğu gibi, bu senaryo için gereken dikkatli zaman yönetimini sağlayan çok önemli bir özelliğe sahipti: CPU, RAM ve TV sinyali hepsi aynı ustaya dayanarak saatlerce tükendi saat. TV sinyali, 3.98 MHz'lik bir saat kullanarak, yukarıdaki zamanları, TV sinyalini yöneten bir tam sayıdaki "renkli saat" e bölüştürdü ve CPU ve RAM saatlerinin bir çevrimi, CPU saatinin tam olmasını sağlayan tam üç renkli saatti. Geçerli ilerleme TV sinyaline göre doğru bir zaman ölçüsü. (Bununla ilgili daha fazla bilgi için, Stella Atari 2600 öykünücüsü için yazılmış Stella Programcı Kılavuzu'na bakın ).
Bu işletim ortamı, ayrıca, her CPU komutunun her durumda alacağı belli bir devir sayısına sahip olduğu anlamına geliyordu ve çoğu 6502 geliştirici bu bilgiyi referans tablolarında yayınladı. Örneğin CMP
, bu tablodan alınan (Akü ile Belleği Karşılaştır) talimatı için bu girişi göz önünde bulundurun :
CMP Compare Memory with Accumulator
A - M N Z C I D V
+ + + - - -
addressing assembler opc bytes cycles
--------------------------------------------
immediate CMP #oper C9 2 2
zeropage CMP oper C5 2 3
zeropage,X CMP oper,X D5 2 4
absolute CMP oper CD 3 4
absolute,X CMP oper,X DD 3 4*
absolute,Y CMP oper,Y D9 3 4*
(indirect,X) CMP (oper,X) C1 2 6
(indirect),Y CMP (oper),Y D1 2 5*
* add 1 to cycles if page boundary is crossed
Tüm bu bilgileri kullanarak, Atari 2600 (ve diğer 6502 geliştiricileri), kodlarının ne kadar sürdüğünü tam olarak belirleyebildi ve Atari'nin TV sinyali zamanlama gereksinimlerine uymak için ihtiyaç duyduklarını ve rutinlerini oluşturdular. Ve bu zamanlama çok kesin olduğu için (özellikle NOP gibi zaman harcayan talimatlar için), grafikleri çizilirken değiştirmek için bile kullanabildiler.
Elbette, Atari'nin 6502'si çok özel bir durumdur ve bunların tümü, yalnızca sistemin aşağıdakilerin hepsine sahip olması nedeniyle mümkündür:
- RAM dahil her şeyi koşturan ana saat. Modern sistemler CPU ve RAM için bağımsız saatlere sahiptir, RAM saati genellikle daha yavaş, ikisi de senkronize olmamakla birlikte.
- Hiçbir önbelleğe alma yok - 6502 her zaman doğrudan DRAM'a erişiyordu. Modern sistemler, durumu tahmin etmeyi zorlaştıran SRAM önbelleklerine sahiptir - bir sistemin önbellekle davranışını tahmin etmek hala mümkün olsa da, kesinlikle daha zordur.
- Aynı anda çalışan başka program yok - kartuştaki programın sistemi tamamen kontrol altına aldı. Modern sistemler, deterministik olmayan programlama algoritmaları kullanarak bir kerede birden fazla program yürütmektedir.
- Bir saat hızı, sinyallerin zaman içinde sistemde dolaşabileceği kadar yavaş. Saat hızı 4 GHz olan modern bir sistemde (örneğin) yarım metrelik bir anakartın uzunluğunu hareket ettirmek için 6.67 saat devri ışık fotonu alır - modern bir işlemcinin tahtadaki başka bir şeyle etkileşime girmesini asla bekleyemezsiniz. sadece bir çevrimde, çünkü panodaki bir sinyalin cihaza ulaşması birden fazla döngü gerektiriyor.
- Nadiren değişen iyi tanımlanmış bir saat hızı (Atari durumunda 1.19 MHz) - modern sistemlerin CPU hızları her zaman değişirken, Atari TV sinyalini etkilemeden bunu yapamadı.
- Yayınlanmış döngü zamanlamaları - x86, talimatlarından herhangi birinin ne kadar süreceğini tanımlamaz.
Bunların hepsi bir araya gelerek, bir miktar zaman alan bir dizi talimatın işlenmesinin mümkün olduğu bir sistem oluşturmak için bir araya geldi - ve bu uygulama için, tam olarak talep edildi. Çoğu sistemde bu derece bir hassasiyet yoktur, çünkü buna gerek yoktur - hesaplamalar bittiğinde yapılır veya kesin bir zaman gerektiğinde, bağımsız bir saat sorgulanabilir. Ancak ihtiyaç doğru ise (bazı gömülü sistemlerde olduğu gibi), yine de görünebilir ve kodunuzun bu ortamlarda ne kadar süreyle çalışacağını doğru bir şekilde belirleyebilirsiniz.
Ayrıca, tüm bunların yalnızca kesin bir zaman alabilecek bir dizi montaj talimatı oluşturmak için geçerli olduğuna dair büyük büyük sorumluluk reddini de eklemeliyim . Bu ortamlarda bile istediğiniz bazı montaj parçalarını almak ve "Bu işlem ne kadar sürer?" Diye sormak, kategorik olarak bunu yapamazsınız - bu çözülemeyen kanıtlanmış Halting Sorunu .
DÜZENLEME 1: Bu cevabın önceki bir versiyonunda, Atari 2600'ün işlemcisini TV sinyalinin neresinde olduğunu bildirmenin hiçbir yolu olmadığını, bu sayede tüm programı en baştan saymaya ve senkronize etmeye zorladı. Yorumlarda da belirtildiği gibi, bu, ZX Spectrum gibi bazı sistemler için doğrudur, ancak Atari 2600 için doğru değildir, çünkü bir sonraki yatay boşluk aralığı gerçekleşene kadar CPU'yu durduran bir donanım kaydı içerir. isteğe bağlı olarak dikey boşluk aralığına başlamak için bir işlev. Bu nedenle, döngüleri sayma sorunu her bir tarama çizgisiyle sınırlıdır ve yalnızca geliştirici, tarama çizgisi çizilirken içeriği değiştirmek isterse kesinleşir.