2010-10-13 9 views
5

Czy można utworzyć tablicę, która nie przekracza granicy 256 bajtów? To znaczy, że adresy poszczególnych elementów tablicy różnią się tylko dolnym bajtem. Jest to słabsze wymaganie niż utrzymanie wyrównania tablicy do 256 bajtów. Jedyne rozwiązanie, jakie mogłem wymyślić, to dopasowanie do next_power_of_two(sizeof(array)), ale nie jestem pewien co do luk, które pojawiłyby się w ten sposób.Tablica nie przekraczająca granicę 256 bajtów

Jest to biblioteka dla mikrokontrolerów AVR, a to zaoszczędziłoby mi kilka cennych instrukcji w obsłudze przerwań. Tablica, która powinna mieć tę właściwość, ma 54 bajty na około 80 bajtów całkowitej pamięci statycznej używanej przez biblioteka. Szukam sposobu, który nie zwiększa wymagań pamięci.

Używam avr-as asembler gnu i linkera avr-ld.

Przykład: jeśli tablica zaczyna się od adresu 0x00f0, wówczas wyższe słowo zmieni się z 0x00 na 0x01 podczas przechodzenia przez tablicę.

Nie obchodzi mnie, czy zaczyna się pod adresem 0x0100 lub 0x0101, o ile nie przekracza granicy.

+0

Musisz zachować adres tablicy wyrównany? W jaki sposób zmniejsza to liczbę instrukcji, ponieważ już wiesz, że tablica ma <= 256 elementów? – MSN

+0

Nie muszę utrzymywać wyrównania. Zobacz przykład dodany. – cube

+1

Pamiętaj jednak, że zachowanie tablicy wyrównane do granicy ** 64 ** bajtów spełni twoje wymagania - twój linker * powinien * mieć możliwość sortowania tych alokacji, aby nie marnować pamięci. –

Odpowiedz

1

Aby spełnić to wymaganie, potrzebujesz tylko 64 bajtowego wyrównania, np. to powinno działać:

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

Może to zwiększyć ilość pamięci, ponieważ nie sądzę, że linker jest wystarczająco inteligentny, aby zmienić kolejność wpisów .bss w pamięci conservera. –

0

Nie wiem nic na temat mikrokontrolerów AVR wiedzieć, ale ogólnie rzecz biorąc, zmienne statyczne są zwykle umieszczone w sekcji danych pliku wykonywalnego, a ponieważ twoje statyczne wymagania dotyczące pamięci są niskie, wszystko musisz upewnić się, że sekcja danych jest wyrównana do 256 bajtów. (Które może być domyślnie. Na x86, zazwyczaj jest.) Sprawdź opcje linkera ...

+1

Co się stanie, gdy jakiś inny kod powiązany z moją biblioteką przydzieli więcej pamięci statycznej? Wszystko idzie do .bss i moja mała tablica zostaje przeniesiona gdziekolwiek w całej sekcji, prawda? – cube

+0

Co można zrobić, to umieścić go we własnej sekcji i zapewnić wyrównanie w specjalnej sekcji w pliku poleceń łącznika. Ale prawdopodobnie tylko warto, jeśli trzeba go poprawić, by zaoszczędzić pamięć. –

Powiązane problemy