cz5 6

cz5 6



Programowanie

Programowanie

listing 29 Pisanie na LCD.

LCDstr("W-jtaj!"); I.CDccrnmand(LCDC_DDA 164) J acostr("Napis z łańcucha");


Listing 34) Wykorzystanie wskatnika. void LCDsir(char* str)

{

while( 0 != *str )

LCDdata (*(sLr++));

ł


Listing 31 Optymalizacja funkcji z listingu 30. void LCDstrCchar* str)

{ char

whileCO != Cznak - *(str++))) ^CDdata(znak);

}


Listing 32 Pisanie na wyświetlaczu bezpośrednio z pamięci programu.

void LCDstr ?(prog char* str)

{

WhileCO I- Cznak -pgni_r ead_byt e Cs t r++) ) ) LCOdata(znak);


Listing 33 Zmiana w funkcji main.

LCDstr_p(PS'I'RC"wi taj 1")); LCDconciandtLCOC DDA| 64) ; r.CDscr_p(psTR("Łańcuch z FLASHa"));


Listing 34 Sposób na pozbycie się zbędnych ostrzeżeń.

L.CDS tr_P ((prog_char*) PS TrC‘Witaj 1 ")>; LCDcommand(l,CDC_DDA| 64) ;

LCDstr_p((prog_char*)pSTR(“Łańcuch z FLASHa"));


Ciąg dalszy ze strony 40.

Spójrz na listing 28. Przedstawiam na nim prostą funkcję wyświetlającą podany łańcuch. Umieść ją pod koniec funkcji dotyczących wyświetlacza - zaraz za funkcją LCDinit. Funkcja nic jest idealna jeśli chodzi o wydajność, jednak jest to bardzo proste rozwiązanie i na pewno działa. Myślę, że po wszystkich informacjach zawartych w ramce o napisach kod nie wymaga już dodatkowych wyjaśnień. Utworzoną właśnie funkcję możemy wywołać w programie jak na listingu 29. Kod ten powinien zastąpić zestaw wywołań funkcji LCDdata pierwotnie umieszczonych w funkcji maili. Dodatkowo wykorzystana została tutaj komenda wywołująca przejście do następnej linii. Bezpośrednie wybranie adresu nie wygląda może tak ładnie jak podanie oddzielnie linii i kolumny, jednak zajmuje mniej zasobów, a nic wymaga wicie więcej uwagi ze strony programisty - wystarczy pamiętać, że nasza druga linia zaczyna się od adresu 64.

Wskaźniki

Sposobem poprawy działania programu jest wykorzystanie większej ilości informacji o wskaźnikach. Jak zwykle w takich momentach odsyłam Cię do stosownej ramki ABC... C. Po jej przeczytaniu listing 30 nic powinien wymagać już tłumaczenia. Program z listingu 30 można jeszcze poprawić. Dzięki temu, żc zmienna lokalna będzie przechowywana cały czas w rejestrze, listing 31 wygeneruje odrobinę mniejszy i szybszy kod.

Wykorzystanie pamięci programu

Domyślasz się zapewne, jaki problem właśnie chcę Ci przedstawić i rozwiązać. Ze sprawą tą radziliśmy sobie już w części 3, gdzie umieszczaliśmy w pamięci danych tablice zawierające dane do sterowania wyświetlaczem.

Jeśli posługujemy się napisami tak jak do tej pory, procesor zawsze przed wywołaniem funkcji stworzy zmienną tymczasową, umieści w niej dane, które przecież skopiować z pamięci programu! Marnujemy więc cenne zasoby pamięci RAM, których w typowym procesorze jest niewiele.

W ramce ABC... C „Łańcuchy w pamięci pro-

graniu” znajdziesz informacje, jak korzystać bezpośrednio z pamięci programu, nic zmniejszając praktycznie wygody pisania kodu. Pod tym względem bardzo wygodne jest, opisane w ramce, makro PSTR.

Przeróbmy teraz funkcję piszącą na wyświetlaczu tak, aby posługiwała się ona napisami umieszczonymi w pamięci programu. Całą, zmienioną już funkcję znajdziesz na listingu 32. Na listingu 33 znajdziesz natomiast konieczną zmianę w funkcji main. Jeśli teraz skompilujesz program, będzie on działał poprawnie, jednak podczas kompilacji zgłoszone zostaną ostrzeżenia: warning: pas-sing arg i of 'LCDstr_P' discards qualiflers from pointer taiget type. Ostrzeżenia te w tym przypadku nie mają dla nas znaczenia. Aby jednak w gąszczu takich ostrzeżeń bez znaczenia nie zgubić czegoś, co jest dla nas ważne, możemy pozbyć się ich za pomocą rzutowania jak na listingu 34. Rzutowanie wykracza poza ramy dzisiejszego odcinka. Dziś powiem więc tylko, że taki zapis, w zasadzie jedyne co robi, to informuje kompilator, że wiemy, iż makro zwraca wskaźnik innego typu, niż wymaga tego funkcja LCDstr P, jednak każemy traktować go tak, jakby byl to wskaźnik na prog_char i nie ostrzegać nas o tym fakcie.

ABC... C Wskaźniki

Idea

Do tej pory powoli oswajałem Cię z istnieniem takiego tworu jak wskaźniki. Może przekonałeś się już, że nie jest; tó nic strasznego - po prostu zmienna zawierająca adres innej zmiennej.

Podstawy

Zmienną wskaźnikową tworzymy jak poniżej: int *pi;

Przykład ten pokazuje utworzenie wskaźnika na zmienną typu int. Można go czytać w mnemotechniczny sposób, że zapis *pi jest traktowany jak zmienna int. Ważne jest to, że aby na wskaźniku można było wykonywać jakiekolwiek operacje, musi on posiadać swój typ. Typ wskaźnika to typ zmiennej, na którą on wskazuje.

Jeśli w programie wykorzystamy teraz zapis: int x; pi = &x;

nasz wskaźnik pi od tej chwili będzie wskazywał na zmienną x. Wykorzystując operator * możemy teraz zmieniać wartość .r poprzez wskaźnik pi:

C*pO = 12;

Nawias nie jest konieczny.

Wskaźniki a tablice

Należy zaznaczyć, że w języku C wskaźniki oraz tablice to bardzo bliscy znajomi. Praktycznie wszystko, co da się zrobić za pomocą tablic, da się wykonać także za pomocą wskaźników, przy czym to drugie rozwiązanie zwykle generuje bardziej optymalny kod.

Podobieństwo między wskaźnikami oraz tablicą widać najbardziej poprzez fakt, żc posługując się nazwą tablicy, posługujemy się wskaźnikiem na jej pierwszy element. Okazuje się, że jeśli w programie stworzymy tablicę i wskaźnik do niej:

uint8_t tablica[10]; uint8_t *wskaznik = tablica; to do czasu, aż nasz wskaźnik przestanie wskazywać na tablicę, oba poniższe zapisy dadzą identyczny efekt: tablica[2] = 1;

wskaznik[2] = 1;

Można obsługiwać wskaźnik jak tablicę, można i w drugą stronę - poniższe zapisy są równoważne z poprzednim kodem: *(tablica+2) = 1;

*(wskaznik+2) = 1;

Jodyną różnicą między naszą tablicą a wskaźnikiem jest to. że od strony maszynowej, jeśli posługujemy się tablicą to w programie pojawia się stała liczba oznaczająca odpowiednią lokację w pamięci. Wskaźnik natomiast jest przechowywaną w pamięci zmienną. Poza różnicą w kodzie maszynowym powoduje to więc. żc o ile tak zwane przesunięcie wskaźnika jest jak najbardziej prawidłowe: wskaźnik -H= 2;

o tyle nie można zapisać wartości do „wskaźnika tablicowego”: tablica 4= 2; //BŁĄD!

Ciąg dalszy w następnej ramce.

Elektronika dla Wszystkich Październik2005 45


Wyszukiwarka

Podobne podstrony:
Image214 Programowanie Programowanie Listing 29 Pisanie na LCD. LCDstr(“Witaj!");
cz5 3 Programowanie Listing 22 LCD: komendy sterujące U Komendy sterujące wyświetlaczem #define
cz5 1 Programowaniew (B W dniu dzisiejszym zmierzymy się z wyświetlaczem alfanumerycznym LCD, co jes
cz5 9 Programowanie wej, makro _SFR_IO_ADDR dokonuje jego zamiany na przestrzeń wejścia-wyjścia - cz
strona Zadanie 29.    bymaniOOtek Na zamieszczonym fragmencie kodu programu napisane
Image34 (9) Programowanie Listing 74 Definicja sprzętowa wyświe/luczu. #define LCD_SX
Image40 (12) Programowanie Listing 90- Elementy dodane do pliku lcd.h. tfinrludp <stdio.h> (..
Image2 Packet-snifTer - jest to program, który jest uruchomiony na jakieś maszynie w sieci i "p
5) Decyzja o przyznaniu Indywidualnego Plan Studiów i Programu Nauczania w tym zgoda na studia międz
2, Programy studiów 1. stopnia W tym rozdziale przedstawione są programy studiów stacjonarnych 1. st
5) Decyzja o przyznaniu Indywidualnego Plan Studiów i Programu Nauczania w tym zgoda na studia międz

więcej podobnych podstron