Witam Czy jest co¶ w stylu printf_P(PSTR("hello")) w IAR dla ARMów? printf mi dzia³a dobrze ale chcia³bym alby texty by³y w pamiêci programu.
Jak to zrobiæ ?
Pozdrawiam Janusz Brela
Witam Czy jest co¶ w stylu printf_P(PSTR("hello")) w IAR dla ARMów? printf mi dzia³a dobrze ale chcia³bym alby texty by³y w pamiêci programu.
Jak to zrobiæ ?
Pozdrawiam Janusz Brela
Janusz pisze:
A skąd wytrzasłeś coś takiego jak printf_P, bo w bibliotece standardowej czegoś takiego nie ma. Co ta funkcja ma robić?
Po pamięci możesz pisać funkcją z biblioteki standardowej o nazwie sprintf.
pzdr mk
U¿ytkownik "mk" <REVERSE snipped-for-privacy@myzskm.REMOVE napisa³ w wiadomo¶ci news:flfn50$apo$ snipped-for-privacy@news.wp.pl...
Chyba kolega nie przeczyta³ do koñca. Chodzi o funkcjê wy¶wietlaj±c± napis z pamiêci programu.
Janusz pisze:
a może: char * const tekst = "Do kompilatora -> To ma byc w pamieci programu"; .... printf("%s",tekst);
adam
Dnia 2008-01-02 12:05, Użytkownik Janusz napisał :
pytanie tylko czy w ARM-ach takie rozróżnienie ma sens? Przecież w nich te obszary nie są rozdzielone w sposób wymagający innego rodzaju adresowania, tak jak to mam miejsce w AVR?
Pozdr. Michał
Janusz pisze:
Funkcja printf_P i makro PSTR to "wynalazki" specyficzne dla avr-gcc i w ogóle platformy AVR, gdzie są rozdzielone obszary adresowe pamięci programu i danych. I trzeba właśnie robić takie sztuczki aby wypisać ciąg znaków z pamięci programu.
W platformie ARM (np. w kompilatorze arm-elf-gcc) piszesz normalnie: printf ("ABCD"); i ciąg znaków zostanie umieszczony w sekcji stałych (.rodata). Gdzie tą sekcję fizycznie wsadzisz to już twoja sprawa i zawartości pliku sterującego linkowaniem. Jeżeli program wciśniesz np. w procesor z pamięcią Flash (przykładowo AT91SAM7S256) to i ciąg znaków będzie tam zawarty. Domyślnie sekcje .text i .rodata umieszcza się w pamięci stałej, a sekcje .bss i .data w pamięci RAM.
Pewnie IAR ma podobnie, ale dlaczego boisz się użyć gcc (np. z pakietu gnuarm)?
Górski Adam pisze:
Napisanie ciągu znaków w cudzysłowach (tak jak powyżej "%s") już wystarczy aby kompilator umieścił go w sekcji .rodata czyli w pamięci niezmienianej podczas działania programu (np. Flash).
ja siê nie boje nawet bardzo mi sie podoba³ (WinAvr) ale nasi "górowie" od programowania w pracy wol± IAR bo "lepszy".
dziêkuje za odpowied¼
Pozdrawiam Janusz Brela
Górski Adam pisze:
Chyba miał być wskaźnik na stały char, a nie stały wskaźnik na char...
pzdr mk
Janusz pisze:
W takim razie poproszę o rozwinięcie tematu: ARM IAR jest gorszy od arm-gcc ponieważ... Proszę pominąć wątek pt. "koszty zakupu", albo przynajmniej rozpatrywać go w kontekście całkowitych kosztów użytkowania.
pzdr mk
mk pisze:
jedyne co mi przychodzi tak na szybkiego do glowy to ... obsluguje "bez kombinacji alpejskiej" rdzenie Cortex
Adam Dybkowski pisze:
Ja używałem zarówno GCC+Eclipse oraz IAR. Może to nie do końca to samo bo to dla MSP430, ale moge porownac jakosc kodu z GCC i IAR.
IAR wypada dużo lepiej pod względem optymalizacji kodu. Ten sam kod zajmuje dużo mniej miejsca ( optymalizacja na rozmiar ).
Adam
mk pisze:
Racja powinno byc: char * const tekst const = "Do kompilatora -> To ma byc w pamieci programu";
Czyli stały wskaznik do stalej
Adam
Górski Adam pisze:
Coś tu jest nie tak ;-)
pzdr mk
mk pisze:
Tak ? a co ? Jeśli łaska oczywiście.
Adam
Górski Adam pisze:
To nie jest poprawna konstrukcja w języku C, ani C++. Jeżeli chcesz stały wskaźnik do stałej to powinno być:
const char * const tekst = ....
pzdr mk
mk pisze:
A jakie ma const dowiazanie - lewe czy prawe ?
Adam
In the darkest hour on Mon, 07 Jan 2008 16:52:42 +0100, Górski Adam <gorskia@> screamed:
const _foo_
Artur M. Piwko pisze:
A na jakiej podstawie ?
Adam
N.p. ISO/IEC 9899:1999 paragraf 6.7.5.1
Have something to add? Share your thoughts — no account required.
Ask the community — no account required