RTV forum PL | NewsGroups PL

Jak zadeklarować ciągły obszar pamięci dla tablic w C w AVRSTUDIO?

AVRSTUDIO

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak zadeklarować ciągły obszar pamięci dla tablic w C w AVRSTUDIO?

Lelek@
Guest

Thu Jul 14, 2011 5:25 am   



Pytanko,

mam kilka tablic

unsigned char A[100], B32, C[128]... i tak z 1kB tego

Co zrobić żeby te tablice zajmowały ciągły obszar pamięci tak żebym sobie
mógł użyć tego obszaru "od święta" ale w całości i przelechać się po nim
wskaźnikiem?
Te tablice są zupełnie niezwiązane ze sobą i jedne są uchar a inne uint i
jeszcze coś int tam jest.

Tylko struktura i czy czy ona mi zagwarantuje ciągłość ? A może jakieś
atrybuty/dyrektywy?

Zbych
Guest

Thu Jul 14, 2011 6:07 am   



W dniu 2011-07-14 07:25, Lelek@ pisze:
Quote:
Pytanko,

mam kilka tablic

unsigned char A[100], B32, C[128]... i tak z 1kB tego

Co zrobić żeby te tablice zajmowały ciągły obszar pamięci tak żebym
sobie mógł użyć tego obszaru "od święta" ale w całości i przelechać się
po nim wskaźnikiem?
Te tablice są zupełnie niezwiązane ze sobą i jedne są uchar a inne uint
i jeszcze coś int tam jest.

Tylko struktura i czy czy ona mi zagwarantuje ciągłość ? A może jakieś
atrybuty/dyrektywy?

Sama struktura w ogólności nie gwarantuje ciągłości (człowiek nawet nie
poczuje jak mu się zrymuje), bo dochodzi jeszcze coś takiego jak
wyrównanie adresów (padding po polsku) dla zmiennych wielobajtowych (np.
int). Na avr nie powinieneś mieć z tym problemu jeśli do opcji
kompilacji jest dodawane -fpack-struct, albo użyjesz atrybutu packed
przy strukturze.

Lelek@
Guest

Thu Jul 14, 2011 6:22 am   



"Zbych" <abuse@onet.pl> wrote in message
news:4e1e8792$0$3502$65785112@news.neostrada.pl...
Quote:
W dniu 2011-07-14 07:25, Lelek@ pisze:

Sama struktura w ogólności nie gwarantuje ciągłości (człowiek nawet nie
poczuje jak mu się zrymuje), bo dochodzi jeszcze coś takiego jak
wyrównanie adresów (padding po polsku) dla zmiennych wielobajtowych (np.
int). Na avr nie powinieneś mieć z tym problemu jeśli do opcji kompilacji
jest dodawane -fpack-struct, albo użyjesz atrybutu packed przy strukturze.

A nie można zmusić tych tablic jakimś atrybutem żeby jedna za drugą sie
ustawiły w ramie?
mam już napisany program i teraz przyszła mi ochota na chwilowy bufor 1kB
ale nie mam tego 1kilo, a tablice są niepotrzebne w chwili używania tego
obszaru jako bufor.
W asm to nie ma kłopotu. .org i jazada.

Zbych
Guest

Thu Jul 14, 2011 6:32 am   



W dniu 2011-07-14 08:22, Lelek@ pisze:
Quote:

"Zbych" <abuse@onet.pl> wrote in message
news:4e1e8792$0$3502$65785112@news.neostrada.pl...
W dniu 2011-07-14 07:25, Lelek@ pisze:

Sama struktura w ogólności nie gwarantuje ciągłości (człowiek nawet
nie poczuje jak mu się zrymuje), bo dochodzi jeszcze coś takiego jak
wyrównanie adresów (padding po polsku) dla zmiennych wielobajtowych
(np. int). Na avr nie powinieneś mieć z tym problemu jeśli do opcji
kompilacji jest dodawane -fpack-struct, albo użyjesz atrybutu packed
przy strukturze.

A nie można zmusić tych tablic jakimś atrybutem żeby jedna za drugą sie
ustawiły w ramie?
mam już napisany program i teraz przyszła mi ochota na chwilowy bufor
1kB ale nie mam tego 1kilo, a tablice są niepotrzebne w chwili używania
tego obszaru jako bufor.
W asm to nie ma kłopotu. .org i jazada.

