2013-06-27 33 views
5

Bu kodu SDCC 3.1.0 ile derlediğimde ve bunu bir Amstrad CPC 464'te (öykünme altında, WinCPC 0.9.26 Wine üzerinde çalışan) çalıştırarak çalıştırıyorum: ... sürekli olarak 92 malloc() s'de sabitlenmiştir. Ben onu birkaç soru beni neden 460 bayt:SDCC ve malloc() - kullanılabilir olduğundan çok daha az bellek ayırma

  • malloc() bu sistemde durumu ne? 64kB'lik bir sistemde bile daha fazla depolama siparişi için umut bekliyordum

  • Davranış 64kB sistemler ve 128kB sistemlerde tutarlıdır; Manuel banka geçişi gibi ek belleğe erişmek için bir çeşit sihir yapmak zorunda mıyım?

+0

Neden 5 baytlık artışlar? Daha büyük parçalar (sadece meraklı olmak) ayırdığınızda ne olur? Diğer soru: Ne kadar yığın alanı almanıza izin veriyorsunuz? –

cevap

4

Yanıt, Z80 sistemlerinde yığın boyutunun 1kB'ye kodlanmış olmasıdır. ÖGDM kullanıcılı posta listesinde Maarten Brock answered bu: Standart 1 KB yeterli değilse

Merhaba Duncan,

öbek kendini oluşturmak zorunda. Heap'leri proje direktifine kopyalayın ve tercih ettiğiniz boyutu oluşturmak için onu değiştirin. Ardından, birleştirin ve projenizle bağlantı kurun.

_heap.c dosyasında tanımlanan mcs51 yığınından farklı olarak, bu kılavuzda Z80 için belgelenmiş bulunmamaktadır. dokümantasyonunu, takip sistemindeki _heap.c ve heap.s dosyasını güncellemek veya birleştirmek için çekinmeyin. Duncan Bayne söylediği gibi

Maarten Aslında

5

, ÖGDM Z80 için uygular varsayılan bellek yöneticisi çok dar yığın boşluk yoktur. Ancak, SDCC'nin yığınını değiştirmeye çalışmadan önce, bir Amstrad TBM'sinde dinamik belleğe ihtiyacınız olup olmadığını düşünmelisiniz. Genel olarak, tüm donanımın sahibi olan bağımsız bir uygulamayı çalıştırdığınızda dinamik belleği kullanmanın bir anlamı yoktur. Ne kadar hafızaya sahip olduğunuzu test edebilir ve bilirsiniz ve istediğiniz yere doğrudan hafızaya yazabilirsiniz. Bellek koruması yoktur ve arka planda çalışan başka hiçbir uygulama yoktur. Bu nedenle, kendi bellek haritanızı (verilerinizin nerede olmasını istediğinizi ve ne kadar alan kullanacağınızı) tasarlamanız ve ardından belleği doğrudan yönetmeniz daha çok tercih edilir. Ayrıca, bu makinede kod optimizasyonu çok önemlidir ve hafızayı manuel olarak yönetmek optimizasyon için aşırı derecede uygundur. Kodunuz doğrudan Amstrad CPC'de çalışıyorsa (yani Symbos gibi modern bir işletim sistemi kullanmıyorsa), belleğe erişmek için banka geçişi ile manuel olarak ilgilenmeniz gerekir. Z80 CPU, 16-bit'lik bir veri yoluna sahiptir, bu da sadece banka değiştirmeden 64 KB belleğe hitap eder.

+0

Burada statik bellek ayırmanın sakıncası, uygulamanızın hepsini aynı anda doldurmayacak olsa bile, tüm tamponlar için en kötü durum sınırlarını ödemek zorunda kalmanızdır. Bu gibi sistemlerde verilen maliyetler de çok yüksektir, fakat kesinlikle dinamik tahsisi elden çıkarmayacağım (jenerik 'malloc kesinlikle dışarıda olsa da). – doynax

+0

Aslında, bunun hakkında düşünürseniz, bu tam olarak bir dezavantaj değildir. Uygulamanızın X verilerini yönetmesini istiyorsanız, bu belleğe ihtiyacınız var ya da bunu yapamayacaksınız. Dinamik olarak yaparsanız, öbek için de o alanı ayırmanız gerekir. – ronaldo

+0

(devam ediyor ...) Bakış açımdan, kendi bellek havuzunuzu tasarlamanız, kendi farklı amaçlarınızı yerine getirmeniz ve doğrudan yönetmeniz genellikle daha ilginç. En kötü durum limitleri, özellikle sınırlı kaynaklarla her zaman dikkate alınmalıdır. Her neyse, genel tavsiyem yaklaşımları önceden dikkate almak ve temerrüde düşmemek. Gerisi sadece benim kişisel görüşüm. – ronaldo