Ć
wiczenie 3
Pakiet QNX Momentics IDE 4.7
Instalacja i funkcjonowanie systemu
Instalujemy środowisko tworzenia aplikacji dla systemów czasu rzeczywistego Momentics
IDE. Pakiet będzie pracował w systemie Windows – system QNX realizujący nasze zadania dzia-
łający na maszynie wirtualnej stanowi target – cel i tam będziemy uruchamiali nasze aplikacje.
Czynności po instalacji:
1.
Startujemy QNX w maszynie wirtualnej.
2.
Badamy w Photonie stan konfiguracji sieci: Configure – Network
zakładka Device:
DHCP , pole "enable device" zaznaczone
zakładka Network:
Host: localhost
Domain: localdomain
Gateway (brama): jaki
ś
IP
Name Server: ten sam IP
3.
W terminalu badamy IP:
#ifconfig
powinniśmy otrzymać odpowiedź:
status: active
inet
IP2
4.
W terminalu badamy ping do bramy :
#ping IP
#ping IP2
po uwa
ż
nym wpisaniu obu IP konfiguracyjnych obserwujemy poł
ą
czenie – zwracane pakiety
kontrolne w krótkich czasach
5.
W terminalu QNX uruchamiamy proces połączenia:
#qconn
6.
W Windows z wiersza poleceń cmd dowiadujemy się jaki jest adres IP dla WMWare8 i
sprawdzamy do tego adresu ping w terminalu (można również sprawdzić ping z wiersza
cmd do IP2).
7.
Uruchamiamy pakiet Momentics, zwracając uwagę na lokalizację Workbench.
8.
Po zamknięciu ekranu powitalnego poznajemy środowisko programistyczne.
Pakiet Momentics
1.
Perspektywa C/C++ (ikony w prawym górnym rogu).
2.
Tworzymy nowy projekt QNX C korzystając z menu File.
3.
W pierwszym kroku nadajemy nazwę projektowi.
4.
W drugim kroku zaznaczamy x86 (Little Endian) w zakładce Built variants
5.
Wykonujemy Built projektu w Project Explorer z menu kontekstowego projektu lub z
menu głównego.
6.
W menu Run - Run configuration… ustawiamy:
a.
tworzymy nową konfigurację w kontekście C/C++ QNX (ikonka ),
b.
wybieramy nasz projekt i aplikację,
c.
dodajemy nowy target i wpisujemy adres
IP2
– karty wirtualnej systemu QNX.
Można również tworzyć target z zakładki Target Nawigator na dole ekranu.
7.
Jeśli mamy w edytorze przykładowy kod źródłowy:
#include
<stdlib.h>
#include
<stdio.h>
int
main(
int
argc,
char
*argv[]) {
printf
(
"
Welcome to the QNX Momentics IDE\n
"
);
return
EXIT_SUCCESS;
}
możemy uruchomić projekt – z menu Run. Po prawidłowym ustaleniu wszystkich
parametrów w konsoli otrzymamy komunikat powitalny Welcome…
8.
Po każdej zmianie w kodzie wykonywać kompilację programu (Built). Błędy obserwu-
jemy w konsoli lub w zakładce Problems.
9.
Zmieniamy perspektywę na QNX system information – możemy tu:
a.
obejrzeć procesy w systemie QNX na Target Nawigatorze i w zakładce System
Sumary,
b.
wybrany proces - Process Information (i jego ewentualne wątki),
c.
obejrzeć informacje o pamięci systemu,
d.
wydruki na konsoli,
e.
przejrzeć system plików w menu Window – Show view – Target file system.
PID
Każdy proces ma swój PID – identyfikator. Możemy go wyświetlić korzystając z funkcji:
int getpid()
Procesy tworzą hierarchię zależności, każdy proces ma swojego rodzica (za wyjątkiem procesu
systemowego procnto o identyfikatorze 1). Identyfikator rodzica można uzyskać za pomocą funkcji:
int getppid()
Tworzenie nowego procesu będącego kopią procesu macierzystego
Proces potomny tworzy funkcja:
int fork()
Proces potomny w momencie utworzenia posiada własny segment kodu, danych i stosu - tworzo-
na jest kopia z procesu macierzystego. Wartości zmiennych w procesie potomnym są takie same jak
w procesie macierzystym przed wykonaniem funkcji fork, lecz potem oba procesy "nie widzą" zmian
dokonywanych przez ich kod.
Funkcja zwraca 0 w kodzie procesu potomnego a PID nowego procesu w procesie macierzystym
(lub -1 gdy nowy proces nie może być utworzony).
Zadania
1.
Zapoznać się ze środowiskiem Momentics. Wykonać proces przykładowy.
2.
Napisać proces, który w pętli wyświetli liczby od 1 do 10. Aby sterować tempem, zastosować w ciele
pętli funkcję:
unsigned int sleep( unsigned int sekundy );
Dłużej trwający proces obserwować w perspektywie QNX System Information. Można zatrzymać pro-
ces przyciskiem w konsoli lub zabić poleceniem kill w terminalu QNX:
# ps
…
# kill id_procesu
3.
Wyprowadzić w konsoli PID procesu i PID jego "rodzica".
4.
Napisać program, w którym tworzony jest proces potomny. W kodzie można rozróżniać operacje
procesu macierzystego i potomnego stosując instrukcję if badającą wartość zwróconą przez funkcję
fork. Wyświetlać PID procesu i PID jego przodka dla obu procesów – macierzystego i potomnego.
5.
Sprawdzić zachowanie wartości zmiennej x w procesie potomnym, zainicjowanej np. z wartością
równą 10 w procesie macierzystym przed utworzeniem procesu potomnego. Zróżnicować zmianę
wartości zmiennej w obu procesach (np. w procesie macierzystym inkrementować, a w potomnym
dekrementować) i sprawdzić niezależność operacji na zmiennej w obu procesach.
6.
Napisać program, w którym w pętli o trzech powtórzeniach tworzony jest proces potomny. Skontro-
lować wyświetlając odpowiednie informacje, ile naprawdę zostanie utworzonych procesów potom-
nych (wyprowadzać w pętli dane procesów).