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?
MSP430 - staly adres zmiennej - inicjalizacja
Jul 25, 2006
9 Replies
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.
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.
Jacek M. napisał(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
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.
Użytkownik ymko napisał:
OCzywiście że w IAR C można zadeklarować w C zmienne pod stałym adresem Ale o co chodzi konkretnie?
Adam
'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;
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.
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.
ymko schrieb:
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
formatting link
abert zielonka napisał(a):
To jakiś konkretny pomysł, muszę gruntownie się przyjżeć. Dzięki!
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required