Kategorie

Kamami.pl - oficjalny dystrybutor Raspberry Pi

Nowe produkty


Między asemblerem a językiem C. Podstawy oprogramowania Zobacz większe

Między asemblerem a językiem C. Podstawy oprogramowania

ID: 32826

Dodaj do listy życzeń

Więcej informacji

Autor: Daniel W. Lewis

ISBN: 83-7243-412-3
Format: B5, 300 str.
Zawiera CD-ROM
Wydawnictwo: RM

Wydanie oryginalne:
Fundamentals of Embedded Software: Where C and Assembly Meet
Prentice Hall
O książce
Książka ta stanowi znakomitą alternatywę dla tradycyjnych tekstów uniwersyteckich na temat organizacji komputera i programowania w języku asemblera. Asembler występuje w niej tak, jak jest on najczęściej wykorzystywany w praktyce - jako narzędzie do implementowania niewielkich, szybkich i wyspecjalizowanych procedur wywoływanych z programu głównego napisanego w języku wysokiego poziomu, takiego jak C. Na bazie oprogramowania osadzonego książka wprowadza techniki programowania wielowątkowego, systemy z wywłaszczaniem i bez wywłaszczania , dzielone zasoby oraz szeregowanie, dostarczając w ten sposób solidne podstawy do dalszej nauki systemów operacyjnych, systemów czasu rzeczywistego i projektowania opartego na mikroprocesorach.

Książka powinna pomóc:
  • zrozumieć często pomijane konsekwencje i ograniczenia reprezentacji binarnej.
  • implementować szybkie operacje na liczbach rzeczywistych z użyciem arytmetyki stałoprzecinkowej zamiast zmiennoprzecinkowej.
  • lepiej zrozumieć zasięg, przekazywanie parametrów, rekurencję i alokację pamięci.
  • wykorzystywać funkcje C (takie jak operacje na bitach czy dostęp wariantowy) stosowane powszechnie w oprogramowaniu osadzonym.
  • pisać funkcje asemblerowe dla trybu chronionego procesora Intel x86, wywoływane z poziomu języka C.
  • szacować maksymalną prędkość danych i opóźnienie dla różnych stylów programowania wejścia/wyjścia
  • zarządzać wieloma wątkami, zasobami dzielonymi i sekcjami krytycznymi.
  • rozwijać techniki programowania unikające odwrócenia priorytetów, zakleszczeń i problemów z pamięcią dzieloną.
Do książki dołączony jest CD-ROM zawierający wszystkie narzędzia administracyjne potrzebne do budowy prostych samodzielnych aplikacji osadzonych dla zwykłego komputera PC klasy Pentium: kompilator C, asembler, konsolidator, program ładujący, biblioteka oraz jądra czasu rzeczywistego z wywłaszczaniem, jak i bez wywłaszczania. Ponadto dołączone są duże porcje kodu źródłowego do wielu przykładowych programów zamieszczonych w dodatkach do książki.


Spis treści

Przedmowa

Rozdział 1 Wstęp
1.1 Co to jest system wbudowany?
1.2 Czym wyróżnia się projektowanie oprogramowania wbudowanego?
1.3 Co oznacza "system czasu rzeczywistego"?
1.4 Co oznacza "wielozadaniowość"?
1.5 Jaka jest moc procesorów wbudowanych?
1.6 Jakie języki programowania są wykorzystywane?
1.7 Co to jest "jądro czasu rzeczywistego"?
1.8 Na czym polega wyjątkowość tworzenia aplikacji wbudowanej?
1.9 Jak duże są typowe programy wbudowane?
1.10 Oprogramowanie używane w tej książce
Zadania

