pod adres portu przekazany jako drugi parametr.
|
|
- Beata Komorowska
- 7 lat temu
- Przeglądów:
Transkrypt
1 Technika jądrowa KNOW HOW Jądro 2.6 programowanie jądra i sterowników TECHNIKA JĄDROWA W ostatnim odcinku Techniki jądrowej omawialiśmy znakowe sterowniki urządzeń wirtualnych. W dzisiejszym odcinku pokazujemy, jak za pomocą jądra 2.6 obsługiwać prawdziwy sprzęt komputera PC, zwłaszcza urządzenia PCI. EVA-KATHARINA KUNST I JÜRGEN QUADE Składniki sprzętowe mogą się zepsuć, a ich zachowanie z czasem może także podlegać pewnym wahaniom. Dlatego w systemie operacyjnym, w którym stawia się na stabilność, takim jak Linux, dostęp do zasobów sprzętowych jest zawsze sprawą delikatną. Jednak również w jądrze 2.6, tak jak w wersji 2.4, programowanie własnych sterowników sprzętu pozostaje proste. Nawet wejście-wyjście i przestrzeń adresowa pamięci procesora są dostępne naprawdę w łatwy sposób dzięki zestawowi makr czy funkcji (zobacz Rysunek 1). Procesor uzyskuje dostęp do adresów w obszarze wejścia-wyjścia, do portów, przy użyciu osobnych poleceń wejścia i wyjścia. Aby zachować przenośność jądra, polecenia te są zamknięte w makrach. Jeśli aplikacja żąda danych ze sprzętu, funkcja read najpierw uruchamia odpowiednią funkcję DriverRead (zobacz [1]) wewnątrz sterownika. Dopiero kiedy autor sterownika wprowadzi specjalne makro w funkcji DriverRead, dochodzi do faktycznego przepływu danych ze sprzętu. Następnie makra inb, inw i inl odczytują z portu 8, 16 lub 32 bity, które dostały jako parametr. Zapis na wejściu-wyjściu sprzętu należy do makr outb, outw i outl; są one ulokowane w funkcji DriverWrite. Kierują one 8- ( b ), 16- ( w ) lub 32-bitową ( l ) wartość, którą dostały jako pierwszy parametr, pod adres portu przekazany jako drugi parametr. Na Listingu 1 w wierszu 24 posługujemy się odmianą takiego makra: outb_p. Literka p oznacza pauzę. W tej postaci, a istnieje ona dla wszystkich poleceń portów, po każdym dostępie do sprzętu nastąpi krótka przerwa, aby dostęp nie następował zbyt szybko. Niektóre urządzenia nie mogą poradzić sobie ze zbyt szybką transmisją. Jądro może uzyskać dostęp do obszaru pamięci urządzeń, które włączają się w normalną przestrzeń adresową, przy użyciu tych samych poleceń, za pomocą których obsługuje się zwykłą pamięć operacyjną. Aby nie zmniejszyć przenośności jądra, takie bezpośrednie operacje są zabronione. Zamiast nich występują funkcje readb, readw i readl. Odczytują one z przekazanego jako parametr adresu w pamięci jeden bajt lub jedno 16- lub 32-bitowe słowo. Analogicznie funkcje writeb, writew i writel zapisują wartość przekazaną jako pierwszy parametr w komórce pamięci, którą określa drugi parametr. Bitowe typy danych Nazewnictwo makr jest jasne: przy dostępie do sprzętu nie używa się typów char, short, int ani long, lecz danych o określonej w bitach długości. Jest tak dlatego, że typy danych w języku C zależą od typu komputera. Dla mikroprocesora typ danych int oznacza 16- bitowe słowo, a dla najnowszego procesora może to być słowo 32-bitowe. W Linuksie bitowe typy danych są definiowane przez dołączenie plików nagłówkowych asm/types.h. W ten sposób udostępniane są w nim definicje typów zmiennych u8, u16 i u32, które oznaczają 8-, 16- i 32-bitowe zmienne bez znaku; z kolei typy s8, s16 i s32 oznaczają 8-, 16- i 32-bitowe zmienne ze znakiem. Bitowe typy danych są do dyspozycji w zmodyfikowanej postaci także w aplikacjach: typ u8 z jądra w aplikacji ma formę u8. Rysunek 1: Jądro udostępnia sterownikowi cały szereg funkcji, służących zarówno do wymiany danych między aplikacjami a sterownikiem, jak i między sterownikiem a sprzętem. NUMER 16 MAJ
2 KNOW HOW Technika jądrowa Rysunek 2: Rejestr sterowania układem PIT składa się z wielu bitów [2]. W celu użycia głośniczka PC rejestr zostaje zainicjowany wartością 0xb6: stosowany jest licznik 2 oraz zapisywane są oba bajty licznika i wybrany tryb liczenia 3. Wówczas licznik pracuje w formacie binarnym. Listing 1: Dostęp do adresów portów 01 #include <linux/module.h> 02 #include <linux/version.h> 03 #include <linux/init.h> 04 #include <linux/fs.h> 05 #include <asm/uaccess.h> 06 #include <asm/io.h> MODULE_LICENSE ("GPL"); static ssize_t DriverWriteU ( struct file *File, 11 user const char *User,U size_t count, loff_t *Offs) 12 { 13 u16 tone; 14 u8 Save; 15 char buffer[6]; if( count > sizeofu (buffer) ) 18 count = sizeof(buffer); 19 copy_from_user( buffer,u User, count ); 20 buffer[sizeof(buffer)-1] =U '\0'; 21 tone = (u16) simple_u strtoul( buffer, NULL, 0 ); 22 if( tone ) { 23 tone = CLOCK_TICK_U RATE/tone; 24 outb( 0xb6, 0x43 ); //U Tryb 3: generowanie faliu prostokątnej 25 outb_p(tone & 0xff,U 0x42); 26 outb((tone>>8) &U 0xff, 0x42); 27 Save = inb( 0x61 ); 28 outb( Save 0x03, 0x61 ); 29 } else { 30 outb(inb_p(0x61) & U 0xFC, 0x61); 31 } 32 return count; 33 } static struct file_operationsu Fops = { 36.owner=THIS_MODULE, 37.write=DriverWrite, 38 }; static int init BufInit(void) 41 { 42 if(register_chrdevu (240, "PC-Speaker", &Fops) == 0) 43 return 0; 44 return -EIO; 45 } static void exit BufExit(void) 48 { 49 outb(inb_p(0x61) & 0xFC,U 0x61); 50 unregister_chrdev(240,u "PC-Speaker"); 51 } module_init( BufInit ); 54 module_exit( BufExit ); Brzęczenie z głośnika Na Listingu 1 widać, jak za pomocą przedstawionych makr można wydusić dźwięki ze starego, dobrego głośniczka w komputerze PC. Trzy adresy portów obsługują głośnik: 0x42, 0x43 i 0x61. Dwa pierwsze należą do układu PIT (Programmable Interval Timer programowalny generator odstępu czasu). 0x42 to rejestr danych służący do zapisu wartości licznika układu PIT. Przez port 0x43 można ustawić sposób pracy tej kostki (zobacz Rysunek 2). Wartość 0xb6 włącza tryb pracy 3. W tym trybie pracy układ PIT generuje sygnał prostokątny, który powstaje z wartości czasomierza ustawionej przez port 0x42 i CLOCK_TICK_RATE. Autentyczna wartość czasomierza jest 2-bajtowa, lecz musi być zapisana jako dwa pojedyncze bajty: najpierw bajt mniej znaczący, a potem bardziej znaczący. Na koniec makro przełącza wyjście układu PIT, z którego wychodzi sygnał prostokątny, na głośnik. W tym celu ustawia oba mniej znaczące bity z portu 0x61 na 1. Dokładniejsze informacje o programowaniu układu PIT znajdują się w [2]. Za pomocą znanego z [3] pliku Makefile można skompilować nowy sterownik głośniczka i załadować poleceniem insmod. Po utworzeniu pliku urządzenia: mknod Speaker c wreszcie usłyszymy przecudną muzykę. Gdy zapiszemy w nowym pliku urządzenia wartość: echo "440" > Speaker zostanie ona zinterpretowana jako częstotliwość i będzie słyszalna w głośniczku może niezbyt to piękne, ale za to wyraźne. Polecenie Zachować ciszę w bibliotece! ma postać: echo "0" > Speaker Inteligentny Czytelnik na pewno dostrzeże, że przedstawiony sterownik co prawda działa, ale ma pewne braki. Pomijamy już to, że występuje tu niechroniona, krytyczna część, bo to historia na osobny artykuł. Jednak fakt, że sterownik korzysta z zasobów, czyli z portów, nie rezerwując ich wcześniej, jest w nowoczesnych systemach operacyjnych całkowicie niedopuszczalny. Należy to zaraz zmienić. 66 NUMER 16 MAJ
3 Technika jądrowa KNOW HOW Proszę jedną rezerwację! Adresy portów są w takiej samej mierze zasobami, jak obszary pamięci operacyjnej, kanały DMA i przerwania. Aby jądro mogło poprawnie zarządzać zasobem, nie może z niego wielokrotnie korzystać. Dlatego też każdy składnik jądra musi rezerwować zasoby przed ich użyciem, a następnie o ile tylko dostęp nie nastąpi w bezpośrednio dającej się przewidzieć przyszłości szybko je zwalniać. We właśnie opisanym sterowniku głośnika zignorowaliśmy z pewnych powodów rezerwację portów. Sterownik nie otrzymałby żadnego zezwolenia, gdyż odnośne zasoby były już zajęte przez inne podsystemy, a więc zarezerwowane. Do rezerwacji w jądrze służy wiele funkcji: > Porty Prototypy znajdują się w pliku linux/ioport.h. struct resource *request_region( unsigned long count, const char *name ); void release_region( unsigned long count ); Porty są rezerwowane na wyłączność dla jednego sterownika. Parametr start określa port, od którego jądro ma rezerwować count portów. Rezerwacja będzie przeprowadzona z użyciem nazwy name. Wartość zwrotna funkcji request_region różna od NULL oznacza, że żądane zasoby są do dyspozycji sterownika. > Adresy w pamięci Prototypy są skatalogowane w pliku linux/ioport.h: struct resource *request_mem_u region( unsigned long count, const char *name ); void release_mem_region( unsigned long count ); Parametry odpowiadają funkcjom portów: start to adres początkowy rezerwowanego obszaru, count to liczba adresów, a name oznaczenie, przy użyciu którego jądro zarządza rezerwacją i ją identyfikuje. Jeśli funkcja request_mem_region zwraca wartość różną od NULL, oznacza to, że sterownik może korzystać z żądanych zasobów. > Kanały DMA Prototypy znajdują się w pliku asm/dma.h: int request_dma( unsigned int dmanr, const char *device_id); void free_dma( unsigned int dmanr); Parametr dmanr określa żądany kanał DMA, a device_id przysługujący mu identyfikator. Wartość zwrotna różna od NULL wskazuje, że rezerwacja się udała. > Przerwania Prototypy znajdują się w pliku linux/interrupt.h: int request_dma( unsigned int irq, irqreturn_t (*handler) ( int, void *, struct pt_regs *), unsigned long irqflags, const char *devname, void *dev_id); void free_irq( unsigned int irq, void *dev_id); Przerwania to jedyne zasoby sprzętowe, których jądro nie przydziela z konieczności sterownikowi na wyłączność. Wspólne korzystanie z przerwania jest możliwe, gdy każda z odnośnych procedur obsługi przerwania może sprawdzić, czy to własne, czy też obce urządzenie wywołało przerwanie. Parametr irq podaje numer przerwania. Nazwa sterownika jest zawarta w parametrze devname. Parametr dev_id musi być unikatowy w systemie. Służy on do rozróżniania wielokrotnych rezerwacji tego samego przerwania. Parametr irqflags to pole bitowe, które steruje - w pewnych granicach - zachowaniem procedury obsługi przerwania. Programista może przy tym łączyć następujące bity: SA_SHIRQ: wiele sterowników może korzystać z tego samego przerwania, gdyż nie jest ono dostępne na wyłączność dla jednego sterownika. SA_INTERRUPT: przerwania będą z powrotem zwalniane do lokalnego procesora (tj. procesora, który właśnie obsługuje przerwanie). Wówczas procedura obsługi przerwania może być przerwana przez dalsze przerwania. SA_SAMPLE_RANDOM: ustawiony bit oznacza, że moment wystąpienia przerwania służy do tworzenia liczby losowej. Same adresy procedury obsługi przerwania są podawane w parametrze handler. W przeciwieństwie do wcześniejszych jąder, procedura obsługi przerwania ma wartość zwrotną: Zwraca ona IRQ_NONE, o ile wyzwolone przerwanie nie było przeznaczone dla danego sterownika. Jeśli procedura obsługi przerwania obsłużyła przerwanie, zwraca IRQ_HANDLED. Wartość zwrotna makra IRQ_RETVAL (X) zależy od tego, czy X ma wartość różną od NULL. Zwraca wówczas albo IRQ_HAN- DLED, albo IRQ_NONE. Rezerwacja zasobów należy do fazy inicjacji urządzenia. Należą tutaj też: rozpoznanie urządzenia i inicjacja urządzenia. Inicjacja sprzętu może tylko wtedy się udać, gdy sprzęt występuje w komputerze. Musi być znany jego adres i rozmiar zasobów. Głośnik w komputerze PC jest na przykład zawsze zainstalowany i jest zawsze dostępny pod tym samym adresem portu. Dlatego też te informacje są znane i można je uzyskać z każdej dokumentacji sprzętu komputera PC. Nieuchwytne PCI Wcześniejsza wiedza o standardowych składnikach komputera PC zawsze przydaje się przy każdego rodzaju sprzęcie. W wypadku dominujących już od dosyć dawna urządzeń PCI programista nie może liczyć, że występują one w komputerze podczas rozruchu systemu, gdyż są to, zgodnie z definicją linuksową, urządzenia podłączane podczas pracy (ang. hotpluggable devices). W ten sposób określa się urządzenia, które podczas pracy systemu (!) mogą być zainstalowane i wyjęte. Jako że podsystem PCI jądra jest odpowiedzialny za stwierdzenie, czy urządzenie jest włożone, czy też wyjęte, procedura mogłaby też obsługiwać inicjację i dezinicjację urządzenia. Dlatego też w sterownikach PCI inicjacja sterownika (kod w funkcji init_module, względnie modules_init) jest oddzielona od inicjacji urządzenia. Podczas inicjacji sterownika zgłasza się on tylko w podsystemie PCI. Wywołuje on w tym celu funkcję NUMER 16 MAJ
4 KNOW HOW Technika jądrowa pci_module_init, której jedyny parametr jest typu struct pci_driver: struct pci_driver { struct list_head node; char *name; const struct pci_device_idu *id_table; int (*probe) (struct pci_devu *dev, const struct pci_device_idu *id); void (*remove) (struct pci_devu *dev);... }; Tu należy w istocie zapisać pola: nazwa sterownika name; tabela, przez którą sterownik stwierdza, za które urządzenie jest odpowiedzialny (id_table) i każdorazowo funkcja inicjacji oraz dezinicjacji urządzenia (probe i remove). Identyfikacja urządzenia PCI jest możliwa na podstawie łącznie sześciu cech: oznaczenia producenta, oznaczenia urządzenia, oznaczenia producenta i urządzenia dla podsystemu, klasy urządzenia i maski klasy urządzenia (wszystkie o długości 16 bitów). Struktura danych typu struct pci_device_id, która przechowuje identyfikację, wskazuje na kolejny element. Tak jak w wielu strukturach danych jądra, jest tu zwykle rezerwowane miejsce, które sterownik może wykorzystywać do własnych celów (zobacz Rysunek 3). Na szczęście sterownik PCI nie musi podawać wszystkich cech w sposób wyczerpujący, aby później obsługiwać urządzenie. Zamiast wszystkich cech programista może zastosować oznaczenie wieloznaczne PCI_ANY_ID i PCI_CLASS_NOT_DEFINED. Najczęściej struct pci_device_id: struktura danych określa urządzenia, za które odpowiada sterownik. struct pci_dev: struktura danych przekazuje podsystemowi PCI opis sterownika. Należą tu tabele urządzeń (struct pci_device_id) i adresy funkcji służących do inicjacji i dezinicjacji urządzenia. pci_modul_init: za pomocą tej funkcji sterownik zgłasza się w podsystemie PCI. inicjacja urządzenia: sterownik musi udostępniać funkcję inicjacji urządzenia. Jej nazwę można wybrać dowolnie. Podsystem PCI uzyskuje adres tej funkcji za pośrednictwem struktury danych struct pci_dev. W ramach wystarcza jawne ustawienie dwóch pierwszych cech. Jeśli podsystem PCI znajdzie urządzenie, którego cechy zgadzają się z określonymi w strukturze sterownika, wywołuje funkcję detekcji czyli funkcję sterownika służącą do inicjacji urządzenia. Z kolei sterownik na podstawie przekazanych przez podsystem PCI informacji rozstrzyga, czy może obsługiwać urządzenie, czy też nie. Jeśli tak, musi po pierwsze włączyć urządzenie za pomocą Siedem składników sterownika PCI tej funkcji są także rezerwowane potrzebne zasoby. pci_enable_device: funkcja jest wywoływana w ramach inicjacji urządzenia. Włącza ona urządzenie. dezinicjacja urządzenia: sterownik musi mieć funkcję dezinicjacji urządzenia. Jej nazwę można wybrać dowolnie. Podsystem PCI uzyskuje adres tej funkcji za pośrednictwem struktury danych struct pci_dev. W ramach tej funkcji wcześniej zarezerwowane zasoby są zwalniane. pci_unregister_driver: gdy sterownik zostanie zwolniony z pamięci, musi się wyrejestrować z podsystemu PCI za pomocą tej funkcji. Listing 2: Fragment kodu własnego sterownika 01 #include <linux/fs.h> 02 #include <linux/version.h> 03 #include <linux/module.h> 04 #include <linux/init.h> 05 #include <linux/pci.h> 06 #include <linux/interrupt.hu > MODULE_LICENSE("GPL"); // TODO: Tu muszą zostaću wpisane własne identyfikatory. 11 #define MY_VENDOR_ID U <I>0x10b7<I> 12 #define MY_DEVICE_ID U <I>0x5157<I> static unsigned long ioport=0l,u iolen=0l, memstart=0l, memlen=0l; static irqreturn_t pci_isr( intu irq, void *dev_id, struct pt_regsu *regs ) 17 { 18 return IRQ_HANDLED; 19 } static int DeviceInit(structU pci_dev *dev, const struct pci_u device_id *id) 22 { 23 printk("0x%4.4x 0x%4.4x:U \"%s\"\n", dev-u >vendor,dev->device, 24 dev->dev.name ); 25 if( request_irq (devu ->irq,pci_isr,sa_u INTERRUPT SA_SHIRQ,"pci_drv",NULL)U ) { 26 printk(u KERN_ERR "pci_drv: IRQ %d notu free.\n", dev->irq ); 27 return -EIO; 28 } 29 ioport = pci_u resource_start( dev, 0 ); 30 iolen = pci_u resource_len( dev, 0 ); 31 if( request_regionu ( ioport, iolen, dev->dev.u name )==NULL ) { 32 printk(kern_erru "I/O address conflict for device \"%s\"\n", 33 dev->dev.name); 34 goto cleanup_irq; 35 } 36 memstart = pci_u resource_start( dev, 1 ); 37 memlen = pci_u resource_len( dev, 1 ); 38 if( request_mem_regionu ( memstart, memlen, dev->dev.u name )==NULL ) { 39 release_regionu ( ioport, iolen ); 40 printk(kern_erru "Memory address conflict for device \"%s\"\n", 41 dev->dev.name); 42 goto U cleanup_ports; 43 } 68 NUMER 16 MAJ
5 Technika jądrowa KNOW HOW Rysunek 3: Sterownik określa w strukturze danych typu struct pci_device_id wszystkie urządzenia, które jest w stanie obsłużyć. Tu zostaje wybrane urządzenie oznaczone jako 0x5950 przez producenta 3com 0x10b7 (PCI_VENDOR_ID_3COM). funkcji pci_enable_dev, a po drugie zwrócić wartość 0 podsystemowi PCI. Każda inna wartość oznacza dla podsystemu PCI proszę udać się do innego sterownika. Podsystem PCI wywołuje funkcję usuwania, kiedy urządzenie zostało wyjęte oraz kiedy sterownik zgłasza się w podsystemie PCI przy użyciu funkcji pci_unregister_driver. Zbieranie informacji o PCI Pozostaje jeszcze pytanie, w jaki sposób sterownik uzyskuje dostęp do zasobów rezerwowanych dla urządzenia. Ilekroć podsystem PCI wywołuje funkcję detekcji, jądro przekazuje sterownikowi strukturę danych typu struct dev_id, która zawiera żądane informacje. Każde urządzenie PCI może posiadać maksymalnie sześć różnych obszarów pamięci lub wejścia-wyjścia. Adresy, rodzaj i wielkość tych obszarów są zapisane w komórkach oznaczonych w pamięci konfiguracyjnej sprzętu PCI (zobacz Rysunek 4) nazwami od Base Address 0 do Base Address 5. Ponieważ informacje o adresie, rodzaju i wielkości są zakodowane w wartości 32-bitowej, sterownik musi ją odpowiednio odkodować. Autorowi sterownika służą do tego makra zdefiniowane w pliku nagłówkowym linux/pci.h. Każdy z nich oczekuje dwóch parametrów: po pierwsze wskaźnika do przekazanych danych PCI o urządzeniu (struct pci_dev), a po drugie numeru komórki w pamięci konfiguracyjnej (a więc numeru od 0 do 5). Makro pci_resource_start zwraca adres początkowy obszaru pamięci. Każdy obszar ma minimalny rozmiar 16 bajtów. Konkretną długość podaje makro pci_resource_len. Ponadto autor sterownika może uzyskać koniec obszaru pamięci za pomocą makra pci_resource_end. Do określenia typu zasobu, pamięci lub adresu wejścia-wyjścia, istnieje także makro: pci_resource_flag. Plik nagłówkowy linux/ioport.h definiuje odpowiednie flagi IORESOURCE_IO, IORESOUR- CE_MEM, IORESOURCE_IRQ i IORESO- URCE_DMA. Także kiedy za pomocą tych mechanizmów można automatycznie zarezerwować zasoby urządzenia PCI, programista musi znać sposób wykorzystania tych zasobów. Najczęściej w dokumentacji sprzętu można znaleźć na przykład informacje, pod jakim adresem w pamięci konfiguracyjnej znajduje się dany zasób. Na Listingu 2 widać szkielet prostej inicjacji urządzenia PCI. W przykładzie założono, że urządzenie wymaga przerwania, a w pamięci konfiguracyjnej Base Address 0 ma adres wejścia-wyjścia, zaś w pamięci konfiguracyjnej Base Address 1 adresy w przestrzeni adresowej pamięci. Autorzy własnych sterowników PCI muszą w szczególności dopasować identyfikację zasobów MY_VENDOR_ID i MY_DEVICE_ID do własnego sprzętu. Moduł można skompilować i załadować nawet bez obsługiwanego przez niego sprzętu. Osoby, które wcześniej przetestowały moduł głośniczka, nie powinny zapomnieć 44 pci_enable_device( dev ); 45 return 0; 46 cleanup_ports: 47 release_region( ioport,u iolen ); 48 cleanup_irq: 49 free_irq( dev->irq,u "pci_drv" ); 50 return -EIO; 51 } static void DeviceDeInitU ( struct pci_dev *pdev ) 54 { 55 free_irq( pdev->irq,u "pci_drv" ); 56 if( ioport ) 57 release_regionu ( ioport, iolen ); 58 if( memstart ) 59 release_mem_u region( memstart, memlen ); 60 } 61 Listing 2: Fragment kodu własnego sterownika 62 static struct file_operationsu PCIFops; static struct pci_device_idu pci_drv_tbl[] devinitdata = { 65 { MY_VENDOR_ID, MY_U DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,U 0, 0, 0 }, 66 { 0, } 67 }; static struct pci_driveru pci_drv = { 70.name= "pci_drv", 71.id_table= pci_drv_tbl, 72.probe= DeviceInit, 73.remove= DeviceDeInit, 74 }; static int init pci_drv_u init(void) 77 { 78 if(register_chrdev(240,u "PCI-Driver", &PCIFops)==0) { 79 if( pci_u module_init(&pci_drv) == 0 ) 80 return 0; 81 unregister_u chrdev(240,"pci-driver"); 82 } 83 return -EIO; 84 } static void exit U pci_drv_exit(void) 87 { 88 pci_unregister_driveru ( &pci_drv ); 89 unregister_u chrdev(240,"pci-driver"); 90 } module_init(pci_drv_init); 93 module_exit(pci_drv_exit); NUMER 16 MAJ
6 KNOW HOW Technika jądrowa Rysunek 4: Każde urządzenie PCI ma pamięć konfiguracyjną o wielkości 256 bajtów, w której przechowywane są najważniejsze parametry sprzętu częściowo zakodowane. Podsystem PCI jądra przygotowuje istotne parametry sterownika przy użyciu struktury danych typu struct pci_dev. skasowane, a obie definicje MY_DEVICE_ID i MY_VENDOR_ID zastąpione przez PCI_ANY_ID (#define MY_DEVICE_ID PCI_ANY), jądro wywoła funkcję detekcji DeviceInit dla każdego urządzenia PCI, dla którego wcześniej nie znalazło sterownika. Funkcja printk w wierszu 23 generuje odpowiednie dane w dzienniku syslog (zobacz Rysunek 5). To, czy wyświetlą się one na konsoli, czy też w pliku (na przykład /var/log/messages), zależy od konfiguracji demona syslog (często /etc/syslogd). Rysunek 5: Za pomocą funkcji printk kod jądra może przekazać informacje użytkownikowi. Demon dziennika jądra przekazuje dane normalnemu mechanizmowi syslogd w Linuksie. o zwolnieniu starego modułu poleceniem rmmod, gdyż oba moduły mają zakodowaną tę samą liczbę główną. Podczas ładowania modułu należy podać kompletną nazwę obiektu, lecz podczas zwalniania wystarczy podać tylko właściwą część nazwy: insmod speaker.ko, ale rmmod speaker. Na Listingu 2 w oczy rzucają się dwie charakterystyczne rzeczy: użycie konstrukcji goto i dyrektywa devinit. Instrukcji goto można byłoby łatwo uniknąć. Ponieważ jest ona jednak zgodna ze stylem programowania jądra, została tutaj umyślnie zastosowana (zo- Goto OR Not goto bacz Ramkę Goto OR Not goto ). Dyrektywa devinitdata należy do opisywanych w pierwszym odcinku [3] typu dyrektyw init i exit. Jest ona używana w deklaracji i definicji globalnych zmiennych, których z kolei wymaga inicjacja urządzenia podłączanego w czasie pracy komputera. Jeśli jądro nie obsługuje tej klasy urządzeń, umiejscawia ono tak wyróżnione zmienne w segmencie inicjacyjnym. Ten fragment pamięci po rozruchu zostaje zwolniony. Na koniec jeszcze coś do wypróbowania: gdyby wiersze od 25 do 49 na Listingu 2 zostały Uczeni są co do tego jednomyślni: goto nie pasuje do strukturalnego programowania, a więc należy unikać tej instrukcji. A jednak Linus Torvalds przeciwstawia się tutaj opinii profesorów (i to nie pierwszy raz). W bardzo ciekawym wątku na liście dyskusyjnej poświęconej jądru [4] omówiono wszystkie za i przeciw. Można więc podsumować, że instrukcja goto wewnątrz jądra systemu operacyjnego jest mile widziana, gdyż ma dwie podstawowe zalety: kod staje się po pierwsze bardziej przejrzysty, zatem czytelny, a poza tym instrukcje goto przyczyniają się do zwiększenia wydajności. Błędem byłoby używać instrukcji goto zawsze i wszędzie. Tego nie popierają także Torvalds i jego koledzy. Jądro Linuksa korzysta z instrukcji goto przede wszystkim przy kończeniu nieudanych inicjacji. Tutaj to słowo kluczowe ułatwia zwolnienie zasobów w kolejności odwrotnej do tej, w jakiej je wcześniej zarezerwowano (zobacz Listing 2, funkcja DeviceInit). W następnym odcinku Jeśli zawsze chcieliście się dowiedzieć, jak jest programowany wątek jądra i co to jest tasklet, a wstydziliście się zapytać, to nie przegapcie następnego odcinka Techniki jądrowej w Linux Magazine. Ponieważ Linux Torvalds zrobił duże porządki w obszarze Soft- -IRQ i kolejek roboczych w jądrze 2.6, temat będzie też fascynujący dla starych jądrowych wyjadaczy. (jk) INFO [1] Eva-Katharina Kunst i Jürgen Quade Technika jądrowa, odcinek 2, Linux Magazine nr 13 z lutego 2005 [2] Assembler Page (TU-Chemnitz): RA/educ/mop/assembler_hints/ports.html [3] Eva-Katharina Kunst i Jürgen Quade Technika jądrowa, odcinek 1, Linux Magazine nr 12 ze stycznia 2005 [4] Lista dyskusyjna jądra Linuksa zastosowanie instrukcji GOTO w jądrze : /2003/1/12/128/index.html AUTOR Eva-Katharina Kunst, dziennikarka i Jürgen Quade, profesor w Hochschule Niederrhein, należą od czasu powstania Linuksa do fanów oprogramowania Open Source. 70 NUMER 16 MAJ
Linux Kernel III. Character devices
Linux Kernel III Character devices Urządzenia systemu Linux (I) Character device Block device Network device Do urządzenia piszemy jak do pliku, Dozwolone działania: open, close, read, write, Np. /dev/tty1.
TECHNIKA JĄDROWA. Sterowniki sprzętowe stanowią sporą. Nowe jądro 2.6 programowanie jądra i sterowników odcinek 6
Nowe jądro 2.6 programowanie jądra i sterowników odcinek 6 TECHNIKA JĄDROWA Do nowości w jądrze 2.6 należy model urządzeń i system plików sys. Pokażemy, jak wykorzystać je we własnych modułach jądra. EVA-KATHARINA
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ę
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,
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ć
Kompilator języka C na procesor 8051 RC51 implementacja
Kompilator języka C na procesor 8051 RC51 implementacja Implementowane typy danych bit 1 bit char lub char signed 8 bitów char unsigned 8 bitów int lub signed int 16 bitów unsigned int 16 bitów long lub
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
Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1
Typy złożone Struktury, pola bitowe i unie. Programowanie Proceduralne 1 Typy podstawowe Typy całkowite: char short int long Typy zmiennopozycyjne float double Modyfikatory : unsigned, signed Typ wskaźnikowy
Adresowanie obiektów. Adresowanie bitów. Adresowanie bajtów i słów. Adresowanie bajtów i słów. Adresowanie timerów i liczników. Adresowanie timerów
Adresowanie obiektów Bit - stan pojedynczego sygnału - wejście lub wyjście dyskretne, bit pamięci Bajt - 8 bitów - wartość od -128 do +127 Słowo - 16 bitów - wartość od -32768 do 32767 -wejście lub wyjście
Prezentacja systemu RTLinux
Prezentacja systemu RTLinux Podstawowe założenia RTLinux jest system o twardych ograniczeniach czasowych (hard real-time). Inspiracją dla twórców RTLinux a była architektura systemu MERT. W zamierzeniach
Mikroprocesor Operacje wejścia / wyjścia
Definicja Mikroprocesor Operacje wejścia / wyjścia Opracował: Andrzej Nowak Bibliografia: Urządzenia techniki komputerowej, K. Wojtuszkiewicz Operacjami wejścia/wyjścia nazywamy całokształt działań potrzebnych
Mikrokontroler ATmega32. Język symboliczny
Mikrokontroler ATmega32 Język symboliczny 1 Język symboliczny (asembler) jest językiem niskiego poziomu - pozwala pisać programy złożone z instrukcji procesora. Kody instrukcji są reprezentowane nazwami
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
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
Organizacja pamięci VRAM monitora znakowego. 1. Tryb pracy automatycznej
Struktura stanowiska laboratoryjnego Na rysunku 1.1 pokazano strukturę stanowiska laboratoryjnego Z80 z interfejsem częstościomierza- czasomierz PFL 21/22. Rys.1.1. Struktura stanowiska. Interfejs częstościomierza
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
Podział programu na moduły
Materiały Podział programu na moduły Informatyka Szczegółowe informacje dotyczące wymagań odnośnie podziału na moduły: http://www.cs.put.poznan.pl/wcomplak/bfiles/c_w_5.pdf Podział programu na moduły pozwala
Struktury. Przykład W8_1
Struktury Struktury pozwalają na grupowanie zmiennych różnych typów pod wspólną nazwą. To istotnie ułatwia organizacje danych, które okazują się w jednym miejscu kodu programu. To jest bardzo ważne dla
Embedded Systems Programming
Embedded Systems Programming Device drivers - interrupts and timers Iwona Kochańska Katedra Systemów Elektroniki Morskiej WETI PG April 7, 2019 Przerwania Przerwanie - sygnał powodujacy zmianę przepływu
Wykład 5 Przerwania i wywołania systemowe. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB
Wykład 5 Przerwania i wywołania systemowe Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB Porty wejścia-wyjścia Intel x86 posiada 65536 portów wejścia-wyjścia, do których dostęp możliwy
Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).
Zarządzanie pamięcią Pamięć: stos i sterta Statyczny i dynamiczny przydział pamięci Funkcje ANSI C do zarządzania pamięcią Przykłady: Dynamiczna tablica jednowymiarowa Dynamiczna tablica dwuwymiarowa 154
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
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.
Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780
Dane techniczne : Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780 a) wielkość bufora znaków (DD RAM): 80 znaków (80 bajtów) b) możliwość sterowania (czyli podawania kodów znaków) za pomocą
Pośredniczy we współpracy pomiędzy procesorem a urządzeniem we/wy. W szczególności do jego zadań należy:
Współpraca mikroprocesora z urządzeniami zewnętrznymi Urządzenia wejścia-wyjścia, urządzenia których zadaniem jest komunikacja komputera z otoczeniem (zwykle bezpośrednio z użytkownikiem). Do najczęściej
Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład 6 Wskaźniki Krzysztof Banaś Podstawy programowania 1 Adresy zmiennych Język C pozwala na operowanie adresami w pamięci stąd, między innymi, kwalifikowanie C jako języka relatywnie
1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
EVA-KATHARINA KUNST, JÜRGEN QUADE. informacje, korzystają z funkcji asynchronicznych.
Technika jądrowa KNOW HOW Nowe jądro 2.6 - programowanie jądra i sterowników TECHNIKA JĄDROWA W pierwszych trzech odcinkach Techniki jądrowej pisaliśmy o samodzielnym tworzeniu modułów jądra dla sterowników,
ZASADY PROGRAMOWANIA KOMPUTERÓW
POLITECHNIKA WARSZAWSKA Instytut Automatyki i i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW Język Język programowania: C/C++ Środowisko programistyczne: C++Builder 6 Wykład 9.. Wskaźniki i i zmienne dynamiczne.
1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
INFORMATYKA Studia Niestacjonarne Elektrotechnika
INFORMATYKA Studia Niestacjonarne Elektrotechnika Wydział Elektrotechniki i Informatyki dr inż. Michał Łanczont Wydział Elektrotechniki i Informatyki p. E419 tel. 81-538-42-93 m.lanczont@pollub.pl http://lanczont.pollub.pl
Język C zajęcia nr 11. Funkcje
Język C zajęcia nr 11 Funkcje W języku C idea podprogramów realizowana jest wyłącznie poprzez definiowanie i wywołanie funkcji. Każda funkcja musi być przed wywołaniem zadeklarowana. Deklaracja funkcji
Metody obsługi zdarzeń
SWB - Przerwania, polling, timery - wykład 10 asz 1 Metody obsługi zdarzeń Przerwanie (ang. Interrupt) - zmiana sterowania, niezależnie od aktualnie wykonywanego programu, spowodowana pojawieniem się sygnału
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
Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.
Struktura programu Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem. W ostatnich latach najbardziej używanym stylem oprogramowania
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
Pliki. Informacje ogólne. Obsługa plików w języku C
Pliki Informacje ogólne Plik jest pewnym zbiorem danych, zapisanym w systemie plików na nośniku danych (np. dysku twardym, pendrive, płycie DVD itp.). Może posiadać określone atrybuty, a odwołanie do niego
Dodatek B. Zasady komunikacji z otoczeniem w typowych systemach komputerowych
Dodatek B. Zasady komunikacji z otoczeniem w typowych systemach komputerowych B.1. Dostęp do urządzeń komunikacyjnych Sterowniki urządzeń zewnętrznych widziane są przez procesor jako zestawy rejestrów
SYSTEMY OPERACYJNE: STRUKTURY I FUNKCJE (opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX)
(opracowano na podstawie skryptu PP: Królikowski Z., Sajkowski M. 1992: Użytkowanie systemu operacyjnego UNIX) W informatyce występują ściśle obok siebie dwa pojęcia: sprzęt (ang. hardware) i oprogramowanie
Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.
Procesy Proces (zwany też zadaniem) jest jednostką aktywną, kontrolowaną przez system operacyjny i związaną z wykonywanym programem. Proces ma przydzielone zasoby typu pamięć (segment kodu, segment danych,
Programowanie w języku C++
Programowanie w języku C++ Część siódma Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi
Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory
Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory Poniżej pozwoliłem sobie za cytować za wikipedią definicję zmiennej w informatyce.
Architektura komputerów. Układy wejścia-wyjścia komputera
Architektura komputerów Układy wejścia-wyjścia komputera Wspópraca komputera z urządzeniami zewnętrznymi Integracja urządzeń w systemach: sprzętowa - interfejs programowa - protokół sterujący Interfejs
Język FBD w systemie Concept
Adresowanie obiektów Bit - stan pojedynczego sygnału - wejście lub wyjście dyskretne, bit pamięci Bajt - 8 bitów - wartość od -128 do +127 Słowo - 16 bitów - wartość od -32768 do 32767 -wejście lub wyjście
Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1 Tablice wielowymiarowe C umożliwia definiowanie tablic wielowymiarowych najczęściej stosowane
Pliki. Funkcje tworzące pliki i operujące na nich opisane są w części 2 pomocy systemowej. Tworzenie i otwieranie plików:
Pliki W celu wykonania jakiejkolwiek operacji na istniejącym pliku, plik ten musi zostać otwarty, natomiast jeśli plik jeszcze nie istnieje, to musi zostać utworzony. Plik może zostać otwarty w trybie:
Laboratorium 2: Dynamiczny przydział pamięci w przestrzeni jądra Linuksa (jedne zajęcia) dr inż. Arkadiusz Chrobot
Laboratorium 2: Dynamiczny przydział pamięci w przestrzeni jądra Linuksa (jedne zajęcia) dr inż. Arkadiusz Chrobot 9 marca 2017 Spis treści Wprowadzenie 1 1. Alokatory pamięci 1 2. Alokator strefowy 2
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
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
/* 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
Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści
Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści 1. Konfiguracja pinów2 2. ISP..2 3. I/O Ports..3 4. External Interrupts..4 5. Analog Comparator5 6. Analog-to-Digital Converter.6 7.
Systemy operacyjne i sieci komputerowe. 1 SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE. Etapy uruchamiania systemu
Systemy operacyjne i sieci komputerowe. 1 SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE Etapy uruchamiania systemu 010 2 Systemy operacyjne i sieci komputerowe. Część 010. I. Etapy uruchamiania systemu Windows
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/).
Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)
Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi) Ćwiczenie drugie (jedne zajęcia) Temat: Procesy i sygnały w Linuksie. Opracowanie: mgr in ż. Arkadiusz Chrobot Wprowadzenie 1. Budowa procesu
Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij.
Programowanie Sobera Jolanta 16.09.2006 Strona 1 z 26 1 Wprowadzenie do programowania 4 2 Pierwsza aplikacja 5 3 Typy danych 6 4 Operatory 9 Strona 2 z 26 5 Instrukcje sterujące 12 6 Podprogramy 15 7 Tablice
Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie
Część X C++ Typ znakowy służy do reprezentacji pojedynczych znaków ASCII, czyli liter, cyfr, znaków przestankowych i innych specjalnych znaków widocznych na naszej klawiaturze (oraz wielu innych, których
Linux Kernel II. Hello kernel - jak napisać pierwszy moduł
Linux Kernel II Hello kernel - jak napisać pierwszy moduł Przypomnienie (I) Moduły uruchamiane są i działają w przestrzeni Kernela (Kernel space), Moduły piszemy w języku C, Moduły działają inaczej niż
1.1 Definicja procesu
1 Procesy pojęcia podstawowe 1 1.1 Definicja procesu Proces jest czymś innym niż program. Program jest zapisem algorytmu wraz ze strukturami danych na których algorytm ten operuje. Algorytm zapisany bywa
Przerwania, polling, timery - wykład 9
SWB - Przerwania, polling, timery - wykład 9 asz 1 Przerwania, polling, timery - wykład 9 Adam Szmigielski aszmigie@pjwstk.edu.pl SWB - Przerwania, polling, timery - wykład 9 asz 2 Metody obsługi zdarzeń
Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych
Laboratorium OiOSE. Programowanie w środowisku MS Visual C++ 1 Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych Organizacja i Oprogramowanie Systemów Elektronicznych Michał Kowalewski
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
Inżynieria Wytwarzania Systemów Wbudowanych
GUT Intel 2015/16 1/30 Inżynieria Wytwarzania Systemów Wbudowanych Wykład 3 Iwona Kochańska Katedra Systemów Elektroniki Morskiej WETI PG October 18, 2018 Dobre praktyki GUT Intel 2015/16 2/30 Przenośność
Inż. Kamil Kujawski Inż. Krzysztof Krefta. Wykład w ramach zajęć Akademia ETI
Inż. Kamil Kujawski Inż. Krzysztof Krefta Wykład w ramach zajęć Akademia ETI Metody programowania Assembler Język C BASCOM Assembler kod maszynowy Zalety: Najbardziej efektywny Intencje programisty są
Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C
Grzegorz Cygan Wstęp do programowania mikrosterowników w języku C Mikrosterownik Inne nazwy: Microcontroler (z języka angielskiego) Ta nazwa jest powszechnie używana w Polsce. Mikrokomputer jednoukładowy
Argumenty wywołania programu, operacje na plikach
Temat zajęć: Argumenty wywołania programu, operacje na plikach Autor: mgr inż. Sławomir Samolej Zagadnienie 1. (Zmienne statyczne) W języku C można decydować o sposobie przechowywania zmiennych. Decydują
Podstawy programowania. Wykład: 12. Struktury, unie, pola bitowe. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD
Podstawy programowania Wykład: 12 Struktury, unie, pola bitowe 1 dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD Podstawy programowania Struktury 2 Struktury Struktury to złożone typy danych
Rozdział 4 KLASY, OBIEKTY, METODY
Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej
PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec
PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych
Laboratorium 6: Tasklety i kolejki prac (jedne zajęcia) dr inż. Arkadiusz Chrobot
Laboratorium 6: Tasklety i kolejki prac (jedne zajęcia) dr inż. Arkadiusz Chrobot 10 kwietnia 2017 Spis treści Wprowadzenie 1 1. Tasklety 1 1.1. Opis API............................................. 1
Programowanie strukturalne język C - wprowadzenie
Programowanie strukturalne język C - wprowadzenie Dr inż. Sławomir Samolej D102 C, tel: 865 1766, email: ssamolej@prz-rzeszow.pl WWW: ssamolej.prz-rzeszow.pl Cechy programowania strukturalnego Możliwość
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
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
Pomoc dla użytkowników systemu asix 6 i 7. Drajwer Bufor. Dok. Nr PLP6021 Wersja:
Pomoc dla użytkowników systemu asix 6 i 7 www.asix.com.pl Drajwer Bufor Dok. Nr PLP6021 Wersja: 2012-03-16 ASKOM i asix to zastrzeżone znaki firmy ASKOM Sp. z o. o., Gliwice. Inne występujące w tekście
Wskaźniki. Informatyka
Materiały Wskaźniki Informatyka Wskaźnik z punktu widzenia programisty jest grupą komórek pamięci (rozmiar wskaźnika zależy od architektury procesora, najczęściej są to dwa lub cztery bajty ), które mogą
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
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
Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w
Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w obrębie skryptu. Wyrażenia include() i require() są niemal
Zmienne i struktury dynamiczne
Zmienne i struktury dynamiczne Zmienne dynamiczne są to zmienne, które tworzymy w trakcie działania programu za pomocą operatora new. Usuwa się je operatorem delete. Czas ich występowania w programie jest
Logiczny model komputera i działanie procesora. Część 1.
Logiczny model komputera i działanie procesora. Część 1. Klasyczny komputer o architekturze podanej przez von Neumana składa się z trzech podstawowych bloków: procesora pamięci operacyjnej urządzeń wejścia/wyjścia.
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
PC 3 PC^ TIMER IN RESET PC5 TIMER OUT. c 3. L 5 c.* Cl* 10/H CE RO WR ALE ADO AD1 AD2 AD3 AD4 A05 A06 LTJ CO H 17 AD7 U C-"
PC 3 PC^ TIMER IN RESET PC5 TIMER OUT 10/H CE RO WR ALE ADO AD1 AD2 AD3 AD4 A05 A06 AD7 U ss c 3 L 5 c.* Cl* S 9 10 11 12 13 U 15 H 17 Cu C-" ln LTJ CO 2.12. Wielofunkcyjne układy współpracujące z mikroprocesorem
Język ludzki kod maszynowy
Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza
Działanie systemu operacyjnego
Działanie systemu operacyjnego Budowa systemu komputerowego Jednostka centralna Sterownik dysku Sterownik drukarki Sterownik sieci Szyna systemowa (magistrala danych) Sterownik pamięci operacyjnej Pamięć
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
Poradnik programowania procesorów AVR na przykładzie ATMEGA8
Poradnik programowania procesorów AVR na przykładzie ATMEGA8 Wersja 1.0 Tomasz Pachołek 2017-13-03 Opracowanie zawiera opis podstawowych procedur, funkcji, operatorów w języku C dla mikrokontrolerów AVR
W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :
Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy : class nazwa_klasy prywatne dane i funkcje public: publiczne dane i funkcje lista_obiektów;
Temat 7. Programowanie mikrokontrolerów z rodziny PIC16 w języku C przy użyciu HI-TECH C for PIC10/12/16
Temat 7. Programowanie mikrokontrolerów z rodziny PIC16 w języku C przy użyciu HI-TECH C for PIC10/12/16 Spis treści do tematu 7 7.1. Używanie kompilatora 7.2. Rozszerzenia języka ANSI C 7.3. Optymalizacja
Funkcja (podprogram) void
Funkcje Co to jest funkcja? Budowa funkcji Deklaracja, definicja i wywołanie funkcji Przykłady funkcji definiowanych przez programistę Przekazywanie argumentów do funkcji Tablica jako argument funkcji
PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO
PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO LABORATORIUM Temat: QNX Neutrino Interrupts Mariusz Rudnicki 2016 Wstęp W QNX Neutrino wszystkie przerwania sprzętowe przechwytywane są przez jądro systemu. Obsługę
INSTRUKCJA UŻYTKOWNIKA MPCC
V1.0.0 (10.14.2015) 1 (7) INSTALACJA UWAGA: Produkt działa jako urządzenie nadrzędne Modbus. Dlatego w przypadku podłączania narzędzia do istniejącej sieci Modbus konieczne może okazać się odłączenie innego
PRZYDZIAŁ PAMIĘCI OPERACYJNEJ
PRZYDZIAŁ PAMIĘCI OPERACYJNEJ dr inż. Krzysztof Patan Instytut Sterowania i Systemów Informatycznych Uniwersytet Zielonogórski k.patan@issi.uz.zgora.pl Wstęp Pamięć komputera wielka tablica słów (bajtów)
Wprowadzenie do podstaw programowania AVR (na przykładzie mikrokontrolera ATmega 16 / 32)
Wprowadzenie do podstaw programowania AVR (na przykładzie mikrokontrolera ATmega 16 / 32) wersja 0.4 (20 kwietnia 2015) Filip A. Sala W niniejszym, bardzo krótkim opracowaniu, postaram się przedstawić
Magistrala. Magistrala (ang. Bus) służy do przekazywania danych, adresów czy instrukcji sterujących w różne miejsca systemu komputerowego.
Plan wykładu Pojęcie magistrali i jej struktura Architektura pamięciowo-centryczna Architektura szynowa Architektury wieloszynowe Współczesne architektury z połączeniami punkt-punkt Magistrala Magistrala
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
76.Struktura oprogramowania rozproszonego.
76.Struktura oprogramowania rozproszonego. NajwaŜniejsze aspekty obiektowego programowania rozproszonego to: Współdziałanie (interoperability) modułów programowych na róŝnych maszynach. Wielokrotne wykorzystanie
Wykład 8: klasy cz. 4
Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD
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
DYNAMICZNE PRZYDZIELANIE PAMIECI
DYNAMICZNE PRZYDZIELANIE PAMIECI Pamięć komputera, dostępna dla programu, dzieli się na cztery obszary: kod programu, dane statyczne ( np. stałe i zmienne globalne programu), dane automatyczne zmienne
Podstawy programowania komputerów
Podstawy programowania komputerów Wykład 10: Sterowanie pamięcią w C Pamięć na stosie!każdy program napisany w języku C ma dostęp do dwóch obszarów pamięci - stosu i sterty, w których może być przechowywana
Wykład 1
Wstęp do programowania 1 Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 1 Wprowadzenie Cel wykładów z programowania proceduralnego Wykład jest poświęcony językowi C i jego