MSP430 - staly adres zmiennej - inicjalizacja
Masz problem? Zapytaj na forum elektroda.pl
From: "ymko" <tymkoo_at_nospam_gmail.com>
Subject: MSP430 - staly adres zmiennej - inicjalizacja
Date: 25 Jul 2006 10:38:54 -0700
Chcialbym uzywajac kompilatora IAR zadeklarowac 'segment' ( w C nie
ma scisle takiego pojecia ) danych w pamieci flash - rodzaj
DataFlash. Mialby to byc zbi=F3r zmiennych przylegajacych do siebie w
pamieci, z kt=F3rych mozna by np. wyznaczyc CRC. Konkretna
lokalizacja zapewniana dyrektywa _at_nospam_ w IAR, pozwala latwiej oblugiwac
taki segment danych i zmniejsza prawdopodobienstwo przypadkowego
uszkodzenia fragmentu programu podczas zapisu. Jednak nie jest mozliwa
inicjalizacja z poziomu deklaracji w C. Jakies pomysly na
realizacje? Moze inne kompilatory pozwalaja w wygodny spos=F3b
rozwiazac taki problem?
From: "Jacek M." <tymkonto_at_nospam_poczta.onet.pl>
Subject: Re: MSP430 - staly adres zmiennej - inicjalizacja
Date: Tue, 25 Jul 2006 19:43:41 +0200
Chcialbym uzywajac kompilatora IAR zadeklarowac 'segment' ( w C nie
ma scisle takiego pojecia ) danych w pamieci flash - rodzaj
DataFlash. Mialby to byc zbiór zmiennych przylegajacych do siebie w
pamieci, z których mozna by np. wyznaczyc CRC.
To moze uzyj struktury albo wskaznikow do fizycznych wskaznikow
Konkretna
lokalizacja zapewniana dyrektywa _at_nospam_ w IAR, pozwala latwiej oblugiwac
taki segment danych i zmniejsza prawdopodobienstwo przypadkowego
uszkodzenia fragmentu programu podczas zapisu. Jednak nie jest mozliwa
inicjalizacja z poziomu deklaracji w C. Jakies pomysly na
realizacje? Moze inne kompilatory pozwalaja w wygodny sposób
rozwiazac taki problem?
From: "Jacek M." <tymkonto_at_nospam_poczta.onet.pl>
Subject: Re: MSP430 - staly adres zmiennej - inicjalizacja
Date: Tue, 25 Jul 2006 19:48:32 +0200
Chcialbym uzywajac kompilatora IAR zadeklarowac 'segment' ( w C nie
ma scisle takiego pojecia ) danych w pamieci flash - rodzaj
DataFlash. Mialby to byc zbiór zmiennych przylegajacych do siebie w
pamieci, z których mozna by np. wyznaczyc CRC.
To moze uzyj struktury albo wskaznikow do fizycznych wskaznikow
Konkretna
lokalizacja zapewniana dyrektywa _at_nospam_ w IAR, pozwala latwiej oblugiwac
taki segment danych i zmniejsza prawdopodobienstwo przypadkowego
uszkodzenia fragmentu programu podczas zapisu. Jednak nie jest mozliwa
inicjalizacja z poziomu deklaracji w C. Jakies pomysly na
realizacje? Moze inne kompilatory pozwalaja w wygodny sposób
rozwiazac taki problem?
Przepraszam, wyslane omylkowo.
Jacek M.
From: "Jacek M." <tymkonto_at_nospam_poczta.onet.pl>
Subject: Re: MSP430 - staly adres zmiennej - inicjalizacja
Date: Tue, 25 Jul 2006 20:26:56 +0200
Chcialbym uzywajac kompilatora IAR zadeklarowac 'segment' ( w C nie
ma scisle takiego pojecia ) danych w pamieci flash - rodzaj
DataFlash. Mialby to byc zbiór zmiennych przylegajacych do siebie w
pamieci, z których mozna by np. wyznaczyc CRC. Konkretna
lokalizacja zapewniana dyrektywa _at_nospam_ w IAR, pozwala latwiej oblugiwac
taki segment danych i zmniejsza prawdopodobienstwo przypadkowego
uszkodzenia fragmentu programu podczas zapisu. Jednak nie jest mozliwa
inicjalizacja z poziomu deklaracji w C.
Przepraszam za wczesniejsze, omylkowe posty. Ja zadeklarowalbym wskaznik na
char i wpisalbym do niego adres pierwszej komorki pamieci A tak:
char *ptr =*ptrs= &A;
Wskaznik ten po kazdym zapisie inkrementowalbym go za pomoca sizeof(). W
przypadku wielokrotnego zapisu do tej samej komorki i znanych zmiennych
zdefiniowalbym typ struktury zawierajacy wszystkie te zmienne. W ten sposob
nie grozi ci nadpisanie zmiennej a po odjeciu powyzszych wskaznikow masz od
razu ilosc bajtow do liczenia CRC.
To pomysl, ktory przychodzi mi do glowy "na goraco".
Jacek M.
From: "ymko" <tymkoo_at_nospam_gmail.com>
Subject: Re: MSP430 - staly adres zmiennej - inicjalizacja
Date: 25 Jul 2006 12:27:43 -0700
Jacek M. napisa=B3(a):
... Ja zadeklarowalbym wskaznik na
char i wpisalbym do niego adres pierwszej komorki pamieci A tak:
char *ptr =3D*ptrs=3D &A;
T=EA definicj=EA niebardzo rozumiem, cho=E6 ide=EA owszem. Z tym nie ma
problemu, tylko
kwestia 'posadzenia' tych zmiennych w konkretnym miejscu pamieci i
inicjalizacji ich
zdefiniowalbym typ struktury zawierajacy wszystkie te zmienne.
Mi te=BF przychodzi=B3o do g=B3owy to rozwi=B1zanie i narazie jest
najbardziej eleganckie, cho=E6
dalej kwestia inicjalizacji. Kompilator nie pozwala inicjalizowa=E6
zmiennych o sztywno ustalonym adresie.
From: "Jacek M." <tymkonto_at_nospam_poczta.onet.pl>
Subject: Re: MSP430 - staly adres zmiennej - inicjalizacja
Date: Tue, 25 Jul 2006 22:04:19 +0200
char i wpisalbym do niego adres pierwszej komorki pamieci A tak:
char *ptr =*ptrs= &A;
Tę definicję niebardzo rozumiem, choć ideę owszem. Z tym nie ma
problemu, tylko
'A' to jest zmienna zdefiniowana w pamieci (na poczatek obszaru) z ktorej
chcesz liczyc CRC np za pomoca dyrektywy _at_nospam_ (sam o tym wspominales) a
powyzsza definicja wskaznikow oznacza wpisanie adresu 'A' do nich obu. Nie
wszystkie kompilatory pozwalaja na taka konstrukcje, ale jesli IAR nie
mozesz to zrobic tak:
char *ptr = &A, *ptrs= &A;
kwestia 'posadzenia' tych zmiennych w konkretnym miejscu pamieci i
inicjalizacji ich
zdefiniowalbym typ struktury zawierajacy wszystkie te zmienne.
Mi też przychodziło do głowy to rozwiązanie i narazie jest
najbardziej eleganckie, choć
dalej kwestia inicjalizacji. Kompilator nie pozwala inicjalizować
zmiennych o sztywno ustalonym adresie.
TE ZMIENNE SA WSKAZNIKAMI, NIE ZAPOMINAJ O TYM.
Czy to oznacza, ze kompilator nie pozwala na wpisywania do wskaznika
wartosci konkretnych adresow? Jakos nie chce mi sie w to wierzyc. To jest
podstawowa konstrukcja wedlug normy ANSI. Jesli jednak nie mozesz
inicjalizowac wskaznika to mozesz wpisac do niego konkretny adres zmiennej
pozniej:
ptr = &A;
Po wpisaniu wartosci adresu startowego do tych obu wskaznikow uzywasz ptr
poprzez rzutowanie wskaznika.
'ptrs' sluzy do obliczenia ilosci zmiennych do liczenia CRC
Pozdrawiam
Jacek M.
From: "ymko" <tymkoo_at_nospam_gmail.com>
Subject: Re: MSP430 - staly adres zmiennej - inicjalizacja
Date: 25 Jul 2006 15:42:22 -0700
Mam wra=BFenie =BFe nie do ko=F1ca sie rozumiemy. Potrafi=EA si=EA
pos=B3ugiwa=E6 wska=BCnikami, wiem =BFe mo=BFna sobie wy=B3uskiwa=E6 r=F3=
=BFne
adresy zmiennych i bawi=E6 sie nimi.
Chodzi o nast=EApuj=B1cy mechanizm :
1=2Ezmienne maj=B1 znajdowa=E6 sie w obszarze flash. Maj=B1 znajdowa=E6 si=
=EA
w jednym, ci=B1g=B3ym bloku.
2=2EZmienna musi by=E6 zainicjalizowana. Nie chce mi sie na piechot=EA -
u=BFywaj=B1c specjalnego api - wpisywa=E6 do ka=BFdej zmiennej gdzie=B6
zadeklarowanej warto=B6ci
3=2ENajlepiej by zmienne znajdowa=B3y si=EA w sztywno okre=B6lonym obszarze
(dyrektywa _at_nospam_). Takich zmiennych nie wolno inicjalizowa=E6. (zmiennych!
wska=BCniki na ten obszar jak najbardziej).
Jak zatem zmusi=E6 kompilator do zainicjalizowania zmiennych w obszarze
flash?
Oto jest problem :)
Sprawa oczywista =BFe zmienna z kwalifikatorem const l=B1duje we flash
(=B3adnie zainicjalizowana). Tylko po to przenosz=EA zmienne w pewien
ustalony adres, by wiedzie=E6 gdzie one dok=B3adnie s=B1, a nie martwi=E6
sie gdzie wrzuci=B3 je kompilator.
From: "abert zielonka" <grzegorz.domagata_at_nospam_chello.at>
Subject: Re: MSP430 - staly adres zmiennej - inicjalizacja
Date: 26 Jul 2006 02:43:53 -0700
ymko schrieb:
Jak zatem zmusi=E6 kompilator do zainicjalizowania zmiennych w obszarze
flash?
Oto jest problem :)
Sprawa oczywista =BFe zmienna z kwalifikatorem const l=B1duje we flash
(=B3adnie zainicjalizowana). Tylko po to przenosz=EA zmienne w pewien
ustalony adres, by wiedzie=E6 gdzie one dok=B3adnie s=B1, a nie martwi=E6
sie gdzie wrzuci=B3 je kompilator.
Nie znam kompilatora do AVR - ale kompilatory C maja zwykle "link
command file" - mozna tam zdefiniowac pod jakie adresy maja byc
ladowane poszczegolne typy danych i definowac bloki pamieci - w pliku
*=2Ec przed daklaracja zmiennej wskazuje sie w jakim bloku ma sie
znalezc. Jak dokladnie sie to robi - musisz przeczytac w dekumentacji
twojego kompilatora. Szybkie zapytanie googla o "AVR link command file"
wyrzucilo http://www.atmel.com/dyn/resources/prod_documents/DOC1079.PDF
GRG
From: "ymko" <tymkoo_at_nospam_gmail.com>
Subject: Re: MSP430 - staly adres zmiennej - inicjalizacja
Date: 26 Jul 2006 08:32:34 -0700
abert zielonka napisa=B3(a):
=2E..kompilatory C maja zwykle "link
command file" - mozna tam zdefiniowac pod jakie adresy maja byc
ladowane poszczegolne typy danych i definowac bloki pamieci...
To jaki=B6 konkretny pomys=B3, musz=EA gruntownie si=EA przyj=BFe=E6. Dzi=
=EAki!
Date: Tue, 25 Jul 2006 21:51:43 +0200
From: =?ISO-8859-2?Q?Adam_G=F3rski?=
Subject: Re: MSP430 - staly adres zmiennej - inicjalizacja
Użytkownik ymko napisał:
Chcialbym uzywajac kompilatora IAR zadeklarowac 'segment' ( w C nie
ma scisle takiego pojecia ) danych w pamieci flash - rodzaj
DataFlash. Mialby to byc zbiór zmiennych przylegajacych do siebie w
pamieci, z których mozna by np. wyznaczyc CRC. Konkretna
lokalizacja zapewniana dyrektywa _at_nospam_ w IAR, pozwala latwiej oblugiwac
taki segment danych i zmniejsza prawdopodobienstwo przypadkowego
uszkodzenia fragmentu programu podczas zapisu. Jednak nie jest mozliwa
inicjalizacja z poziomu deklaracji w C. Jakies pomysly na
realizacje? Moze inne kompilatory pozwalaja w wygodny sposób
rozwiazac taki problem?
OCzywiście że w IAR C można zadeklarować w C zmienne pod stałym adresem
Ale o co chodzi konkretnie?
Adam