Rozdział 2 Reprezentacja danych
2.1 Liczby dwójkowe o stałej precyzji
2.1.1 Pozycyjne systemy liczbowe
2.1.2 Konwersja zapisu binarnego na dziesiętny
2.1.3 Konwersja zapisu dziesiętnego na binarny
2.1.4 Zliczanie
2.1.5 Stała precyzja i przekraczanie zakresu
2.1.6 Reprezentacja heksadecymalna
2.2 Dwójkowa reprezentacja liczb całkowitych
2.2.1 Liczby całkowite ze znakiem
2.2.2 Dodatnia i ujemna reprezentacja tej samej wartości bezwzględnej
2.2.3 Interpretowanie wartości uzupełnienia dwójkowego liczby
2.2.4 Więcej o zakresie i nadmiarze
2.2.5 Uzupełnienie dwójkowe i złożoność sprzętowa
2.3 Binarna reprezentacja liczb rzeczywistych
2.3.1 Reprezentacja stałoprzecinkowa
2.3.2 Zapis stałoprzecinkowy z użyciem uniwersalnego formatu 16.16
2.3.3 Zapis stałoprzecinkowy z użyciem uniwersalnego formatu 32.32
2.3.4 Reprezentacja zmiennoprzecinkowa
2.4 Reprezentacja tekstu przy użyciu kodu ASCII
2.5 Liczby dziesiętne kodowane binarnie (BCD)
Zadania

Rozdział 3 Maksymalne wykorzystywanie C
3.1 Typy całkowite
3.2 Mieszane typy danych
3.3 Pomocne deklaracje typedef i define
3.4 Operowanie bitami w pamięci
3.4.1 Sprawdzanie bitów
3.4.2 Ustawianie, zerowanie i odwracanie bitów
3.4.3 Wyciąganie bitów
3.4.4 Wstawianie bitów
3.5 Operowanie bitami w portach we/wy
3.5.1 Porty we/wy tylko do zapisu
3.5.2 Podział portów ze względu na pisanie i czytanie
3.5.3 Podział portów ze względu na sekwencyjny dostęp
3.5.4 Podział portów ze względu na bity w zapisywanych danych
3.6 Dostęp do urządzeń we/wy mapowanych w pamięci
3.6.1 Dostęp do danych przy użyciu wskaźnika
3.6.2 Tablice, wskaźniki i operator "adres"
3.7 Struktury
3.7.1 Struktury upakowane
3.7.2 Pola bitowe
3.8 Dostęp wariantowy
3.8.1 Rzutowanie adresu obiektu
3.8.2 Korzystanie z unii
Zadania

Rozdział 4 Spojrzenie programisty na budowę komputera
4.1 Pamięć
4.2 Jednostka centralna (CPU)
4.2.1 Jednostka arytmetyczna i logiczna (ALU)
4.2.2 Pozostałe rejestry
4.2.3 Jednostka sterująca
4.3 Wejście/wyjście (we/wy)
4.4 Wprowadzenie do architektury Intela
4.4.1 Formaty instrukcji
4.4.2 Argumenty instrukcji
4.4.3 Ograniczenia dotyczące argumentów
4.4.4 Rejestry
4.4.5 Stos
4.5 Architektura trybu rzeczywistego procesorów Intela
4.5.1 Adresowanie segmentowe
4.5.2 Tryby adresowania
4.6 Architektura trybu chronionego procesorów Intela
4.6.1 Rejestry segmentowe i Globalna tablica deskryptorów
4.6.2 Płaski model pamięci
4.6.3 Tryby adresowania
4.7 Prefiksy przesłaniające argumenty i rozmiar adresu
4.8 Instrukcje procesorów Intela do przetwarzania danych
4.8.1 Instrukcje przenoszenia danych, instrukcje stosu i instrukcje we/wy
4.8.2 Instrukcje arytmetyczne
4.8.3 Instrukcje działające na bitach
4.8.4 Instrukcje przesunięcia bitów
Zadania

