Zajrzyj tera2 do ramki Plik z danymi lokalnymi. Zgodnie z zawartym lam opisem utworzymy moduł zawierający wszystkie ustawienia językowe. Utwórz nowy plik, zapisz go jako locai.c, dodaj do projektu oraz do plików źródłowych w mokeftle. Aktualnie nic mamy jeszcze żadnych napisów, dodajmy jedynie opis wyglądu naszych znaków specjalnych. Pokazuje to listing 82. Aby teraz było możliwe proste odwołanie się do zmiennych z pliku locai.c, stworzymy plik nagłówkowy, który pokazuje listing 83. Słowo extern pojawia się w kursie po raz pierwszy - po dokładniejsze wyjaśnienia odsyłam do ramki obok. Zauważ, że korzystamy zc zmiennej typu LCD LOCAL PGM, który zdeklarowany został w pliku nagłówkowym led.h. W odróżnieniu do listingu 81 nic dodałem tutaj odpowiedniego nagłówka. Jego dodanie wcale by nie zaszkodziło - jednak chcę Ci pokazać także inne podejście - wszystko będzie działać prawidłowo, jeślii wszędzie, gdzie dołączamy nagłówekl local,h, przed nim znajdzie się dołączenie nagłówka led.h - należy o tym pamiętać.
Listing 78 — Czyszczenie bufora wyświetlaczu.
void Lcd c_s(void)
lcd curpos « 0;
memsetCicd buffer, 1 *, sizeof(lcd buffer));
>
Listing 79 - Ustawianie statusu.
void .ca Setstatus(uint8 t status)
lcd status = status;
inline v/oid lcd updateStatuc(void)
lcd Sendlnsti(LCDC ON | lcd status);
Listing 83 - Plik locaf.h.
#itndef LOCAL_H_INCLUDED
#define local_h_included
extern lcd_local_p(;m loeai_icdap*c[]
#endif // LOCAL_H_INCLUDED
ABC... C
Idea rozwiązania. Plik z danymi lokalnymi
Przez jlcmeniy lokalne będziemy rozumieć takie, które są zależne od języka: wszelkie napisy czy znaki specjalne. Zamiast podawać napisy bezpośrednio w kodzie. stworzymy specjalny p ik. w którym znajdą, się wszystkie nap.sy. Nadajmy im czytelne dlu nas nazwy i korzystajmy z nich w kodzie. To bardzo zdrowy nawyk i warto zacząć go stosować. Dzięki tema zmiana języka, w jakim komunikuje s.ę z nami program, jest bardzo prosta. W skrajnym przypadku będziemy mogli nawet zlecić ją komuś, kin nie zna się na programowaniu.
Wszystkie elementy zależne od języ ka umieścimy w pliku locai.c. Aktualnie będą to „zmienne” umieszczone w pamięci programu. Do „zmiennych” tych będziemy musieli dostać się z poziomu innych plików. ANSII C udostępnia odpowiedni mechanizm, co opisuje ramka o deklaracji typu ertern obok.
Zamiast tworzyć zmienne zawierające napisy, można posłużyć się komendą #defi-ne, aby stworzyć, w pliku nagłówkowym local.h, odpow iednie teksty Zdefiniowanych stałych używalibyśmy następnie lam, gdzie oryginalnie należałoby wstawić tekst lo prawda - taka konstrukcja będzie działać, jednak za rozwiązaniem, które tu przedstawiam, przemawia dodatkowo sprawa wyjaśniona w ramce „optymalizacja stałych tekstowych”
Listing 80 - Ustawienie pozycji kursora.
Static uint8 t lcd LineStart(uintG t linę)
4 i f LCD_SY == 1
return lcd_l:nsi;
#ełit LCD_SY == 2 if(line = 0)
return lcd_linei; else
return lcd_line2;
*elif LCD_SY — 4 if(line = 0)
return lc3_linei; ełse if(linenutn = 1) return lco_line2; ełse if(linenum = 2) return t.cd_i.!NE3; ełse
return lcd_line4;
rtelse
terror Unknown display type!
#end1f
ł
inline VOid lcd GoToArir(uinf.8 r arir)
lcd_curpos *» adrj
void lcd updateuurPosCvo1d)
uint8 t adres -
lcd_LineStartClcd_curpos / LCD_SX) + (lr.d_ci]rpo.«? % T.O_SX)!
lcc SendInszr(LCDC EDA | adres);
Jak to robi GCC
Jeśli w programie pojawi się kilka stałych napisów, które będą miały dcntyczną zawartość albo leż identyczne będą od pewnego miejsca do końca, kompilator umieści odpowiednie dane w pamięci tylko raz. Napisy jak niżej korzystają z tej samej tablicy w pamięć programu: proc_char Ctrl = „długi napis"; pug_char str2 = „długi napis"; próg char str3 = „napis";
Jednak już wprowadzeń e. kropki na koniec zmusi kompilator do tworzenia nowego zestawu danych. Napisy w powyższym przykładzie zajmą tyic pamięci programu co jeden napis. Napis czwarty zajmie dodatkową pamięć: próg char str4 ■ „napis:";
Ważne jest, że muszą to być napisy stałe. Jeśli tworzymy zmienną, do której możemy zapisać jakieś dane, kompilator nic może wykorzystać tej sztuczki, ponieważ zakłada się możliwość zmiany wartości danego łańcucha.
W AYR-GCC opisaną optymalizację przeprowadza kompilator. Oznacza to,że jest ona skuteczna jedynie, gdy takie pokry wające się napisy pojawią się w tym samym module (w praktyce - pliku).
Listing 81 - Struktura przechowująca informację o znaku specjalnym.
#include <av/r/pgmspace.h>
typedef struct lcd_local
{
uint8_. mdtrix[8]; char cAlt;
}LCD_LOCAL_PGM PR03KEM;
Listing 82 - Opis znaków specjalnych h* pliku.
#include <avr/pgmspace.
#1nclude „led.h1*
LCD LOCALPGM local_lcdspec[18] -
{
{{0. 0, 14, 1, 15, 17. 15, 2}, ‘a’}, //ą - kod 0x80
{{2, 4, 14, 16, 16, 17, 14, 0), ‘c’}, //i - kod 0x81
(-)
// dalej zgodnie z rysunkiem 48
łi
Maj 2006