MSP430 - staly adres zmiennej - inicjalizacja



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
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?


Poprzedni Następny
Wiadomość
Spis treści
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?



Poprzedni Następny
Wiadomość
Spis treści
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.



Poprzedni Następny
Wiadomość
Spis treści
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.



Poprzedni Następny
Wiadomość
Spis treści
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.


Poprzedni Następny
Wiadomość
Spis treści
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.



Poprzedni Następny
Wiadomość
Spis treści
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.


Poprzedni Następny
Wiadomość
Spis treści
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


Poprzedni Następny
Wiadomość
Spis treści
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!


Poprzedni Następny
Wiadomość
Spis treści
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