Rozdział 5 Łączenie języka C i asemblera
5.1 Programowanie w asemblerze
5.2 Konwencje korzystania z rejestrów
5.3 Typowe użycie opcji adresowania
5.3.1 Dostęp do danych, których adres jest stałą
5.3.2 Dostęp do danych, których adres jest zmienną
5.4 Instrukcje wyboru kolejności
5.4.1 Warunki złożone
5.4.2 Instrukcje if-then-else
5.4.3 Budowanie pętli
5.4.4 Szybsze pętle przy użyciu instrukcji łańcuchowych
5.5 Wywoływanie procedur i powracanie
5.6 Przekazywanie parametrów
5.7 Pobieranie parametrów
5.8 Wszystko jest przekazywane przez wartość
5.9 Zmienne tymczasowe
Zadania

Rozdział 6 Programowanie wejścia/wyjścia
6.1 Instrukcje we/wy procesorów Intela
6.2 Synchronizacja, prędkość przesyłania i opóźnienie
6.3 Pętle oczekujące z odpytywaniem
6.4 We/wy sterowane przerwaniami
6.4.1 Reakcja sprzętowa
6.4.2 Procedura obsługi przerwania
6.4.3 Programowalne kontrolery przerwań
6.4.4 Bufory i kolejki
6.4.5 Pisanie procedur obsługi przerwań w asemblerze
6.4.6 Pisanie procedur obsługi przerwań w C
6.4.7 Przerwania niemożliwe do zamaskowania
6.4.8 Przerwania programowe
6.4.9 Wyjątki
6.5 DMA - bezpośredni dostęp do pamięci
6.5.1 Podwójne buforowanie
6.6 Porównanie metod
Zadania

Rozdział 7 Oprogramowanie współbieżne
7.1 Systemy wielopoziomowe
7.1.1 Stan wątku i serializowanie
7.1.2 Zarządzanie opóźnieniem
7.1.3 Zapobieganie przepełnieniu przerwań
7.1.4 Przenoszenie działań na drugi plan
7.2 Programowanie wielowątkowe
7.2.1 Współbieżne wykonywanie niezależnych wątków
7.2.2 Przełączanie kontekstu
7.2.3 Wielozadaniowość bez wywłaszczania (kooperacyjna)
7.2.4 Wielozadaniowość z wywłaszczaniem
7.3 Zasoby dzielone i sekcje krytyczne
7.3.1 Wyłączanie przerwań
7.3.2 Wyłączanie przełączania zadań
7.3.3 Blokady wirujące
7.3.4 Muteksy
7.3.5 Semafory
Zadania

Rozdział 8 Szeregowanie zadań
8.1 Stany wątków
8.2 Wątki oczekujące
8.3 Przełączanie kontekstu
8.4 Szeregowanie zadań metodą cykliczną
8.5 Szeregowanie oparte na priorytetach
8.5.1 Inwersja priorytetów
8.5.2 Protokół PIP
8.5.3 Protokół PCP
8.6 Przypisywanie priorytetów
8.6.1 Szeregowanie sterowane terminami
8.6.2 Szeregowanie na podstawie RMA
8.7 Zakleszczenie
8.8 Kontrolne liczniki zegarowe
Zadania

Rozdział 9 Zarządzanie pamięcią
9.1 Obiekty w języku C
9.2 Zasięg
9.2.1 Udoskonalanie zasięgu lokalnego
9.2.2 Udoskonalanie zasięgu globalnego
9.3 Czas życia
9.4 Alokacja automatyczna
9.4.1 Klasa pamięci "Rejestr"
9.5 Alokacja statyczna
9.6 Trzy programy pomagające odróżnić alokację statyczną od automatycznej
9.6.1 Tworzenie obiektu
9.6.2 Inicjalizacja obiektu
9.6.3 Usuwanie obiektu
9.7 Alokacja dynamiczna
9.7.1 Fragmentacja
9.7.2 Pule alokacji pamięci
9.8 Alokacja automatyczna o zmiennym rozmiarze (alloca)
9.8.1 Tablice o zmiennym rozmiarze
9.9 Funkcje rekurencyjne a alokacja pamięci
Zadania

