ymko
Guest
Tue Jul 25, 2006 5:38 pm
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.
Guest
Tue Jul 25, 2006 5:43 pm
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.
Guest
Tue Jul 25, 2006 5:48 pm
Quote:
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.
Guest
Tue Jul 25, 2006 6:26 pm
Quote:
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
Guest
Tue Jul 25, 2006 7:27 pm
Jacek M. napisał(a):
Quote:
... 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
Quote:
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
Guest
Tue Jul 25, 2006 7:51 pm
Użytkownik ymko napisał:
Quote:
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.
Guest
Tue Jul 25, 2006 8:04 pm
Quote:
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;
Quote:
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
Guest
Tue Jul 25, 2006 10:42 pm
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
Guest
Wed Jul 26, 2006 9:43 am
ymko schrieb:
Quote:
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/prod_documents/DOC1079.PDF
GRG
ymko
Guest
Wed Jul 26, 2006 3:32 pm
abert zielonka napisał(a):
Quote:
...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!