2010-10-13 13 views
5

256 bayt sınırını geçmeyen bir dizi oluşturmak mümkün mü? Tek tek dizi öğelerinin adresleri yalnızca alt baytta farklıdır. Bu, diziyi 256 bayta hizalamaktan daha zayıf bir gereksinimdir. Düşünebildiğim tek çözüm, next_power_of_two(sizeof(array)) ile hizalandı, ancak bu şekilde görünecek boşluklardan emin değilim.Dizin 256 bayt sınırını geçmiyor

AVR mikrodenetleyicileri için bir kitaplıktır ve bu bana bir kesme işleyicisinde birkaç değerli yönerge kaydeder. Bu özelliğe sahip olması gereken dizi, kullanılan toplam statik bellek tarafından kullanılan yaklaşık 80 baytlık toplam statik bellekten 54 bayttır. kütüphane. Bellek gereksinimlerini arttırmayan bir yol arıyorum.

Avr-as gnu assembler ve avr-ld linker kullanıyorum.

Örnek: Dizi 0x00f0 adresinde başlarsa, diziyi çaprazlarken üst sözcük 0x00'den 0x01'e değişir.

Sınırı geçmediği sürece 0x0100 veya 0x0101 adresinde başlatılmasının gerçekten umrumda değil.

+0

Dizinin adresini hizalı tutmanız mı gerekiyor? Bu, dizinin zaten <= 256 elementi olduğunu bildiğiniz için talimat sayınızı nasıl azaltır? – MSN

+0

Onu hizalamam gerekmez. Eklediğim örneğe bakın. – cube

+1

Ancak, diziyi bir ** 64 ** bayt sınırıyla aynı hizaya getirmeniz, gereksinimlerinizi karşılayacaktır. Bağlayıcınız * bu ayırmaları sıralayabilmek için bu belleği ayırmalıdır. –

cevap

1

Bu gereksinimi karşılamak için yalnızca 64 bayt hizalamaya ihtiyacınız vardır, örn. statik hafıza gereksinimleri düşük olduğundan tüm,

uint8_t a[54] __attribute__ ((aligned(64))); 
+1

Bu, bellek kapsayıcısını artırabilir çünkü bağlayıcı, denetleyicinin belleğine girişleri yeniden düzenlemek için yeterince akıllı olduğunu düşünmüyorum. –

0

Ben AVR mikrodenetleyiciler hakkında hiçbir şey bilmiyorum, ama, genel olarak, statik değişkenler genellikle yürütülebilir veri bölümünde yerleştirilir konuşma ve: bu çalışması gerekir Veri bölümünün 256 bayt hizalanmış olduğundan emin olmanız gerekir. (Varsayılan olarak bu olabilir. X86'da, genellikle budur.) Bağlayıcı seçeneklerini gözden geçirin ...

+1

Kitaplığımla bağlantılı başka bir kod daha statik bellek ayırdığında ne olur? Her şey .bss'e gider ve benim küçük dizim bütün bölümün herhangi bir yerine taşındı, değil mi? – cube

+0

Yapabilecekleriniz, kendi bölümüne koyup linker komut dosyasındaki özel bölümdeki hizalamayı sağlamaktır. Ama muhtemelen bellek tasarrufu için çimdik gerekiyorsa buna değer. –

İlgili konular