A w gcc to byś musiał dodać osobne sekcje w RAMie do skryptu linkera a
potem atrybutem section wstawić daną tablicę do odpowiedniej sekcji
(niektóre kompilatory używają @ do określania adresów zmiennych, ale gcc
do nich nie należy). Mniej pracy będzie kosztowało wsadzenie tych tablic
do struktury.

Jacek Radzikowski
Guest

Thu Jul 14, 2011 6:36 am   



On 07/14/2011 02:22 AM, Lelek@ wrote:
Quote:
A nie można zmusić tych tablic jakimś atrybutem żeby jedna za drugą sie
ustawiły w ramie?
mam już napisany program i teraz przyszła mi ochota na chwilowy bufor
1kB ale nie mam tego 1kilo, a tablice są niepotrzebne w chwili używania
tego obszaru jako bufor.
W asm to nie ma kłopotu. .org i jazada.

W C od tego masz unie. W gcc powinno zadziałać coś takiego:
union
{
unsigned char bigtable[1000];
struct
{
unsigned char A[100];
unsigned char B[200];
unsigned char C[700];
} __attribute__ ((packed)) smalltables;
} data;


Do przestrzeni liniowej odwołujesz się przez data.bigtable[], a do
małych tablic przez data.smalltables.A[] itd.
Deklaracja powinna też zadziałać bez atrybutu packed, ale dla świętego
spokoju lepiej go zostaw.


pzdr.
j.

Artur M. Piwko
Guest

Thu Jul 14, 2011 7:06 am   



In the darkest hour on Thu, 14 Jul 2011 08:07:16 +0200,
Zbych <abuse@onet.pl> screamed:
Quote:
Co zrobić żeby te tablice zajmowały ciągły obszar pamięci tak żebym
sobie mógł użyć tego obszaru "od święta" ale w całości i przelechać się
po nim wskaźnikiem?
Te tablice są zupełnie niezwiązane ze sobą i jedne są uchar a inne uint
i jeszcze coś int tam jest.

Tylko struktura i czy czy ona mi zagwarantuje ciągłość ? A może jakieś
atrybuty/dyrektywy?

Sama struktura w ogólności nie gwarantuje ciągłości (człowiek nawet nie
poczuje jak mu się zrymuje), bo dochodzi jeszcze coś takiego jak
wyrównanie adresów (padding po polsku) dla zmiennych wielobajtowych (np.
int). Na avr nie powinieneś mieć z tym problemu jeśli do opcji
kompilacji jest dodawane -fpack-struct, albo użyjesz atrybutu packed
przy strukturze.


Ewentualnie jedna wielka tablica i wskaźniki do indeksów.

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:228B ]
[ 09:05:58 user up 12863 days, 21:00, 1 user, load average: 0.99, 0.81, 0.01 ]

An atheist is a man with no invisible means of support.

Konop
Guest

Thu Jul 14, 2011 3:58 pm   



W dniu 14.07.2011 08:22, Lelek@ pisze:
Quote:

"Zbych" <abuse@onet.pl> wrote in message
news:4e1e8792$0$3502$65785112@news.neostrada.pl...
W dniu 2011-07-14 07:25, Lelek@ pisze:

Sama struktura w ogólności nie gwarantuje ciągłości (człowiek nawet
nie poczuje jak mu się zrymuje), bo dochodzi jeszcze coś takiego jak
wyrównanie adresów (padding po polsku) dla zmiennych wielobajtowych
(np. int). Na avr nie powinieneś mieć z tym problemu jeśli do opcji
kompilacji jest dodawane -fpack-struct, albo użyjesz atrybutu packed
przy strukturze.

A nie można zmusić tych tablic jakimś atrybutem żeby jedna za drugą sie
ustawiły w ramie?
mam już napisany program i teraz przyszła mi ochota na chwilowy bufor
1kB ale nie mam tego 1kilo, a tablice są niepotrzebne w chwili używania
tego obszaru jako bufor.

unsigned char Bufor[1024];

//unsigned char A[128];
unsigned char *A = &Bufor[0]

