Mikroelektronika w Technice i Medycynie. Podstawy projektowania systemów wbudowanych. Instrukcja do ćwiczeń laboratoryjnych
|
|
- Grażyna Sikorska
- 8 lat temu
- Przeglądów:
Transkrypt
1 Mikroelektronika w Technice i Medycynie Podstawy projektowania systemów wbudowanych Instrukcja do ćwiczeń laboratoryjnych Zastosowanie systemu czasu rzeczywistego do sterowania serwomechanizmem Mirosław Żołądź 2017
2 Spis treści 1 PRZYGOTOWANIE ŚRODOWISKA 3 2 WIELOWĄTKOWOŚĆ URUCHAMIANIE WĄTKÓW WYKORZYSTANIE OPÓŹNIENIA SYSTEMOWEGO RÓWNOLEGŁE WYKONYWANIE ZADAŃ 8 3 KONTROLA WĄTKÓW PRZEKAZYWANIE ARGUMENTÓW ZAWIESZANIE I ODWIESZANIE WĄTKÓW 14 4 MECHANIZMY SYNCHRONIZACJI SEMAFORY Synchronizacja wątków Ochrona zasobów KOLEJKI UART Servo 18 5 OBSŁUGA PRZERWAŃ TIMER UART ODBIORNIK UART NADAJNIK 23 6 PROGRAM FINALNY MODUŁY KLAWIATURY I ZEGARKA WSPÓLNA KOLEJKA ZDARZEŃ 25
3 1 Przygotowanie środowiska System FreeRTOS został skonfigurowany dla wielu różnych architektur i kompilatorów. Każdy port posiada własne wstępnie skonfigurowane demo, tak aby można było szybko zacząć pracę z systemem. Najprostszą drogą do stworzenia własnej aplikacji jest bazowanie na dostarczonych aplikacjach demonstracyjnych dla określonych portów. a) Pobrać aktualną wersję systemu ( Download, pkt. 2 ). b) Po rozpakowaniu archiwum usunąć: a. w katalogu głównym wszystko oprócz katalogu FreeRTOS, b. w katalogu FreeRTOS wszystko oprócz katalogów Demo i Source, c. w katalogu Demo wszystko oprócz katalogu ARM7_LPC2129_Keil_RVDS, d. w katalogu ARM7_LPC2129_Keil_RVDS katalogi ParTest i serial, e. w katalogu Source\portable wszystko oprócz katalogów MemMang i RVDS. c) Uruchomić plik projektu środowiska Keil Demo\ARM7_LPC2129_Keil_RVDS \ RTOSDemo.Uv2 i. d) W oknie drzewa projektu usunąć: a. katalog Standard Demo, b. z katalogu Other wszystko oprócz plików startup i main e) zawartość pliku main.c, podmienić na poniższą #include "FreeRTOS.h" #include "task.h" int main( void ) { while(1); f) Skompilować projekt. Kompilacja powinna wykonać się bez błędów. g) W pliku Demo\ARM7_LPC2129_Keil_RVDS\FreeRTOSConfig.h ustawić : a. configuse_preemption na 0 b. configcpu_clock_hz na ( ( unsigned long ) ) c. configtotal_heap_size na ( ( size_t ) 6 * 1024 )
4 2 Wielowątkowość 2.1 Uruchamianie wątków Wprowadzenie: Przedstawiony poniżej program pulsuje diodą 0 z częstotliwością 1 Hz wykorzystując funkcję Led_Toggle() znajdującą się w module Led. Funkcja ta zmienia na przeciwny stan diody o numerze podanym w argumencie. Do generowania opóźnień wykorzystywana jest funkcja Delay() oparta na pętli opóźniającej. #include <lpc21xx.h> #include "led.h" void Delay(unsigned int uimilisec) { unsigned int uiloopctr, uidelayloopcount; uidelayloopcount = uimilisec*12000; for(uiloopctr=0;uiloopctr<uidelayloopcount;uiloopctr++) { int main( void ){ Led_Init(); while(1){ Led_Toggle(0); Delay(500); Zadanie 1: 1. Uruchomić program i sprawdzić czy działa zgodnie z opisem, 2. Napisać program, który pulsuje diodą 0 z częstotliwością 1 Hz, a diodą 1 z częstotliwością 4 Hz, 3. Zastanowić jak napisać program, który będzie pulsował diodami z częstotliwością 3 Hz i 4 Hz. Komentarz: Generowanie opóźnień z użyciem pętli opóźniającej ma następujące wady: konieczność modyfikacji kodu w przypadku zmiany mikrokontrolera/kompilatora (różne mikrokontrolery mogą wykonywać ten sam kod z różną prędkością, różne kompilatory mogą generować różny kod o rożnej prędkości wykonywania), skomplikowana implementacja cyklicznego wykonywania wielu zadań o różnych okresach cyklu, nieefektywne wykorzystanie mocy obliczeniowej mikrokontrolera.
5 Wprowadzenie: W poprzednim programie fragment kodu, odpowiadający za cykliczne wykonywania zadania, wykonywany był w pętli głównej znajdującej się w funkcji main(). W programach wykorzystujących RTOS może istnieć wiele pętli "głównych" pracujących jednocześnie. Nazywa się je wątkami ( threads ) i umieszcza w funkcjach (patrz funkcja Led0Blink ). W RTOS funkcja main() służy do tworzenia i uruchamia wątków. W poniższym programie funkcja main() : 1. Inicjalizuje modułu Led, 2. Tworzy wątek ( xtaskcreate(led0blink(),.. ). Funkcja jako pierwszy argument przyjmuje adres funkcji, w której znajduje pętla główna wątku. Znaczenie reszty argumentów jest w tym momencie nieistotne, 3. Uruchamia wszystkie istniejące wątki ( vtaskstartscheduler() ), 4. Przechodzi w pętlę nieskończoną tylko w przypadku niewystarczającej ilości pamięci wymaganej do utworzenia wątku " idle task " aktywowanego w trakcie bezczynności systemu. #include "FreeRTOS.h" #include "task.h" #include "led.h" void Delay(unsigned int uimilisec) { unsigned int uiloopctr, uidelayloopcount; uidelayloopcount = uimilisec*12000; for(uiloopctr=0;uiloopctr<uidelayloopcount;uiloopctr++) { void Led0Blink( void *pvparameters ){ while(1){ Led_Toggle(0); Delay(500); int main(void){ Led_Init(); xtaskcreate(led0blink, NULL, 100, NULL, 2, NULL ); vtaskstartscheduler(); while(1); Zadanie 2: Zamienić obecny wątek wątkiem pulsującym diodą 0 z częstotliwością 0.5 Hz. Uwaga: nie usuwać funkcji obecnego wątku. Komentarz: Obecna implementacja posiada te same wady co poprzednia i została podana w celu wprowadzenia do RTOS. 2.2 Wykorzystanie opóźnienia systemowego Zadanie 1: Dodać do programu z poprzedniego zadania wątek pulsujący diodą 1 z częstotliwością 10 Hz.
6 Zaobserwować działanie programu dla różnych kolejności tworzenia wątków. Podpowiedź : Stworzyć funkcje Led1Blink i użyć powtórnie funkcji xtaskcreate(). Komentarz: Wątek, który został utworzony jako ostatni, całkowicie przejmuje moc obliczeniową mikrokontrolera chociaż jego zadaniem jest tylko zmiana stanu jednej diody na przeciwny. Zadanie to zajmuje mniej niż 0.01% dostępnego czasu, resztę czasu zajmuje pętla opóźniająca. Nie jest to dobre rozwiązanie ponieważ z jednej strony nie zostaje dopuszczony do pracy drugi wątek, a z drugiej strony moc obliczeniowa pierwszego wątku marnowana jest na wykonywanie pętli opóźniającej. Ilustruje to rysunek 3-1: Rys. 2-1 Blokowanie wątku Led0Blink spowodowane użyciem pętli opóźniającej. Rozwiązaniem tego problemu jest wykorzystanie funkcji opóźniającej vtaskdelay() dostarczanej wraz z RTOS (tzw. systemowej).
7 Zadanie 2: W programie z poprzedniego zadania zamiast funkcji Delay() użyć funkcji systemowej vtaskdelay(). Jak zmieniło się działanie programu? Komentarz: W odróżnieniu od funkcji Delay() opartej na pętli opóźniającej funkcja vtaskdelay() zawiesza wykonywanie wątku i przekazuje sterowanie do systemu, co pozwala systemowi wykorzystać moc obliczeniową do wykonywania innych wątków. Jednocześnie vtaskdelay() informuje system, że powinien zwrócić sterowanie (moc obliczeniową) do zawieszonego wątku po ilości tyknięć systemu określonej w argumencie wywołania ( vtaskdelay( xx ) ). Częstotliwość pracy systemu to 1000 Hz więc jedno tyknięcie trwa 1 ms. Działanie opóźnienia systemowego ilustruje rys Rys. 2-2 Wykorzystanie funkcji vtaskdelay() do tworzenia nieblokujących opóźnień.
8 2.3 Równoległe wykonywanie zadań Wprowadzenie: Powyższe rozwiązanie działa poprawnie (zadania wykonywane są równolegle) jeżeli zadania wykonywane w wątkach są stosunkowo krótkie. Może jednak zaistnieć sytuacja w której zadanie w jednym z wątków rzeczywiście potrzebuje więcej czasu na wykonanie. Ilustruje to program z poniższego zadania. Zadanie 1: Przerobić funkcję Led0Blink tak, aby opóźnienie między zaświeceniem diody, a jej zgaszeniem było generowane funkcją Delay() (symulacja czasochłonnego zadania), a opóźnienie między zgaszeniem, a zapaleniem diody było realizowane funkcją systemową. Zaobserwować działanie. Komentarz: Jak widać wątek Led0Blink blokuje wykonywanie wątku Led1Blink na czas wykonywania czasochłonnego zadania. Ilustruje to rys Rys. 2-3 Blokowanie jednego z wątków przez wątek o długim czasie wykonania bez wywłaszczania. Naszym celem jest spowodowanie żeby, krótkie zadania były wykonywane nieprzerwanie z założoną częstotliwością. Istnieje możliwość aby wymusić zwrócenie sterowania przez wątek (w omawianym przykładzie podczas wykonywania funkcji Delay() ). Jedną z podstawowych cech RTOS jest możliwość wywłaszczania (ang. preemption) wątków. System może w każdej chwili zawiesić wykonywanie wątku o niższym priorytecie i przekazać sterowanie do wątku o wyższym priorytecie.
9 Zadanie 2: Włączyć wywłaszczanie ( FreeRTOSConfig.h, configuse_preemption 1 ). Ustawić niższy priorytet dla wątku pulsującego z wyższą częstotliwością (jeden z argumentów argument funkcji xtaskcreate) Komentarz: Działanie programu z Zadania 2 (z wywłaszczaniem) jest bardzo podobne do działania programu z Zadania 1 (bez wywłaszczania). Zarówno w jednym jak i drugim wątek Led0Blink blokował na pół okresu (czas trwania 1 ) wykonywanie wątku Led1Blink. Istnieje jednak pewna różnica między tymi przypadkami. W przypadku programu bez wywłaszczania zadanie z wątku Led0Blink ( Delay ) mogło przejąć sterowanie dopiero po zwróceniu go przez wątek Led1Blink ( vtaskdelay ). Ilustruje to rysunek 3-3. W przypadku programu z wywłaszczaniem zadanie z wątku Led0Blink ( Delay ) mogło przejąć sterowanie w każdym momencie, również w trakcie wykonywania przez wątek Led1Blink funkcji Toggle_Led(). Ilustruje to rysunek 3-4. Rys. 2-4 Wywłaszczenie wątku o niższym priorytecie.
10 Zadanie 3: Odwrócić priorytety wątków i zaobserwować działanie programu. Komentarz: Jak widać obecna wersja programu ( Zadanie 3 ) działa w zamierzony sposób, t.j. czasochłonne zadanie z wątku Led0Blink nie blokuje wykonywania krótkich zadań z wątku Led1. Cel ten został osiągnięty przez użycie wywłaszczania oraz przyporządkowanie wyższego priorytetu wątkowi wykonującemu krótkie zadania ( Led1Blink ). Ilustruje to rysunek 3-5. Rys. 2-5 Wywłaszczanie czasochłonnych instrukcji przez wątek o wyższym priorytecie.
11 Wprowadzenie : Można sobie wyobrazić sytuację, w której oba wątki muszą równocześnie wykonywać czasochłonne zadanie. Pokazuje to program z Zadania 4. Zadanie 4: Zmodyfikować program z poprzedniego zadania tak, aby oba watki pulsowały diodą z okresem 1 Hz i używały tylko opóźnienia programowego ( Delay(500) ). Ustawić równe priorytety obu wątków. Komentarz: Jak można zaobserwować czas wykonywania zadań z poszczególnych wątków wydłużył się dwukrotnie (2 razy mniejsza częstotliwość pulsowania). Wynika to z faktu, że moc obliczeniowa dzielona jest równo na dwa wątki. Ilustruje to rysunek 3-6. Rys. 2-6 Równoczesne wykonywanie dwóch czasochłonnych wątków z włączonym wywłaszczaniem. Częstotliwość przełączania między wątkami może być ustawiana w pliku konfiguracyjnym za pomocą makra configtick_rate_hz ustawionego domyślnie na 1000 Hz. Należy przy tym pamiętać, że samo przełączanie między wątkami wymaga pewnej ilości czasu i mocy obliczeniowej. Czyli, że zwiększając częstotliwość zwiększamy procent mocy obliczeniowej wykorzystywany przez funkcje systemowe, a nie przez wątki użytkownika. Wniosek: Jeżeli nie ma takiej konieczności nie używać wywłaszczania. 3 Kontrola wątków 3.1 Przekazywanie argumentów Wprowadzenie: Podczas tworzenia wątku ( xtaskcreate ) można przekazać do niego parametr. Parametr
12 ten ma postać wskaźnika typu void czyli wskaźnika na zmienną o nieokreślonym typie. Poniższy program ma za zadanie uruchamiać miganie diody o okresie określonym w zmiennej zdefiniowanej w funkcji main. void LedBlink( void *pvparameters ){ unsigned char ucfreq = *((unsigned char*)pvparameters); while(1){ Led_Toggle(0); vtaskdelay((1000/ucfreq)/2); int main( void ) { unsigned char ucblinkingfreq = 10; Led_Init(); xtaskcreate(ledblink, NULL, 100, &ucblinkingfreq, 2, NULL ); vtaskstartscheduler(); while(1); Opis programu: main 1. Stworzenie zmiennej ucblinkingfreq określającej częstotliwość pulsacji diody, 2. Zainicjowanie modułu Led, 3. Stworzenie wątku LedBlink i przekazanie mu wskaźnika na uiblinkingfreq. Wskaźnik pojawia się jako pvparameters w funkcji wątku LedBlink, 4. wystartowanie Shedulera. LedBlk 1. Kopiowanie wartości wskazywanej przez pvparameters do zmiennej lokalnej ucfreq (należy zauważyć, ze zmienna ta jest tego samego typu co ucblinkingfreq ). Wymaga to: zrzutowania wskaźnika typu void (typ nieokreślony) na wskaźnik typu unsigned char, *(( unsigned char*)pvparameters )), odwołania się do zmiennej wskazywanej przez wskaźnik * ((unsigned char*)pvparameters)). 2. Zmiana stanu diody na przeciwny oraz opóźnienie zależne od przekazywanego parametru. Zadanie 1: Sprawdzić działanie programu dla różnych częstotliwości. Komentarz: Dotychczas funkcja wątku pracowała na kopii zmiennej przechowującej informacje o częstotliwości ( ucfreq ), czyli nawet jeżeli zmienilibyśmy wartość zmiennej ucblinkingfreq to i tak nie miało by to wpływu na częstotliwość pulsowania.
13 Zadanie 2: Dorobić wątek LedCtrl (Control), który za pośrednictwem zmiennej ucblinkingfreq, będzie co sekundę zmieniał częstotliwość pulsowania diody. (zmodyfikować program tak aby częstotliwość pulsacji zależała od aktualnej wartości zmiennej ucblinkingfreq ). Zadanie 3: Przerobić program z poprzedniego zadania tak aby wątek LedCtrl co sekundę zmieniał częstotliwość pulsowania diody, a co dwie sekundy numer pulsującej diody (trzeba stworzyć strukturę).
14 3.2 Zawieszanie i odwieszanie wątków Wprowadzenie: RTOS pozwala na zatrzymywanie i ponowne uruchamianie wątków. Służą do tego funkcje odpowiednio vtasksuspend i vtaskresume. Jako argument funkcje przyjmują tzw. uchwyt wątku będący zmienną typu xtaskhandle. Uchwyt do wątku jest zwracany przez xtaskcreate(, &xmyhandle ). Zadanie 1: Napisać program który cyklicznie przez sekundę pulsuje i przez sekundę nie pulsuje diodą. Należy użyć dwóch wątków. Jeden odpowiedzialny za pulsowanie drugi odpowiedzialny za zawieszanie/odwieszanie pierwszego. 4 Mechanizmy synchronizacji 4.1 Semafory Synchronizacja wątków Wprowadzenie: Jednym z mechanizmów pozwalającym na synchronizację pracy wątków jest semafor. Można go porównać do flagi. Tak samo jak flaga semafor może posiadać dwa stany, zajęty albo wolny. Do tworzenia semafora służy funkcja vsemaphorecreatebinary. Funkcja zwraca uchwyty do stworzonego semafora. Poniżej znajduje się przykład tworzenia semafora: xsemaphorehandle xsemaphore; vsemaphorecreatebinary( xsemaphore ); Podstawowe funkcje do pracy z semaforami to [2] : xsemaphoretake(xsemaphore,portmax_delay), która jeżeli semafor jest: o wolny wprowadza go w stan zajęty i zwraca pdtrue, o zajęty czeka na zwolnienie semafora przez czas określony w drugim argumencie ( portmax_delay oznacza nieskończoność) i: jeżeli w tym czasie się zwolnił wprowadza go w stan zajęty i zwraca pdtrue, jeżeli w tym czasie się nie zwolnił zwraca pdfalse, xsemaphoregive(xsemaphore), która wprowadza semafor w stan wolny.
15 Zadanie 1: Napisać program składający się z dwóch wątków. Wątek PulseTrigger powinien co sekundę wprowadzać semafor w stan wolny Wątek Pulse _ LED0 powinien po każdym zwolnieniu semafora zaświecić a LED0 na czas 0.1s. Inaczej mówiąc zadaniem wątku Pulse jest generowanie impulsu, a PulseTrigger wyzwalanie impulsu Uwaga: Dołączyć moduł semafora - #include "semphr.h" Komentarz: Zasadę działanie programu ilustruje poniższy rysunek. Zadanie 2: Dodać do programu z zadnia 1 watek wyzwalający impuls co 1/3 sekundy i rozpoczynający pracę z opóźnieniem 1/3 sekundy ( vtaskdelay przed while ). Zadanie 3: Dodać do programu z zadnia 1 wątek Pulse_LED1 sterujący LED1 wyzwalany z tego samego semafora co Pulse_LED0.
16 4.1.2 Ochrona zasobów Zalecenie: Testy poniższych zadań należy przeprowadzać w pierwszej kolejności z uzyciem symulatora a następnie z użyciem zestawu uruchomieniowego. Zadanie 1 Wstawić do pliku main i doprowadzić do działania poniższy kod. W tym celu dołączyć moduł string i uart. void LettersTx (void *pvparameters){ while(1){ Transmiter_SendString("-ABCDEEFGH-\n"); while (etransmiter_status()!=free){; vtaskdelay(300); int main( void ){ UART_InitWithInt(9600); xtaskcreate(letterstx, NULL, 128, NULL, 1, NULL ); vtaskstartscheduler(); while(1); Zadanie 2 Zmniejszyć prędkość transmisji do 300 bodów. Oprócz zmiany wartości argumentu przekazywanego do funkcji UART_InitWithInt konieczna jest podmiana definicji funkcji na podaną w załączniku na stronie laboratorium. (Tak niska prędkość transmisji wymaga bardziej złożonej inicjalizacji UARTA) Zadanie 3 Dodać wątek klawiatury KeyboardTx, którego zadaniem jest wysyłanie łańcucha znakowego ("-Keyboard-\n") po każdym naciśnięciu dowolnego przycisku. Należy użyć modułu keyboard. Modułu nie należy modyfikować. Transmisja łańcucha powinna odbywać się dokładnie tak jak w wątku LettersTx. Zadanie 4 Jak widać łańcuchy znakowe przerywają się co należy uznać za efekt niepożądany. Jednym ze sposobów, aby go uniknąć jest zastosowanie sekcji krytycznych. Sekcje powinny obejmować fragmenty kodu bezpośrednio związane z wysyłaniem łańcuchów. Sekcje należy zrealizować z użyciem semafora.
17 Zadanie 5 W obecnej wersji programu występują dwa powtarzające się fragmenty kodu. Należy je wyodrębnić do nowej funkcji o nazwie Rtos_Transmiter_SendString. Zadanie 6 W obecnej wersji programu zdarza się, że jeden z wątków musi czekać aż drugi wątek wyjdzie z sekcji krytycznej. W pewnych okolicznościach może to być wadą. Aby to zilustrować należy dodać funkcji wątku LettersTx pomiar czasu potrzebnego na wykonanie funkcji Rtos_Transmiter_SendString. Do pomiaru czasu należy użyć funkcji xtaskgettickcount. Informacja o czasie powinna być wyrażona w tick-ach systemowych oraz wyświetlana w formacie cheksadecymalnym na końcu łańcucha wysyłanego dotąd przez letters ( -ABCDEEFGH- :0x0230 ). Nie zapomnieć o znaku następnej linii (\n). Zaobserwować jak zmienia się czas wykonanie wspomnianej funkcji podczas naciskania przycisków.
18 4.2 Kolejki UART Zadanie 1 Aby usunąć występujące w zadaniu 6 blokowanie się wątków można użyć kolejki. Watki LettersTx i KeyboardTx powinny wstawiać łańcuchy do kolejki. Odczyt kolejki oraz zapis do Uart-a powinien znajdować się w oddzielnym wątku. Sugeruje się zaadoptowanie funkcji Rtos_Transmiter_SendString. Jako rozmiar kolejki przyjąć 5 elementów. Ile wynosi (w tickach) czas zapisu do kolejki? Zadanie 2 Dodać do wątku LettersTx funkcjonalność polegającą na zmianie stanu LED0 na przeciwny, jeżeli wpisanie do kolejki nie powiodło się. Zaobserwować efekt, przedyskutować z prowadzącym Servo Zadanie 1 Przygotować zawartość pliku main.c, tj. : usunąć wszystkie funkcje oraz związane z nimi fragmenty kodu oprócz funkcji main, pozostawić uruchamianie shedulera, odłączyć moduł UART, dołączyć moduł Servo. dodać do programu inicjalizację serwomechanizmu oraz wątek klawiatury jak poniżej, zweryfikować inicjalizację modułu servo (timer zerowy oraz zerowy slot przerwań są zarezerwowane dla systemu FreeRTOS) Sprawdzić działanie na serwomechanizmie dla częstotliwości 400 MHz. void Keyboard (void *pvparameters){ while(1){ swith(){ case BUTTON_1: Servo_Callib(); break; case BUTTON_2: Servo_GoTo(50); break; case BUTTON_3: Servo_GoTo(100); break; case BUTTON_4: Servo_GoTo(150); break; vtaskdelay(100); Przerobić program tak aby reagował na naciśniecie a nie na stan przycisków.
19 Zadanie 2: Przerobić moduł Servo żeby do cyklicznego wywołania automatu sterującego silnikiem krokowym zamiast timera i przerwania wykorzystywał mechanizmy RTOS. Sprawdzić działanie dla 100 Hz. Zastanowić się a następnie sprawdzić czy potrzebne jest wywłaszczanie? Zadanie 3: Przerobić program tak aby pracował z częstotliwością 400 Hz. Podpowiedź : Sprawdzić w czym wyrażony jest argument opóźnienia systemowego oraz przejrzeć zawartość pliku konfiguracji systemu. Zadanie 4: W obecnej wersji sterowanie pozycją serwomechanizmu odbywa się za pośrednictwem zmiennej globalnej sservo.uidesiredposition za pośrednictwem funkcji Servo_GoTo oraz Servo_Callib. Jaki problem mógłby wystąpić jeśli program działałby na mikrokontrolerze 8-bitowym? Zamiast zmiennej globalnej użyć kolejki nie modyfikując w żaden sposób pliku main. Zadanie 5: Zmodyfikować program tak aby naciśniecie przycisku BUTTON_4 powodowało przejście przez pozycje: 50, 0, 100, 0, 150, 0. Zadanie 6: Dodać do modułu servo funkcję Servo_Wait. Czas oczekiwania powinien być wyrażony w tick-ach systemowych. Test przeprowadzić za pomocą następującej sekwencji pozycji i okresów przestojów : 50, 200, 0, 100, 400, 0, 150, 600, 0. Zadanie 7: Dodać do modułu servo funkcję Servo_Speed. Prędkość powinna być wyrażona w tick-ach systemowych pomiędzy następującymi po sobie krokami silnika. Test przeprowadzić za pomocą następującej sekwencji pozycji i ustawień prędkości : 8, 50, 4, 100, 2, 150, 1, 0.
20 5 Obsługa przerwań 5.1 Timer Zadanie 1. Zamienić zwartość pliku main.c na poniższą a następnie doprowadzić do działania poniższy program. #include "FreeRTOS.h" #include "task.h" #include "led.h" #include "timer_interrupts.h" void LedBlink(void) { Led_Toggle(0); int main(void) { Led_Init(); Timer1Interrupts_Init(500, &LedBlink); vtaskstartscheduler(); while(1); Zadanie 2. W programie z zadania 1 wywołanie funkcji Led_Toggle zsynchronizowane jest z Timer-em za pomocą przerwań. Zsynchronizować wywołanie funkcji Led_Toggle z wystąpieniem przerwania używając semafora. UWAGA: operowanie na semaforze z przerwań wymaga zastosowania odpowiednich funkcji (patrz API systemu na stronie FreeRTOS).
21 5.2 UART Odbiornik Zadanie 1 Doprowadzić do kompilacji poniższy program, w tym dopasować nazwy funkcji z modułu uart do nazw z poniższego listingu. Sprawdzić działanie programu. #include "FreeRTOS.h" #include "task.h" #include "led.h" #include "uart.h" void UartRx( void *pvparameters ){ char acbuffer[uart_rx_bffer_size]; while(1){ while (euartrx_getstatus()==empty){; Uart_GetStringCopy(acBuffer); Led_Toggle(0); int main( void ) { Led_Init(); UART_InitWithInt(9600); xtaskcreate( UartRx, NULL, 100, NULL, 1, NULL ); vtaskstartscheduler(); while(1); Zadanie 2 Zaimplementować odbiornik łańcuchów znakowych z użyciem kolejki systemowej. W tym celu należy: 1. Usunąć z modułu UART wszystkie funkcje i zmienne związane z odbiorem komend a następnie doprowadzić do kompilacji modułu. 2. Dodać do funkcji interfejsowych funkcję char cuart_getchar(void), na razie w postaci mockup-a. 3. Zastąpić zawartość pętli głównej wątku UartRx następujacą linijka kodu: Led_Toggle(cUart_GetChar() 0 ); Zlinkować program (build all) 4. Dodać do modułu UART kolejkę o długości i typie elementów takich jak bufor odbiornika z wcześniejszego programu. Zmodyfikować funkcję obsługi przerwania uart-a tak aby dodawała do kolejki odebrane znaki. Zmodyfikować funkcję cuart_getchar tak aby odbierała z kolejki znaki i zwracała je jako wartość wyjściową. Dokonać innych modyfikacji koniecznych do poprawnego działania programu.
22 Zadanie 3 Plik main.c Zmodyfikować zawartość pętli głównej wątku UartRx jak poniżej. Uart_GetString(acBuffer) ; Led_Toggle(acBuffer[0]- 0 ); Moduł UART Zastąpić funkcję cuart_getchar funkcją void Uart_GetString(char *). Funkcja powinna zwracać za pośrednictwem przekazanego do niej wskaźnika odczytany z kolejki odbiornika łańcuch znakowy zakończony znakiem terminatora, przy czym znak terminatora powinien być zastąpiony wartością NULL. Przetestować program. Zadanie 4 Zmodyfikować wcześniejszy program tak aby po odebraniu komendy zero zmieniał na przeciwny stan LED_0 a po odebraniu komendy jeden zmieniał na przeciwny stan LED_1. Użyć funkcji do porównywania łańcuchów lub funkcji do dekodowania.
23 5.3 UART Nadajnik Zadanie 1 Zastąpić zawartość pętli głównej wątku UartRx następującym kodem: Uart_GetString(acBuffer); Uart_PutString(acBuffer); Zmodyfikować moduł UART tak aby: funkcja Uart_PutString wstawiała przekazany do niej łańcuch znakowy do kolejki oraz inicjalizowała wysyłanie znaków, funkcja obsługi przerwania wysyłała znaki odebrane z kolejki (znak NULL powinien być zastępowany znakiem \r ). Usunąć z modułu UART wszystkie zbędne fragmenty kodu. Sprawdzić działanie programu. Zadanie 2 a) Zainicjalizować acbuffer łańcuchem znakowym \n. Zastąpić zawartość pętli głównej wątku UartRx następującym kodem: vtaskdelay(500); Uart_PutString(acBuffer); Uart_PutString(acBuffer); Uart_PutString(acBuffer); Sprawdzić działanie programu (wystarczy w symulatorze). b) Zmodyfikować zawartość pętli głównej wątku UartRx jak po niżej: vtaskdelay(500); Uart_PutString(acBuffer); vtaskdelay(10); Uart_PutString(acBuffer); vtaskdelay(10); Uart_PutString(acBuffer); Sprawdzić działanie programu (wystarczy w symulatorze). c) Zastanowić się skąd bierze się niepoprawne działanie programu z podpunktu. Przedyskutować z prowadzącym
24 6 Program finalny 6.1 Moduły klawiatury i zegarka Zadanie 1 Moduł Keyboard powinien posiadać: funkcję e ReadButtons wykonującą dokładnie to samo co wcześniej funkcja ekeyboardread, Jednoelementową kolejkę, z elementem tego samego typu jaki zwraca e ReadButtons, Wątek Keyboard_Thread, odpowiedzialny wykrycie naciśnięcia przycisku i wstawienie informacji o naciśniętym przycisku do kolejki, funkcję e Keyboard_Read zwracającą informację o naciśniętym przycisku odczytaną z kolejki, Funkcję Keyboard_Init zawierającą odpowiednie inicjalizacje. Zmodyfikować plik main.c odpowiadającego mu leda (S1-D1, S2-D2, itd.). tak aby naciśniecie przycisku powodowało zmianę na przeciwny stanu Zadanie 2 Zmodyfikować moduł Watch w sposób analogiczny jak moduł Keyboard. Plik nagłówkowy modułu powinien wyglądać w sposób następujący. enum TimeUnit {SECCONDS, MINUTES; struct WatchEvent { enum TimeUnit etimeunit; char TmeValue; ; void Watch_Init(void); struct WatchEvent swatch_read(void); Zmodyfikować plik main.c tak aby zmiana sekund powodowała zmianę na przeciwny stanu D1, zmiana minut powodowała zmianę na przeciwny stanu D2. Zadanie 3 Napisać program, który będzie wysyłał przez UART zarówno informację o naciśnietym przycisku jak i zmianie sekund/minut. (buton 0x000X, sek 0x000X, min 0x000X)
25 6.2 Wspólna kolejka zdarzeń Zadanie 1 Zmodyfikować plik main.c tak aby zawierał jedną wspólną kolejkę zdarzeń. Elementem kolejki powinny być tablice znaków o długości 20. Tablice te będą służyć do przechowywania zdarzeń w postaci łańcuchów znakowych. Źródłem zdarzeń powinny być: klawiatura i odbiornik UART-a. W pliku main.c należy umieścić wątki które będą odbierać zdarzenia z wymienionych modułów i wstawiać je do wspólnej kolejki zdarzeń. W przypadku modułów klawiatury zdarzenia powinny mieć formę jak w zadaniu 3 z podpunktu 6.1. W przypadku odbiornika UART-a zdrzenie powinno być kopią odebranego łańcucha. Zdarzenia ze wspólnej kolejki powinny być odbierane i obsługiwane (wykonanie odpowiedniej akcji) w wątku Executor. Obsługę powinno poprzedzać dekodowanie zdarzeń, czyli łańcuchów. W ramach testu należy zaimplementować jednoczesne: wykonywanie komend (z uarta): id, callib, goto, sterowanie Servo za pomocą przycisków ( callib, goto ). UWAGA: koniecznie usunąć z projektu moduły led i watch po odebraniu calib i goto program powinien odsyłać ok zmniejszyć długość tablic na łańcuchy odbieranie i wysyłane (moduł uart) do 20 ZADANIE 2 ->>>>
26 Zadanie 2 Dodać możliwość odczytu statusu serwomechanizmu a) Dodać do funkcji wątku obsługi zdarzeń deklarację zmiennej. struct ServoStatus sservostatus; oraz case case STATE: sservostatus = Servo_State(); switch (sservostatus.estate){ case _CALLIBRATION: CopyString("state callib ",cstring); break; case _IDDLE : CopyString("state iddle ",cstring); break; case _IN_PROGRESS : CopyString("state in_proggres ",cstring); break; case _WAITING : CopyString("state waiting ",cstring); break; default:break; ; AppendUIntToString(sServoStatus.uiPosition,cString); AppendString("\n",cString); UART_PutString(cString); break; Doprowadzić program do bezbłędnej kompilacji. Sprawdzić działanie programu. b) Zastąpić aktualną implementację funkcji Servo_State poniższą implementacją struct ServoStatus Servo_State(void){ struct ServoStatus sservostatus; xqueuepeek(xstatusqueue,&sservostatus,portmax_delay); return sservostatus; Doprowadzić program do bezbłędnej kompilacji. Zapoznać się ze specyfikacja funkcji xqueuepeek. UWAGA: kolejka statusu powinna być jednoelementowa. c) Wstawić do funkcji wątku Automat w module Servo kod wstawiający dane do kolejki statusu. UWAGA: - funkcja wstawiająca element do kolejki może być użyta maksymalnie 2 razy - użyć funkcji, która nadpisze element obecny w kolejce Przeprowadzić testy programu PODPOWIEDŹ: Zwolnić serwo tak aby móc zaobserwować zmiany stanów i pozycji
Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR
Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR Zadanie polega na napisaniu pierwszego programu w języku C, jego poprawnej kompilacji i wgraniu na mikrokontroler. W tym celu należy zapoznać
Aplikacja Sieciowa wątki po stronie klienta
Aplikacja Sieciowa wątki po stronie klienta Na ostatnich zajęciach zajmowaliśmy się komunikacją pomiędzy klientem a serwerem. Wynikiem naszej pracy był program klienta, który za pomocą serwera mógł się
Instrukcja do ćwiczeń
Instrukcja do ćwiczeń SYSTEMY WBUDOWANE Lab. 3 Przetwornik ADC + potencjometr 1. Należy wejść na stronę Olimexu w celu znalezienia zestawu uruchomieniowego SAM7-EX256 (https://www.olimex.com/products/arm/atmel/sam7-ex256/).
Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady
Pętle i tablice. Spotkanie 3 Dr inż. Dariusz JĘDRZEJCZYK Pętle: for, while, do while Tablice Przykłady 11/26/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 2 Pętla w największym uproszczeniu służy
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się
Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.
Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na
1 Zapoznanie się ze środowiskiem Xenomai.
1 Zapoznanie się ze środowiskiem Xenomai. Wszystkie ćwiczenia oraz programy opracowane zostały w Xenomai w wersji 2.5.6. Dlatego też odwołania do dokumentacji dotyczą dokumentu pod adresem: http://www.xenomai.org/documentation/xenomai-2.5/html/api/
Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania
Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania Celem ćwiczenia jest zapoznanie studentów z najprostszą dynamiczną strukturą
Tablice (jedno i wielowymiarowe), łańcuchy znaków
Tablice (jedno i wielowymiarowe), łańcuchy znaków wer. 8 z drobnymi modyfikacjami! Wojciech Myszka Katedra Mechaniki i Inżynierii Materiałowej 2017-04-07 09:35:32 +0200 Zmienne Przypomnienie/podsumowanie
Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1
Podstawy programowania, Poniedziałek 30.05.2016, 8-10 Projekt, część 1 1. Zadanie Projekt polega na stworzeniu logicznej gry komputerowej działającej w trybie tekstowym o nazwie Minefield. 2. Cele Celem
Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD
programowania Wykład: 5 Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. 1 dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD programowania w C++ Instrukcje sterujące 2 dr Artur Bartoszewski
ĆWICZENIE 5. TEMAT: OBSŁUGA PORTU SZEREGOWEGO W PAKIECIE KEILuVISON WYSYŁANIE PORTEM SZEREGOWYM
ĆWICZENIE 5 TEMAT: OBSŁUGA PORTU SZEREGOWEGO W PAKIECIE KEILuVISON WYSYŁANIE PORTEM SZEREGOWYM Wiadomości wstępne: Port szeregowy może pracować w czterech trybach. Tryby różnią się między sobą liczbą bitów
Podstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
Podstawy Programowania C++
Wykład 3 - podstawowe konstrukcje Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu, instrukcja przypisania, podstawowe typy danych, zapis i odczyt danych, wyrażenia:
Electronic Infosystems
Department of Optoelectronics and Electronic Systems Faculty of Electronics, Telecommunications and Informatics Gdansk University of Technology Electronic Infosystems Microserver TCP/IP with CS8900A Ethernet
Spis treści. 1 Moduł RFID (APA) 3
Spis treści 1 Moduł RFID (APA) 3 1.1 Konfigurowanie Modułu RFID..................... 3 1.1.1 Lista elementów Modułu RFID................. 3 1.1.2 Konfiguracja Modułu RFID (APA)............... 4 1.1.2.1
1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami
1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami Celem tych zajęć jest zrozumienie i oswojenie z technikami programowania przy pomocy wskaźników w języku C++. Proszę przeczytać rozdział 8.
Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski
Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej Systemy wbudowane Witold Kozłowski Zakład Fizyki i Technologii Struktur Nanometrowych 90-236 Łódź, Pomorska 149/153 https://std2.phys.uni.lodz.pl/mikroprocesory/
SYSTEMY CZASU RZECZYWISTEGO - VxWorks
WZAJEMNE WYKLUCZANIE Wiele metod. Np. wyłączanie przerwań: funkcja() //... Int blokada = intlock(); // Obszar krytyczny, któremu nie możemy przerwać intunlock(blokada); wyłączanie wywłaszczania: funkcja()
ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje
Funkcje (podprogramy) Mianem funkcji określa się fragment kodu, który może być wykonywany wielokrotnie z różnych miejsc programu. Ogólny zapis: typ nazwa(argumenty) ciało funkcji typ określa typ danych
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi EGZAMIN PIERWSZY (25 CZERWCA 2013) JĘZYK C++ poprawiam ocenę pozytywną z egzaminu 0 (zakreśl poniżej x) 1. Wśród poniższych wskaż poprawną formę definicji
1. Tworzenie nowego projektu.
Załącznik do Instrukcji 1. Tworzenie nowego projektu. Wybieramy opcję z menu głównego New->QNX C Project. Wprowadzamy nazwę przechodzimy do następnego kroku NEXT. Wybieramy platformę docelową oraz warianty
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. 1. Rodzaje pamięci używanej w programach Pamięć komputera, dostępna dla programu,
Wskaźniki w C. Anna Gogolińska
Wskaźniki w C Anna Gogolińska Zmienne Zmienną w C można traktować jako obszar w pamięci etykietowany nazwą zmiennej i zawierający jej wartość. Przykład: kod graficznie int a; a a = 3; a 3 Wskaźniki Wskaźnik
Szkolenia specjalistyczne
Szkolenia specjalistyczne AGENDA Programowanie mikrokontrolerów w języku C na przykładzie STM32F103ZE z rdzeniem Cortex-M3 GRYFTEC Embedded Systems ul. Niedziałkowskiego 24 71-410 Szczecin info@gryftec.com
Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.
Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy Laboratorium 2 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Komentarze Funkcja printf() Zmienne Łańcuchy
/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>
Szablon programu: /* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include /* opcjonalne: deklaracja typów o rozmiarze jednego i dwóch
LOW ENERGY TIMER, BURTC
PROJEKTOWANIE ENERGOOSZCZĘDNYCH SYSTEMÓW WBUDOWANYCH ĆWICZENIE 4 LOW ENERGY TIMER, BURTC Katedra Elektroniki AGH 1. Low Energy Timer tryb PWM Modulacja szerokości impulsu (PWM) jest często stosowana przy
System operacyjny. Na rysunku przedstawiono diagram pracy wielozadaniowego OS z uruchomionymi jednocześnie kilkoma zadaniami.
System operacyjny Zadaniem każdego systemu operacyjnego jest zarządzanie sprzętem w taki sposób, aby zadania stawiane przez użytkownika były wykonane przy optymalnym wykorzystaniu zasobów i mocy obliczeniowej.
Rysunek 1: Okno z lista
1 Urzadzenie RFID Urządzenie RFID, umożliwia użytkownikom systemu kontrolę dostępu do wydzielonych przez system stref, na podstawie odczytywanych TAG ów (identyfikatora przypisanego do użytkownika) z czytników
znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
Wydział Elektryczny. Katedra Telekomunikacji i Aparatury Elektronicznej. Konstrukcje i Technologie w Aparaturze Elektronicznej.
Politechnika Białostocka Wydział Elektryczny Katedra Telekomunikacji i Aparatury Elektronicznej Konstrukcje i Technologie w Aparaturze Elektronicznej Ćwiczenie nr 5 Temat: Przetwarzanie A/C. Implementacja
Lab 9 Podstawy Programowania
Lab 9 Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Wszystkie kody/fragmenty kodów dostępne w osobnym pliku.txt. Materiały pomocnicze: Wskaźnik to specjalny rodzaj zmiennej, w której zapisany
Jak napisać program obliczający pola powierzchni różnych figur płaskich?
Część IX C++ Jak napisać program obliczający pola powierzchni różnych figur płaskich? Na początku, przed stworzeniem właściwego kodu programu zaprojektujemy naszą aplikację i stworzymy schemat blokowy
Podstawy programowania komputerów
Podstawy programowania komputerów Wykład 14: Programowanie współbieżne w C Definicja programowania współbieżnego Programowanie współbieżne jest tworzeniem programów, których wykonanie powoduje uruchomienie
Pętle. Dodał Administrator niedziela, 14 marzec :27
Pętlami nazywamy konstrukcje języka, które pozwalają na wielokrotne wykonywanie powtarzających się instrukcji. Przykładowo, jeśli trzeba 10 razy wyświetlić na ekranie pewien napis, to można wykorzystać
Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD
Podstawy programowania Wykład: 9 Łańcuchy znaków 1 dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD Tablica znaków w językach C i C++ (oraz pochodnych) łańcuch znaków przechowywany jest jako
4. Procesy pojęcia podstawowe
4. Procesy pojęcia podstawowe 4.1 Czym jest proces? Proces jest czymś innym niż program. Program jest zapisem algorytmu wraz ze strukturami danych na których algorytm ten operuje. Algorytm zapisany bywa
SYSTEMY CZASU RZECZYWISTEGO (SCR)
Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania SYSTEMY CZASU RZECZYWISTEGO (SCR) Podstawy programowanie systemów wbudowanych na bazie platformy sprzętowo-programowej
Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:
Wskaźniki są nieodłącznym elementem języka C. W języku C++ także są przydatne i korzystanie z nich ułatwia pracę, jednak w odróżnieniu do C wiele rzeczy da się osiągnąć bez ich użycia. Poprawne operowanie
PROCESORY SYGNAŁOWE - LABORATORIUM. Ćwiczenie nr 03
PROCESORY SYGNAŁOWE - LABORATORIUM Ćwiczenie nr 03 Obsługa portu szeregowego, układu kodeka audio i pierwsze przetwarzanie sygnałów (cyfrowa regulacja głośności) 1. Konfiguracja układu szeregowego portu
Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.
Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych. 1. Przygotowanie środowiska programistycznego. Zajęcia będą
2 Przygotował: mgr inż. Maciej Lasota
Laboratorium nr 2 1/7 Język C Instrukcja laboratoryjna Temat: Wprowadzenie do języka C 2 Przygotował: mgr inż. Maciej Lasota 1) Wprowadzenie do języka C. Język C jest językiem programowania ogólnego zastosowania
Programowanie strukturalne i obiektowe
Programowanie strukturalne i obiektowe Język C część I Opracował: Grzegorz Flesik Literatura: A. Majczak, Programowanie strukturalne i obiektowe, Helion, Gliwice 2010 P. Domka, M. Łokińska, Programowanie
Instytut Teleinformatyki
Instytut Teleinformatyki Wydział Fizyki, Matematyki i Informatyki Politechnika Krakowska Mikroprocesory i Mikrokontrolery Dostęp do portów mikrokontrolera ATmega32 język C laboratorium: 10 autorzy: dr
Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:
Ćwiczenie nr 6 Temat: Operacje na łańcuchach znaków. Zagadnienia: Zasady pracy z łańcuchami tekstowymi (tablice wartości typu char). funkcje standardowe operacji na łańcuchach, funkcje I/O dla operacji
Python wstęp. Michał Bereta www.michalbereta.pl
Python wstęp Michał Bereta www.michalbereta.pl Wprowadzenie... 1 Źródła wiedzy... 1 Uruchomienie interpretera Pythona... 2 Python jako kalkulator użycie interaktyne... 2 Uruchamianie skryptów z plików...
1 Moduł Inteligentnego Głośnika
1 Moduł Inteligentnego Głośnika Moduł Inteligentnego Głośnika zapewnia obsługę urządzenia fizycznego odtwarzającego komunikaty dźwiękowe. Dzięki niemu możliwa jest konfiguracja tego elementu Systemu oraz
Wydział Elektryczny. Katedra Telekomunikacji i Aparatury Elektronicznej. Konstrukcje i Technologie w Aparaturze Elektronicznej.
Politechnika Białostocka Wydział Elektryczny Katedra Telekomunikacji i Aparatury Elektronicznej Konstrukcje i Technologie w Aparaturze Elektronicznej Ćwiczenie nr 4 Temat: Sterowanie sekwencyjne wyświetlaczem
/*W tym miejscu funkcja system wywołuje systemową komendę PAUSE tj.czeka tak długo, aż zostanie wciśnięty dowolny znak z
Języki i metodyka Programowania Zajęcia 1. 1. Spróbujmy uruchomić pierwszy program. Otwórzmy okno dosowe (polecenie cmd) i po przejściu do katalogu projektu uruchamiamy z linii poleceń nasz program wielokrotnie.
Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.
Wykład 3 ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors. Waldi Ravens J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 75 / 146 deklaracje zmiennych instrukcja podstawienia
Tablice, funkcje - wprowadzenie
Tablice, funkcje - wprowadzenie Przemysław Gawroński D-10, p. 234 Wykład 5 25 marca 2019 (Wykład 5) Tablice, funkcje - wprowadzenie 25 marca 2019 1 / 12 Outline 1 Tablice jednowymiarowe 2 Funkcje (Wykład
1 Moduł Inteligentnego Głośnika 3
Spis treści 1 Moduł Inteligentnego Głośnika 3 1.1 Konfigurowanie Modułu Inteligentnego Głośnika........... 3 1.1.1 Lista elementów Modułu Inteligentnego Głośnika....... 3 1.1.2 Konfigurowanie elementu
Instytut Teleinformatyki
Instytut Teleinformatyki Wydział Fizyki, Matematyki i Informatyki Politechnika Krakowska Mikrokontrolery i Mikroprocesory Zapoznanie się ze środowiskiem IAR Embedded Workbench; kompilacja, debuggowanie,
Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Klawiatura matrycowa
Klawiatura matrycowa Budowa matrycy klawiatury. Nieodzownym elementem każdego systemu mikroprocesorowego jest klawiatura. Umożliwia ona wpływ użytkownika na wykonywany przez niego program. Jednak teoretycznie
Microsoft Visual C++
Microsoft Visual C++ Typy aplikacji okna dialogowe Typy aplikacji Multiple Document Obsługa zdarzeń - komunikaty W celu obsługi zdarzeń pochodzących z wielu źródeł funkcja MainLoop odbiera komunikaty systemowe
Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD
Języki C i C++ Wykład: 2 Wstęp Instrukcje sterujące 1 dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD programowania w C++ Instrukcje sterujące 2 Pętla for for ( instrukcja_ini ; wyrazenie_warunkowe
Technika mikroprocesorowa. Systemy operacyjne czasu rzeczywistego
System operacyjny czasu rzeczywistego (RTOS Real Time Operating System) jest programem bazowym ułatwiającym tworzenie programu użytkowego systemu mikroprocesorowego. System operacyjny czasu rzeczywistego
4 Transmisja szeregowa na przykładzie komunikacji dwukierunkowej z komputerem PC, obsługa wyświetlacza LCD.
13 4 Transmisja szeregowa na przykładzie komunikacji dwukierunkowej z komputerem PC, obsługa wyświetlacza LCD. Zagadnienia do przygotowania: - budowa i działanie interfejsu szeregowego UART, - tryby pracy,
Instytut Teleinformatyki
Instytut Teleinformatyki Wydział Fizyki, Matematyki i Informatyki Politechnika Krakowska Mikroprocesory i mikrokontrolery Przerwania laboratorium: 04 autor: mgr inż. Michał Lankosz dr hab. Zbisław Tabor,
3. Sieć PLAN. 3.1 Adresowanie płyt głównych regulatora pco
3. Sieć PLAN Wszystkie urządzenia podłączone do sieci plan są identyfikowane za pomocą swoich adresów. Ponieważ terminale użytkownika i płyty główne pco wykorzystują ten sam rodzaj adresów, nie mogą posiadać
IPC: Kolejki komunikatów
IPC: Kolejki komunikatów Systemy Operacyjne 2 laboratorium Mateusz Hołenko 7 listopada 2011 Plan zajęć 1 Mechanizmy IPC kolejki komunikatów pamięć współdzielona semafory 2 Kolejki komunikatów kolejka komunikat
Laboratorium nr 10. Temat: Funkcje cz.2.
Zakres laboratorium: Laboratorium nr 10 Temat: Funkcje cz.2. przeciążanie nazw funkcji argumenty domyślne funkcji przekazywanie danych do funkcji przez wartość, wskaźnik i referencję przekazywanie tablic
Programowanie mikrokontrolerów AVR z rodziny ATmega.
Programowanie mikrokontrolerów AVR z rodziny ATmega. Materiały pomocnicze Jakub Malewicz jakub.malewicz@pwr.wroc.pl Wszelkie prawa zastrzeżone. Kopiowanie w całości lub w częściach bez zgody i wiedzy autora
Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.
Część XVII C++ Funkcje Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład. 2 3 Tworzymy deklarację i definicję funkcji o nazwie pobierzln() Funkcja
xmlns:prism=http://www.codeplex.com/prism c. <ContentControl prism:regionmanager.regionname="mainregion" />
1 Tworzenie Shella a. W pierwszej kolejności tworzymy nowy projekt: WPF Application. Name: Shell SolutionName: PrismApp b. Dodajemy bibliotekę PRISM za pomocą NuGet Managera (dla.net Framework 4.5 Prism
1. Opis. 2. Wymagania sprzętowe:
1. Opis Aplikacja ARSOFT-WZ2 umożliwia konfigurację, wizualizację i rejestrację danych pomiarowych urządzeń produkcji APAR wyposażonych w interfejs komunikacyjny RS232/485 oraz protokół MODBUS-RTU. Aktualny
Mikrokontrolery STM32 Praca pod kontrolą FreeRTOS
Dodatkowe materiały >> Mikrokontrolery STM32 Praca pod kontrolą FreeRTOS System operacyjny Zadaniem każdego systemu operacyjnego jest zarządzanie sprzętem w taki sposób, aby zadania stawiane przez użytkownika
LABORATORIUM UKŁADÓW PROGRAMOWALNYCH. PROCESORY OSADZONE kod kursu: ETD 7211 SEMESTR ZIMOWY 2017
Politechnika Wrocławska, Wydział Elektroniki Mikrosystemów i Fotoniki Wydziałowy Zakład Metrologii Mikro- i Nanostruktur LABORATORIUM UKŁADÓW PROGRAMOWALNYCH PROCESORY OSADZONE kod kursu: ETD 7211 SEMESTR
część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia
Język ANSI C część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia najbardziej podstawowe operacje na wskaźnikach int x = 1, y = 2, Tab[10]; int *ip; // czy
Zmienne, stałe i operatory
Zmienne, stałe i operatory Przemysław Gawroński D-10, p. 234 Wykład 2 4 marca 2019 (Wykład 2) Zmienne, stałe i operatory 4 marca 2019 1 / 21 Outline 1 Zmienne 2 Stałe 3 Operatory (Wykład 2) Zmienne, stałe
Sieci Komputerowe 2 / Ćwiczenia 2
Tematyka Sieci Komputerowe 2 / Ćwiczenia 2 Opracował: Konrad Kawecki na podstawie materiałów: http://www.isi.edu/nsnam/ns/tutorial/index.html Na ćwiczeniach zapoznamy się z symulatorem
TECHNIKA MIKROPROCESOROWA II
Akademia Górniczo Hutnicza im. Stanisława Staszica w Krakowie Wydział IEiT Katedra Elektroniki TECHNIKA MIKROPROCESOROWA II LAB 2 Human-Machine Interface, czyli obsługa wyświetlacza slcd Sebastian Koryciak
Programowanie w językach asemblera i C
Programowanie w językach asemblera i C Mariusz NOWAK Programowanie w językach asemblera i C (1) 1 Dodawanie dwóch liczb - program Napisać program, który zsumuje dwie liczby. Wynik dodawania należy wysłać
Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno
Instrukcja laboratoryjna 2 Podstawy programowania 2 Temat: Zmienne dynamiczne tablica wskaźników i stos dynamiczny Przygotował: mgr inż. Tomasz Michno 1 Wstęp teoretyczny 1.1 Tablice wskaźników Tablice
Programowanie mikrokontrolerów AVR
Programowanie mikrokontrolerów AVR Czym jest mikrokontroler? Mikrokontroler jest małym komputerem podłączanym do układów elektronicznych. Pamięć RAM/ROM CPU wykonuje program Układy I/O Komunikacje ze światem
Wstęp do Programowania, laboratorium 02
Wstęp do Programowania, laboratorium 02 Zadanie 1. Napisać program pobierający dwie liczby całkowite i wypisujący na ekran największą z nich. Zadanie 2. Napisać program pobierający trzy liczby całkowite
PROGRAMY STEROWANIA I WIZUALIZACJI II
PWSZ SW W8 PROGRAMY STEROWANIA I WIZUALIZACJI II Układ sekwencyjny Start Stop. Podnośnik góra dół. Układ czasowy naprzemienne załączanie/wyłączanie. Sterowanie symulowanym zbiornikiem. 1. Zadanie UKŁAD
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość
1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość 2. Poprawna definicja wskażnika b to: a) float *a, **b = &a; b) float
1. Opis aplikacji. 2. Przeprowadzanie pomiarów. 3. Tworzenie sprawozdania
1. Opis aplikacji Interfejs programu podzielony jest na dwie zakładki. Wszystkie ustawienia znajdują się w drugiej zakładce, są przygotowane do ćwiczenia i nie można ich zmieniac bez pozwolenia prowadzącego
PMiK Programowanie Mikrokontrolera 8051
PMiK Programowanie Mikrokontrolera 8051 Wykład 3 Mikrokontroler 8051 PMiK Programowanie mikrokontrolera 8051 - wykład S. Szostak (2006) Zmienna typu bit #define YES 1 // definicja stałych #define NO 0
4 Transmisja szeregowa, obsługa wyświetlacza LCD.
1 4 Transmisja szeregowa, obsługa wyświetlacza LCD. Zagadnienia do przygotowania: - budowa i działanie interfejsu szeregowego UART, - tryby pracy, - ramka transmisyjna, - przeznaczenie buforów obsługi
lekcja 8a Gry komputerowe MasterMind
lekcja 8a Gry komputerowe MasterMind Posiadamy już elementarną wiedzę w zakresie programowania. Pora więc zabrać się za rozwiązywanie problemów bardziej złożonych, które wymagają zastosowania typowych
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Abstrakcja funkcyjna Struktury Klasy hermetyzacja
Ćwiczenie 1. Kolejki IBM Message Queue (MQ)
Ćwiczenie 1. Kolejki IBM Message Queue (MQ) 1. Przygotowanie Przed rozpoczęciem pracy, należy uruchomić "Kreator przygotowania WebSphere MQ" oraz przejść przez wszystkie kroki kreatora, na końcu zaznaczając
Języki i metodyka programowania. Wprowadzenie do języka C
Literatura: Brian W. Kernighan, Dennis M. Ritchie Język Ansi C, Wydawnictwa Naukowo - Techniczne, 2007 http://cm.bell-labs.com/cm/cs/cbook/index.html Scott E. Gimpel, Clovis L. Tondo Język Ansi C. Ćwiczenia
Katedra Inżynierii Systemów Sterowania WEiA PG. Przemysłowe Sieci Informatyczne Laboratorium
Katedra Inżynierii Systemów Sterowania WEiA PG Przemysłowe Sieci Informatyczne Laboratorium Instrukcja do ćwiczenia: Sieć Profibus DP (Decentralized Perhipals) Opracowali: Dr inż. Jarosław Tarnawski Dr
Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe
Algorytmy i złożoności Wykład 3. Listy jednokierunkowe Wstęp. Lista jednokierunkowa jest strukturą pozwalającą na pamiętanie danych w postaci uporzadkowanej, a także na bardzo szybkie wstawianie i usuwanie
Przekazywanie argumentów wskaźniki
Przekazywanie argumentów wskaźniki klasyczne wywołanie wyliczenie i zwrotne przekazanie tylko jednej wielkości moŝliwość uŝycia zmiennych globalnych niebezpieczeństwa z tym związane wyjście wywołanie funkcji
Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak
Katedra Elektrotechniki Teoretycznej i Informatyki wykład 12 - sem.iii M. Czyżak Język C - preprocesor Preprocesor C i C++ (cpp) jest programem, który przetwarza tekst programu przed przekazaniem go kompilatorowi.
Instrukcja użytkownika ARSoft-WZ1
05-090 Raszyn, ul Gałczyńskiego 6 tel (+48) 22 101-27-31, 22 853-48-56 automatyka@apar.pl www.apar.pl Instrukcja użytkownika ARSoft-WZ1 wersja 3.x 1. Opis Aplikacja ARSOFT-WZ1 umożliwia konfigurację i
FreeRTOS w PSOC5LP. Do czego służy i jak zaimplementować FreeRTOS w układach Cypress PSoC 5LP. v. 1.2 Bogdan Pankiewicz, marzec 2016, 2017
FreeRTOS w PSOC5LP Do czego służy i jak zaimplementować FreeRTOS w układach Cypress PSoC 5LP v. 1.2 Bogdan Pankiewicz, marzec 2016, 2017 1 Materiały źródłowe 2 [1] Elektronika Praktyczna, 5/2009, Krzysztof
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 6 1 SPECYFIKATOR static Specyfikator static: Specyfikator ten powoduje, że zmienna lokalna definiowana w obrębie danej funkcji nie jest niszczona
Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1
Wątki 1. Wątki - wprowadzenie Wątkiem nazywamy sekwencyjny przepływ sterowania w procesie, który wykonuje dany program np. odczytywanie i zapisywanie plików Program Javy jest wykonywany w obrębie jednego
Temat: System zarządzania zadaniami i ich komunikacja (Scheduler, MessageBox).
Temat: System zarządzania zadaniami i ich komunikacja (Scheduler, MessageBox). Ćwiczenie 3. (sd 2) 1.Uruchamianie zadań / przełączanie zadań. Praca wielozadaniowa (multitasking), daje programiście aplikacyjnemu
Start Bity Bit Stop 1 Bit 0 1 2 3 4 5 6 7 Par. 1 2. Rys. 1
Temat: Obsługa portu komunikacji szeregowej RS232 w systemie STRC51. Ćwiczenie 2. (sd) 1.Wprowadzenie do komunikacji szeregowej RS232 Systemy bazujące na procesorach C51 mogą komunikować się za pomocą
Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21
Dariusz Wardowski dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Przydzielanie pamięci Poniżej przedstawiono w C++ dwie klasy obrazujące sposób rezerwacji pamięci. class Osoba char imie[30];
Parametryzacja przetworników analogowocyfrowych
Parametryzacja przetworników analogowocyfrowych wersja: 05.2015 1. Cel ćwiczenia Celem ćwiczenia jest zaprezentowanie istoty działania przetworników analogowo-cyfrowych (ADC analog-to-digital converter),
Laboratorium Komputerowe Systemy Pomiarowe
Jarosław Gliwiński, Łukasz Rogacz Laboratorium Komputerowe Systemy Pomiarowe ćw. Zastosowanie standardu VISA do obsługi interfejsu RS-232C Data wykonania: 03.04.08 Data oddania: 17.04.08 Celem ćwiczenia