MSP430 - staly adres zmiennej - inicjalizacja
ymko - 15-08-2006 19:30
MSP430 - staly adres zmiennej - inicjalizacja 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 @ 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?
Jacek M. - 15-08-2006 19:30
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 @ 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?
Jacek M. - 15-08-2006 19:30
> 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 @ 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.
Jacek M. - 15-08-2006 19:30
> 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 @ 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.
ymko - 15-08-2006 19:30
Jacek M. napisał(a):
> ... Ja zadeklarowalbym wskaznik na
> 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
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.
Adam Górski - 15-08-2006 19:30
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 @ 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
Jacek M. - 15-08-2006 19:30
>> 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 @ (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.
ymko - 15-08-2006 19:30
Mam wrażenie że nie do końca sie rozumiemy. Potrafię się
posługiwać wskaźnikami, wiem że można sobie wyłuskiwać różne
adresy zmiennych i bawić sie nimi.
Chodzi o następujący mechanizm :
1.zmienne mają znajdować sie w obszarze flash. Mają znajdować się
w jednym, ciągłym bloku.
2.Zmienna musi być zainicjalizowana. Nie chce mi sie na piechotę -
używając specjalnego api - wpisywać do każdej zmiennej gdzieś
zadeklarowanej wartości
3.Najlepiej by zmienne znajdowały się w sztywno określonym obszarze
(dyrektywa @). Takich zmiennych nie wolno inicjalizować. (zmiennych!
wskaźniki na ten obszar jak najbardziej).
Jak zatem zmusić kompilator do zainicjalizowania zmiennych w obszarze
flash?
Oto jest problem :)
Sprawa oczywista że zmienna z kwalifikatorem const ląduje we flash
(ładnie zainicjalizowana). Tylko po to przenoszę zmienne w pewien
ustalony adres, by wiedzieć gdzie one dokładnie są, a nie martwić
sie gdzie wrzucił je kompilator.
abert zielonka - 15-08-2006 19:30
ymko schrieb:
>
> Jak zatem zmusić kompilator do zainicjalizowania zmiennych w obszarze
> flash?
> Oto jest problem :)
> Sprawa oczywista że zmienna z kwalifikatorem const ląduje we flash
> (ładnie zainicjalizowana). Tylko po to przenoszę zmienne w pewien
> ustalony adres, by wiedzieć gdzie one dokładnie są, a nie martwić
> sie gdzie wrzucił 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
*.c 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/p...ts/DOC1079.PDFGRG
ymko - 15-08-2006 19:30
abert zielonka napisał(a):
>...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ś konkretny pomysł, muszę gruntownie się przyjżeć. Dzięki!
zanotowane.pldoc.pisz.plpdf.pisz.plkonstruktor.keep.pl