//unsigned int B[32];
unsigned int *B = (unsigned int *) &Bufor[128];

//unsigned int char C[16];
unsigned char *C = &Bufor[192];

i dalej możesz spokojnie używać zapisów:
A[3] = 5;
for (i=0;i<32;i++) B[i] = 0;
if(C[4] >= 10) ...

ALE!! Uwaga!! Zapisy typu sizeof(A) na pewno Ci nie zwrócą wielkości
tablicy A, bo kompilator nawet nie wie, ile ona zajmuje!! Pomijając
fakt, że zmiana rozmiaru pierwszej tablicy pociąga za sobą konieczność
korekty pozostałych, choć to możesz ominąć odpowiednimi dyrektywami
#define... Ale z tym powalcz już sam Wink...
Tak czy siak - ja bym tak napisał program tylko, jeśli chciałbym komuś
uprzykrzyć życie... w przeciwnym wypadku stosowałbym struktury!! Co do
tego, czy są ciągłe - w 8-bitowcu właściwie na pewno, poza tym, jeśli
nie są, to miejsce pomiędzy nimi jest "puste", więc nic nie stoi na
przeszkodzie, aby je wykorzystać.
Np.
struct {
unsigned char A[130];
unsigned int B[32];
unsigned char C[16];
} _s;

i możesz spokojnie odwoływać się do:
_s[140] bez obawy, że wyjedziesz poza obszar struktury _s.


--
Pozdrawiam
Konop

Lelek@
Guest

Fri Jul 15, 2011 2:42 am   



"Konop" <konoppo@gazeta.pl> wrote in message
news:ivn3mo$p4k$1@inews.gazeta.pl...

Quote:
i możesz spokojnie odwoływać się do:
_s[140] bez obawy, że wyjedziesz poza obszar struktury _s.

no dzięki Panowie Smile Wzdrgam się przed przerabianiem tego Smile Ale muszę do
tego przysiąść Smile
Mam na razie "zmarnowane" 844B, bo nie zamierzałęm wcześniej robić takiego
bufora do chwilowego uzycia.
Chyba następnym razem bedę grupował tablice na potrzebne i czasem zbędne i
od razu w strukturę.

Szkoda, że nie można po prostu ustawić ich kolejno i __attribute__ costam
Smile

Artur M. Piwko
Guest

Fri Jul 15, 2011 1:46 pm   



In the darkest hour on Fri, 15 Jul 2011 04:42:15 +0200,
Lelek@ <rennes@iw.iw> screamed:
Quote:
i możesz spokojnie odwoływać się do:
_s[140] bez obawy, że wyjedziesz poza obszar struktury _s.

no dzięki Panowie Smile Wzdrgam się przed przerabianiem tego Smile Ale muszę do
tego przysiąść Smile
Mam na razie "zmarnowane" 844B, bo nie zamierzałęm wcześniej robić takiego
bufora do chwilowego uzycia.
Chyba następnym razem bedę grupował tablice na potrzebne i czasem zbędne i
od razu w strukturę.

Szkoda, że nie można po prostu ustawić ich kolejno i __attribute__ costam
:-)


Z wszystkich propozycji wybrałbym jednak tę opartą o unię.

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:219B ]
[ 15:46:11 user up 12864 days, 3:41, 1 user, load average: 0.97, 0.71, 0.04 ]

Terminal glare: A look that kills...

Michoo
Guest

Fri Jul 15, 2011 2:12 pm   



W dniu 15.07.2011 04:42, Lelek@ pisze:
Quote:
"Konop" <konoppo@gazeta.pl> wrote in message
news:ivn3mo$p4k$1@inews.gazeta.pl...
Szkoda, że nie można po prostu ustawić ich kolejno i __attribute__
costam Smile
Możesz ustawić je oddzielnie i dać "extern". A potem ułożyć je w pliku

asm tak jak chcesz.

Możesz też użyć np takiego stm32, gdzie w cenie ~atmegi8 będziesz miał
4k ram.

--
Pozdrawiam
Michoo

elektroda NewsGroups Forum Index - Elektronika Polska - Jak zadeklarować ciągły obszar pamięci dla tablic w C w AVRSTUDIO?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map