ARM iar printf

Jan 02, 2008 23 Replies

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required