Rozdział 10 Pamięć dzielona
10.1 Rozpoznawanie obiektów dzielonych
10.1.1 Dzielone dane globalne
10.1.2 Dzielone dane prywatne
10.1.3 Funkcje dzielone
10.2 Funkcje wielobieżne
10.3 Dane "tylko do odczytu"
10.3.1 Kwalifikator typu "const"
10.4 Odradzane metody kodowania
10.4.1 Funkcje, które zachowują wewnętrzny stan lokalnych obiektów statycznych
10.4.2 Funkcje zwracające adres lokalnego obiektu statycznego
10.5 Dostęp do pamięci dzielonej
10.5.1 Konsekwencje wielkości słowa procesora
10.5.2 Dostęp typu "tylko odczyt" i "tylko zapis"
10.5.3 Kwalifikator typu "volatile"
Zadania

Rozdział 11 Inicjalizacja systemu
11.1 Organizacja pamięci
11.2 Procesor centralny
11.2.1 Ustawianie płaskiego modelu pamięci
11.2.2 Zmiana trybu na chroniony
11.3 Środowisko runtime języka C
11.3.1 Kopiowanie z pamięci ROM do RAM
11.3.2 Zerowanie danych statycznych niezainicjalizowanych
11.3.3 Konfigurowanie stogu
11.4 Zegar systemowy
11.4.1 Zegar 0: takt zegara
11.4.2 Zegar 1: odświeżanie pamięci
11.4.3 Zegar 2: częstotliwość głośnika
11.5 System przerwań
11.5.1 Inicjalizacja IDT
11.5.2 Inicjalizacja urządzeń PIC 8259
11.5.3 Instalowanie nowej procedury obsługi przerwania (ISR)

Dodatek A Zawartość CD-ROM-u

Dodatek B Kompilator C/C++ DJGPP
Instalacja
Kompilacja
Dokumentacja online

Dodatek C Asembler NASM
Instalacja
Uruchamianie NASM

Dodatek D Projekty programów
Pliki z dysku CD wymagane przez wszystkie aplikacje
Pliki z dysku CD wymagane przez aplikacje wielowątkowe bez wywłaszczania
Kompilacja i asemblacja aplikacji wbudowanej
Łączenie aplikacji wbudowanej
Uruchamianie aplikacji wbudowanej
Program 1: Poznawanie narzędzi kompilatora DJGPP
Program 2: Korzystanie ze stałoprzecinkowych liczb rzeczywistych
Program 3: Używanie makr i argumentów upakowanych
Program 4: korzystanie z plików "makefile"
Program 5: Kodowanie w asemblerze mnożenia o zwiększonej precyzji
Program 6: Kodowanie w asemblerze dzielenia o zwiększonej precyzji
Program 7: Pętla oczekująca z odpytywaniem oraz wejście/wyjście sterowane przerwaniami
Program 8: Prosta aplikacja wielowątkowa bez wywłaszczania
Program 9: Jądro z wywłaszczaniem i zasoby dzielone
Program 10: Unikanie nieograniczonej inwersji priorytetów
Program 11: Unikanie zakleszczenia

Dodatek E Biblioteka libepc
Organizacja pamięci i inicjalizacja
Funkcje ekranowe (display.c)
Funkcje okienkowe (window.c)
Funkcje klawiaturowe (keyboard.c)
Funkcje głośnikowe (speaker.c)
Funkcje zegarowe (timer.c, cycles.asm)
Funkcje dostępu do wektora przerwania (init-idt.c)
Funkcje dynamicznej alokacji pamięci (heap.c)
Funkcje stałoprzecinkowe (fixedpt.asm)
Skoki między funkcjami (setjmp.asm)
Inne funkcje (init-crt.c)

Dodatek F Program wstępnego ładowania

Indeks