Naukowiec i inżynier Przewodnik po cyfrowym przetwarzaniu sygnału Autor: Steven W. Smith, Ph. D. Rozdział 24: Liniowy przetwarzanie obrazu przez separację Jest to technika szybkiego splotu, o ile PSF można rozdzielić. Mówi się, że PSF można rozdzielić, jeśli można go podzielić na dwa jednowymiarowe sygnały: rzut pionowy i poziomy. Rysunek 24-5 pokazuje przykład oddzielnego obrazu, kwadratowy PSF. W szczególności wartość każdego piksela na obrazie jest równa odpowiadającemu punktowi w rzucie poziomym pomnożonemu przez odpowiedni punkt w rzucie pionowym. W postaci matematycznej: gdzie x r, c jest obrazem dwuwymiarowym, a vert r amp horz c są jednowymiarowymi projekcjami. Oczywiście większość obrazów nie spełnia tego wymogu. Na przykład pillbox nie jest możliwy do oddzielenia. Istnieje jednak nieskończona liczba rozdzielnych obrazów. Można to rozumieć przez generowanie arbitralnych rzutów poziomych i pionowych oraz znajdowanie odpowiadającego im obrazu. Na przykład, rys. 24-6 ilustruje to za pomocą profili, które są dwustronnymi wykładnikami. Obraz odpowiadający tym profilom znajduje się w równaniu Eq. 24-1. Po wyświetleniu obraz pojawia się jako kształt rombu, który wykładniczo maleje do zera wraz ze wzrostem odległości od początku. W większości zadań związanych z przetwarzaniem obrazu, idealny PSF jest kołowo symetryczny. takich jak pillbox. Chociaż zdigitalizowane obrazy są zwykle przechowywane i przetwarzane w prostokątnym formacie wierszy i kolumn, pożądane jest zmodyfikowanie obrazu tak samo we wszystkich kierunkach. Rodzi to pytanie: czy istnieje PSF, który jest kołowo symetryczny i możliwy do oddzielenia Odpowiedź brzmi: tak, ale jest tylko jedna, Gaussa. Jak pokazano na Fig. 24-7, dwuwymiarowy obraz Gaussa ma projekcje, które są również Gaussianami. Obraz i projekcja Gaussian mają takie samo odchylenie standardowe. Aby zawęzić obraz za pomocą oddzielnego jądra filtra, należy zawęzić każdy wiersz obrazu za pomocą projekcji poziomej. w wyniku czego powstaje obraz pośredni. Następnie zawiń każdą kolumnę tego obrazu pośredniego z rzutem pionowym PSF. Wynikowy obraz jest identyczny z bezpośrednim splotem oryginalnego obrazu i jądra filtra. Jeśli chcesz, zwiąż kolumny najpierw, a następnie wiersze wynik jest taki sam. Splot obrazu N razy N z jądrem filtra M razy M wymaga czasu proporcjonalnego do N 2 M 2. Innymi słowy, każdy piksel na wyjściowym obrazie zależy od wszystkich pikseli w jądrze filtra. Dla porównania, splatanie przez separację wymaga tylko czasu proporcjonalnego do N2M. W przypadku jądra filtra o szerokości setek pikseli technika ta skróci czas wykonania o setkę razy. Sprawy mogą być jeszcze lepsze. Jeśli chcesz użyć prostokątnego PSF (rys. 24-5) lub dwustronnego wykładniczego PSF (rys. 24-6), obliczenia są jeszcze bardziej efektywne. Dzieje się tak dlatego, że jednowymiarowe zwoje to filtr średniej ruchomej (rozdział 15) i dwukierunkowy filtr jednobiegunowy (rozdział 19), odpowiednio. Oba te jednowymiarowe filtry można szybko przeprowadzić przez rekursję. Powoduje to, że czas splotu obrazu jest proporcjonalny tylko do N2, całkowicie niezależny od rozmiaru PSF. Innymi słowy, obraz może być zawarty z tak dużym PSF, ile potrzeba, z tylko kilkoma operacjami liczbowymi na piksel. Na przykład splot obrazu 512 na 512 pikseli wymaga tylko kilkuset milisekund na komputerze osobistym. To szybko Nie podoba się kształt tych dwóch rdzeni filtrów. Przekonwertuj obraz z jednym z nich kilka razy, aby zbliżyć się do Gaussowskiego PSF (gwarantowanego przez Centralne Twierdzenie o Granicach, Rozdział 7). Są to świetne algorytmy, zdolne do wyłapywania sukcesów ze szczęk awarii. Warto je zapamiętać. ROZWIĄZYWANIE PROMOCJI Część 1: Decyzje projektowe w jądrze Fortha autorstwa Brada Rodrigueza Artykuł ten pojawił się po raz pierwszy w The Computer Journal 59 (styczeń, luty 1993). WPROWADZENIE Wszyscy w społeczności Forth mówią o tym, jak łatwo jest przenieść Fortha do nowego procesora. Jednak, podobnie jak wiele cytowanych i nieczytelnych zadań, niewiele napisano o tym, jak to zrobić. Kiedy więc Bill Kibler zasugerował ten temat do artykułu, postanowiłem zerwać z wielką tradycją ustną Forthwrights i dokumentować proces w czerni i bieli. W trakcie tych artykułów opracuję Forthsa dla 6809, 8051 i Z80. Robię 6809, aby zilustrować prosty i konwencjonalny model Forth plus, już opublikowałem 6809 asembler ROD91, ROD92 i Ill potrzebuję 6809 Forth dla przyszłych projektów TCJ. Robię projekt 8051 Forth dla projektu uniwersyteckiego, ale ilustruje on również nieco inne decyzje projektowe. Z80 Forth jest dla wszystkich czytelników CPM TCJ, a dla niektórych przyjaciół z TRS-80 zbiera pył. NIEZBĘDNE SPRZĘT Musisz wybrać procesor. Nie będę zagłębiał się w zalety jednego procesora nad drugim dla Fortha, ponieważ wybór procesora jest zwykle wymuszany przez inne względy. Poza tym celem tego artykułu jest pokazanie jak przenieść Fortha do dowolnego procesora. Możesz oczekiwać, że zwykłe 16-bitowe jądro Fortha (patrz niżej) zajmie około 8 kilobajtów przestrzeni programowej. Aby uzyskać pełne jądro, które może kompilować definicje Forth, należy zezwolić na co najmniej 1 kilobajt pamięci RAM. Aby użyć systemu zarządzania blokami Forths do przechowywania dysków, należy dodać 3 KB lub więcej dla buforów. W modelu 32-bitowym Forth podwoić te liczby. Są to minimum, aby uruchomić i uruchomić jądro Forth. Aby uruchomić aplikację na swoim sprzęcie, należy odpowiednio zwiększyć rozmiary PROM i RAM. 16 LUB 32 BIT Rozmiar słowa używanego przez Forth niekoniecznie jest taki sam jak w CPU. Najmniejszy praktyczny Forth jest 16-bitowym modelem, tj. Takim, który wykorzystuje 16-bitowe liczby całkowite i 16-bitowe adresy. Społeczność Forth nazywa to kwotą quotcellquot, ponieważ quotwordquot odnosi się do definicji Fortha. 8-bitowe procesory prawie zawsze obsługują 16-bitowe Forthy. Zazwyczaj wymaga to jawnego kodowania arytmetyki dwubajtowej, chociaż niektóre 8-bitowe procesory mają kilka operacji 16-bitowych. 16-bitowe procesory zwykle uruchamiają 16-bitowe Forthy, chociaż te same techniki podwójnej precyzji można wykorzystać do napisania 32-bitowego Fortha na 16-bitowym CPU. Co najmniej jeden 32-bitowy Forth został napisany dla 80868088. 32-bitowe procesory zwykle działają w wersjach 32-bitowych. Mniejszy model Forth rzadko oszczędza długość kodu lub procesora. Znam jednak co najmniej jeden 16-bitowy Forth napisany dla 68000. To zmniejsza rozmiar kodu aplikacji o współczynnik dwa, ponieważ definicje Forth na wysokim poziomie stają się ciągiem 16-bitowych adresów, a nie ciągiem 32- adresy bitowe. (Wkrótce stanie się to oczywiste.) Jednak większość z 68000 ma dużo pamięci RAM. Wszystkie przykłady opisane w tym artykule są 16-bitowymi wersjami działającymi na 8-bitowych procesorach. TECHNIKA GWINTOWANIA quotThreaded codequot jest znakiem rozpoznawczym firmy Forth. Forth quotthreadquot to tylko lista adresów procedur do wykonania. Możesz myśleć o tym jako o liście wywołań podprogramów, z usuniętymi instrukcjami CALL. Z biegiem lat opracowano wiele wariacji gwintowania, a który z nich jest najlepszy, zależy od procesora i aplikacji. Aby podjąć decyzję, musisz zrozumieć, jak działają i ich kompromisy. Pośredni kod gwintowany (ITC) Jest to klasyczna technika Thorthadera, stosowana w rysowaniu Forth i F83, opisana w większości książek na Forth. Wszystkie inne schematy gwintowania są często poprawione, więc musisz zrozumieć ITC, aby docenić pozostałe. Przyjrzyjmy się definicji słowa KWADRAT: w typowym ITC Forth pojawi się w pamięci, jak pokazano na rysunku 1. (Nagłówek zostanie omówiony w przyszłym artykule zawiera informacje o sprzątaniu używane do kompilacji i nie jest zaangażowany w wątki .) Załóżmy, że SQUARE napotykamy podczas wykonywania jakiegoś innego słowa Forth. Dalej wskaźnik interpretera (IP) wskaże komórkę w pamięci - zawartą w tym cytatowym słowie - która zawiera adres słowa SQUARE. (Mówiąc dokładniej, ta komórka zawiera adres Pola Kodu Kwasu.) Tłumacz pobiera ten adres, a następnie używa go do pobrania zawartości Pola Kodu Kwadrowego. Te treści to jeszcze jeden adres - adres podprogramu języka maszynowego, który wykonuje słowo SQUARE. W kodzie pseudokodowym jest to: To ilustruje ważną, ale rzadko wyodrębnioną zasadę: adres wprowadzonego wcześniej słowa jest zachowany w W. Słowa Kodu nie potrzebują tej informacji, ale wszystkie inne rodzaje słów Dalej. Jeśli SQUARE zostałoby napisane w kodzie maszynowym, byłby to koniec historii: ten fragment kodu maszynowego zostałby wykonany, a następnie wskoczony z powrotem do interpretera Fortha - który, od kiedy IP był inkrementowany, wskazuje na następne słowo do zostać straconym. To dlatego interpreter Fortha jest zwykle nazywany NEXT. Ale SQUARE jest wysokopoziomową definicją quotcolonquot - zawiera cudzysłów, listę adresów. Aby wykonać tę definicję, interpreter Forth musi zostać ponownie uruchomiony w nowym miejscu: polu parametrów SQUARE. Oczywiście, stara lokalizacja tłumacza musi zostać zapisana, aby wznowić cytat Następujące słowo po zakończeniu SQUARE. Jest to podobne do wywołania podprogramu Działanie języka SQUARE polega po prostu na przesuwaniu starego adresu IP, ustawieniu adresu IP na nową lokalizację, uruchomieniu interpretera, a po zakończeniu SQUARE wywołaj adres IP. (Jak widać, IP jest kontrapunktem programowym wyższego poziomu Forth.) To się nazywa DOCOLON lub ENTER w różnych Forthach: Ten identyczny fragment kodu jest używany przez wszystkie wysokopoziomowe (tj. Gwintowane) definicje Fortha. Dlaczego wskaźnik? do tego fragmentu kodu, a nie do samego fragmentu, zawarta jest definicja Fortha. Ponad setki definicji, oszczędności sumują się i dlatego nazywa się Pośredni wątek. Kontynuacja z podprogramu to słowo EXIT, które kompiluje się, gdy widzi Forth. (Niektórzy Forthowie nazywają to S zamiast EXIT.) EXIT po prostu wykonuje procedurę języka maszyny, która wykonuje następujące czynności: Przejdź przez kilka zagnieżdżonych definicji Forth, aby upewnić się, że to działa. Zwróć uwagę na cechy ITC: każde słowo Fortha ma jedno-komórkowe pole kodu. Definicje dwukropka kompilują jedną komórkę dla każdego słowa użytego w definicji. A interpreter Fortha musi faktycznie wykonać podwójny dwukierunkowy kod, aby uzyskać adres następnego kodu maszyny do uruchomienia (najpierw przez IP, potem przez W). ITC nie jest ani najmniejszą, ani najszybszą techniką gwintowania. Może być najprostszy, chociaż kod DTC (opisany dalej) nie jest tak naprawdę bardziej złożony. Dlaczego więc tak wielu Forthów jest pośrednio gwintowanych Głównie dlatego, że poprzednie Forths, używane jako modele, były gwintowane pośrednio. Obecnie DTC zyskuje na popularności. Kiedy więc należy stosować ITC? Z różnych technik ITC produkuje najczystsze i najbardziej eleganckie definicje - nic poza adresami. Jeśli dostroisz się do takich rozważań, ITC może ci się spodobać. Jeśli Twój kod koliduje z wnętrzami definicji, prostota i jednorodność reprezentacji ITC może poprawić przenośność. ITC jest klasycznym modelem Fortha, więc może być preferowany dla edukacji. Wreszcie, na procesorach bez podprogramu instrukcji podprogramu - takiego jak 1802 - ITC jest często bardziej wydajny niż DTC. Kod bezpośredniego kodu gwintowanego (DTC) różni się od ITC tylko pod jednym względem: zamiast pola kodu zawierającego adres jakiegoś kodu maszynowego pole kodu zawiera rzeczywisty kod maszynowy. Nie twierdzę, że pełny kod dla ENTER jest zawarty w każdej definicji dwukropka. W quothigh-levelquot Napisane słowa, pole Code będzie zawierało wywołanie podprogramu. jak pokazano na rysunku 2. Na przykład definicje jelita grubego będą zawierać wywołanie procedury ENTER. Pseudo-kod NEXT do bezpośredniego wątkowania jest po prostu: Ta szybkość zyskuje: interpreter wykonuje teraz tylko jeden kierunek. W przypadku Z80 redukuje to procedurę NEXT - najczęściej wykorzystywany fragment kodu w jądrze Forth - od jedenastu instrukcji do siedmiu Ta przestrzeń kosztuje: każda definicja wysokiego poziomu w Z80 Forth (na przykład) jest teraz o jeden bajt dłuższa, ponieważ 2-bajtowy adres został zastąpiony przez 3-bajtowe wywołanie. Ale to nie jest uniwersalna prawda. 32-bitowy 68000 Forth może zastąpić 4-bajtowy adres 4-bajtową instrukcją BSR, bez straty netto. I na Zilog Super8, który ma instrukcje maszynowe dla DTC Forth, 2-bajtowy adres jest zastąpiony 1-bajtową instrukcją ENTER, dzięki czemu DTC Forth mniejszy na Super8 Oczywiście, definicje kodu DTC są dwa bajty krótsze, ponieważ w ogóle nie potrzebowałem już wskaźnika, uważałem, że definicje wysokiego poziomu w DTC Forths wymagają użycia wywołania podprogramu w polu kodu. Frank Sergeants Pygmy Forth SER90 pokazuje, że prosty skok może być równie łatwo użyty i zwykle będzie szybszy. Guy Kelly opracował znakomitą recenzję implementacji Fortha dla IBM PC KEL92, którą gorąco polecam wszystkim twórcom jądra Forth. Spośród 19 tytułów, które przebadał, 10 wykorzystało DTC, 7 zastosowało ITC i 2 zastosowane wątki podprogramów (omówione dalej). Polecam użycie Direct-Threaded Code over Indirect-Threaded Code dla wszystkich nowych jąder Fortha. Przeskocz do NEXT lub zakoduj go w linii Wewnętrzny interpreter Forth, NEXT, jest typową procedurą dla wszystkich definicji CODE. Możesz zachować tylko jedną kopię tej zwykłej procedury i mieć do niej wszystkie słowa CODE. (Zauważ, że Skok do NEXT wywołanie podprogramu nie jest konieczne.) Jednak prędkość NEXT ma kluczowe znaczenie dla szybkości całego systemu Forth. Ponadto w wielu procesorach procedura NEXT jest dość krótka, często tylko dwie lub trzy instrukcje. Dlatego lepiej może kodować NEXT w linii, niezależnie od tego, gdzie jest używany. Jest to często robione przez uczynienie z NEXT makra asemblera. Jest to prosta decyzja o prędkości i przestrzeni: in-line NEXT jest zawsze szybszy, ale prawie zawsze większy. Całkowity wzrost rozmiaru to liczba dodatkowych bajtów wymaganych do rozwinięcia w linii, pomnożona przez liczbę słów CODE w systemie. Czasami w ogóle nie ma kompromisu: w 6809 DTC Dalej, in-line NEXT jest krótszy niż kod wątku podprogramu Jump (STC) Definicja Forth wysokiego poziomu jest niczym innym jak listą podprogramów do wykonania. Nie potrzebujesz tłumaczy, aby osiągnąć ten efekt, możesz uzyskać ten sam efekt, po prostu łącząc listę wywołań podprogramów: Patrz rysunek 3. Ta reprezentacja słów Forth została użyta jako punkt wyjścia do wyjaśnienia technik Thorthading dla programistów asemblerowych KOG82. STC to elegancka definicja dwukropka, a słowa KODU są teraz identyczne. quotDefiniowane słowa (VARIABLE, CONSTANT i tym podobne) są traktowane tak samo, jak w DTC - pole kodu zaczyna się skokiem lub wywołaniem jakiegoś kodu maszynowego w innym miejscu. Główną wadą jest to, że wywołania podprogramów są zwykle większe niż proste adresy. Na przykład w Z80 wielkość definicji okrężnicy wzrasta o 50 - a większość aplikacji to definicje okrężnic. W przeciwieństwie do 32-bitowych 68000 może nie być wzrostu rozmiaru w ogóle, gdy adresy 4-bajtowe zostaną zastąpione przez 4-bajtowe BSR. (Ale jeśli rozmiar twojego kodu przekracza 64 KB, niektóre z tych adresów muszą zostać zastąpione 6-bitowymi JSR). Nawiązywanie wątków może być szybsze niż bezpośrednie nawiązywanie wątków. Oszczędzisz czas, nie mając tłumacza, ale tracisz czas, ponieważ każde odniesienie do słowa "na cześć" wiąże się z popchnięciem i popiem adresu zwrotnego. W DTC Forth tylko słowa o wysokim poziomie powodują aktywność na stosie powrotnym. W 6809 lub Zilog Super8 kod DTC jest szybszy niż STC. STC ma jeszcze jedną zaletę: rezygnuje z rejestru IP. Niektóre procesory - takie jak 8051 - są rozpaczliwie krótkie w rejestrowaniu adresów. Wyeliminowanie adresu IP może naprawdę uprościć i przyspieszyć jądro Jedynym sposobem na uzyskanie pewności jest napisanie przykładowego kodu. Jest to ściśle związane z wyborem rejestru, omówionym w następnej sekcji. STC z bezpośrednią kompilacją optymalizacji bezpośredniej kompilacji Na starszych i 8-bitowych procesorach prawie każdy prymityw Forth zawiera kilka instrukcji maszynowych. Ale na bardziej wydajnych procesorach wiele prymitywów Forth jest zapisanych w pojedynczej instrukcji. Na przykład, w 32-bitowym 68000, DROP jest po prostu W wątku-wątku Forth, użycie DROP w definicji dwukropka spowodowałoby, że sekwencja ADDQ jest instrukcją dwubajtową. Po co pisać czterobajtowe wywołanie podprogramu do dwubajtowej instrukcji Bez względu na to ile razy używa się DROP, nie ma oszczędności Kod jest mniejszy i szybszy, jeśli ADDQ jest kodowany bezpośrednio do strumienia BSR. Niektóre kompilatory Forth wykonują tę rozszerzającą linię ciągów słów CODE CUR93a. Wadą rozszerzenia w linii jest to, że dekompilacja z powrotem do oryginalnego kodu źródłowego staje się bardzo trudna. Dopóki używane są wywołania podprogramów, nadal istnieją wskaźniki (adresy podprogramów) do dalszych słów zawierających wątek. Dzięki wskazówkom do słów można uzyskać ich nazwy. Ale gdy słowo zostanie rozszerzone na kod in-line, utracona zostanie cała wiedza o tym skąd ten kod pochodzi. Zaletą rozbudowy w linii - poza szybkością i wielkością - jest możliwość optymalizacji kodu. Na przykład sekwencja Fortha została skompilowana w 68000 STC, ale mogłaby być rozszerzona w linii jako pojedyncza instrukcja maszyny Optymalizowanie kompilatorów Forth jest zbyt szerokim tematem dla tego artykułu. Jest to aktywny obszar badań nad językiem Forth, na przykład SCO89 i CUR93b. Ostateczną kulminacją zoptymalizowanego STC jest Forth, który kompiluje się do przytaczania poprawnego kodu maszynowego, tak jak kompilator C lub Fortran. Kod TTC (Token Threaded Code) DTC i STC mają na celu poprawę szybkości programów Forth, za niewielką opłatą w pamięci. Teraz przejdźmy w kierunku przeciwnym z ITC, w kierunku czegoś wolniejszego, ale mniejszego. Celem wątku Dalej jest określenie listy słów (podprogramów) do wykonania. Załóżmy, że 16-bitowy system Forth ma maksymalnie 256 różnych słów. Wtedy każde słowo może być jednoznacznie identyfikowane przez 8-bitową liczbę. Zamiast listy 16-bitowych adresów, będziesz miał listę 8-bitowych identyfikatorów lub quottokensów, quot, a rozmiar definicji dwukropka będzie o połowę. Token-token Forth zachowuje tabelę adresów wszystkich słów Forth, jako pokazano na rysunku 4. Wartość tokena jest następnie używana do indeksowania do tej tabeli, aby znaleźć słowo Dalej odpowiadające danemu tokenowi. Powoduje to dodanie jednego poziomu indeksu do interpretera Fortha, więc jest wolniejsze od wątku z napisem "Forth". Główną zaletą wątków Fononów z tokenem jest niewielki rozmiar. TTC jest najczęściej spotykane w komputerach przenośnych i innych aplikacjach o ograniczonej wielkości. Również tabela punktów inwentaryzacji we wszystkich słowach Forth może uprościć łączenie oddzielnie skompilowanych modułów. Wadą TTC jest szybkość: TTC tworzy najwolniejszego Fortha. Ponadto kompilator TTC jest nieco bardziej złożony. Jeśli potrzebujesz więcej niż 256 słów, musisz mieć otwarty schemat kodowania, aby wymieszać tokeny 8-bitowe i większe. Mogę wyobrazić sobie 32-bitowy Forth używając 16-bitowych tokenów, ale jak wiele 32-bitowych systemów ma ograniczony rozmiar? Kod gwintu segmentu Ponieważ na świecie jest tak wiele pochodnych 8086, wątek segmentu zasługuje na krótką wzmiankę. Zamiast używać cudzysłowu o równej liczbie bajtów w segmencie 64K, używane są adresy akapitów. (W 8086 r. Jest to 16 bajtów.) Następnie interpreter może załadować te adresy do rejestrów segmentów, zamiast do zwykłych rejestrów adresów. Umożliwia to 16-bitowemu modelowi Forth efektywny dostęp do pełnego megabajta pamięci 8086. Główną wadą gwintowania segmentów jest 16-bajtowa wielkość przestrzeni pamięci. Każde słowo Forth musi być wyrównane do 16-bajtowej granicy. Jeśli słowa Forth mają losowe długości, średnio 8 bajtów zostanie zmarnowanych na słowo Naprzód. REJESTRACJA REJESTRACJI Obok techniki nawlekania, wykorzystanie rejestrów procesorów jest najważniejszą decyzją projektową. To chyba najtrudniejsze. Dostępność rejestrów procesora może decydować o tym, jakie techniki gwintowania mogą być użyte, a nawet o tym, czym będzie mapa pamięci. Klasyczne rejestry Forth Klasyczny model Forth ma pięć quotvirtual rejestrów. Są to abstrakcyjne encje, które są używane w prymitywnych operacjach Fortha. NEXT, ENTER i EXIT zostały zdefiniowane wcześniej w kategoriach tych abstrakcyjnych rejestrów. Każda z nich ma szerokość jednej komórki - to jest w 16-bitowych wersjach Forth, są to rejestry 16-bitowe. (Istnieją wyjątki od tej reguły, jak zobaczysz później.) Nie wszystkie mogą być rejestrami CPU. Jeśli twój procesor nie ma wystarczającej liczby rejestrów, niektóre z nich mogą być przechowywane w pamięci. Przedstawię je w kolejności ich ważności, tzn. Na dole tej listy znajdują się najlepsze kandydatury do zapisania w pamięci. W to rejestr roboczy. Jest używany do wielu rzeczy, w tym do odniesienia do pamięci, więc powinien to być rejestr adresowy, tj. Musisz mieć możliwość pobierania i przechowywania pamięci przy użyciu zawartości W jako adresu. Musisz również umieć wykonywać operacje arytmetyczne na W. (W DTC Forths musisz również przeskoczyć pośrednio używając W.) W jest używane przez tłumacza w każdym słowa Forth. W CPU mającym tylko jeden rejestr, używałbyś go do W i trzymał wszystko w pamięci (a system byłby niesamowicie wolny). IP to wskaźnik interpretera. Jest to używane przez każde słowo Forth (poprzez NEXT, ENTER lub EXIT). IP musi być rejestrem adresów. Musisz także mieć możliwość zwiększania IP. Podprogram gwintowany Forths nie potrzebuje tego rejestru. PSP to wskaźnik stosu parametrów (lub quotapata stosu) Wskaźnik, czasami nazywany po prostu SP. Wolę PSP, ponieważ SP jest często nazwą rejestru CPU i nie należy ich mylić. Większość słów CODE używa tego. PSP musi być wskaźnikiem stosu lub rejestrem adresów, który może być zwiększany i zmniejszany. Jest to również plus, jeśli możesz zrobić indeksowane adresowanie z PSP. RSP to wskaźnik stosu powrotów, czasami nazywany po prostu RP. Jest to używane przez definicje dwukropka w ITC i DTC Forths oraz wszystkie słowa w STC Forths. RSP musi być wskaźnikiem stosu lub rejestrem adresów, który może być zwiększany i zmniejszany. Jeśli to możliwe . umieść W, IP, PSP i RSP w rejestrach. Rejestry wirtualne, które nastąpią, mogą być przechowywane w pamięci, ale zazwyczaj przewaga prędkości polega na utrzymywaniu ich w rejestrach procesora. X jest roboczym rejestrem, nie uważanym za jeden z popularnych klas Forth, mimo że klasyczny ITC Forths potrzebuje go w drugim kierunku. W ITC musisz mieć możliwość przeskakiwania pośredniego za pomocą X. X może być również użyty przez kilka słów CODE do robienia arytmetyki i tak dalej. Jest to szczególnie ważne w przypadku procesorów, które nie mogą używać pamięci jako argumentu. Na przykład ADD na Z80 może być (w pseudokodzie) Czasami definiowany jest także inny rejestr roboczy, Y. UP jest wskaźnikiem użytkownika, przechowującym adres bazowy obszaru zadań zadań. Funkcja UP jest zwykle dodawana do offsetu i używana przez wysokopoziomowy kod Forth, dzięki czemu można go po prostu gdzieś przechowywać. Ale jeśli procesor może wykonać indeksowane adresowanie z rejestru UP, słowa Kodują mogą łatwiej i szybciej uzyskać dostęp do zmiennych użytkownika. Jeśli masz nadmiar rejestrów adresów, użyj jednego dla UP. Single-task Forths nie potrzebują UP. X - w razie potrzeby - ważniejsza jest rejestracja niż UP. UP jest najłatwiejszym z wirtualnych rejestrów Forth, aby przejść do pamięci. Używanie stosu sprzętowego Większość procesorów ma wskaźnik stosu jako część swojego sprzętu, używany przez przerywanie i wywoływanie podprogramów. W jaki sposób mapuje się do rejestrów Forth? Powinien to być PSP lub RSP. Krótka odpowiedź brzmi: to zależy. Mówi się, że PSP jest używany częściej niż RSP w ITC i DTC Forths. Jeśli twój procesor ma kilka rejestrów adresów, a PUSH i POP są szybsze niż jawne odniesienie, użyj stosu sprzętu jako stosu parametrów. Z drugiej strony, jeśli twój procesor jest bogaty w tryby adresowania - i pozwala na indeksowane adresowanie - jest plus w posiadaniu PSP jako rejestru adresów ogólnego przeznaczenia. W takim przypadku użyj stosu sprzętu jako stosu powrotnego. Czasami nie robisz ani stosu TMS320C25s jest tylko osiem komórek głębokie - wszystkie, ale bezużyteczne dla Forth. Tak więc jego stos sprzętowy jest używany tylko do przerwań, a zarówno PSP, jak i RSP są rejestrami adresów ogólnego przeznaczenia. (ANS Forth określa minimum 32 komórki stosu parametrów, a 24 komórki stosu powrotnego preferuję 64 komórki każdego z nich.) Od czasu do czasu napotkasz dogmat, że wartość stosu sprzętowego musi być stosem parametrów, lub musi być notowana stos powrotny. Zamiast tego zakoduj kilka przykładowych prymitywów Forth, takich jak i zobacz, które podejście jest mniejsze lub szybsze. (Nawiasem mówiąc, DUP i DROP nie są testem - zazwyczaj są trywialne.) Od czasu do czasu dochodzi się do dziwnych wniosków Gary Bergstrom zwrócił uwagę, że 6809 DTC Forth może być wykonane o kilka cykli szybciej, używając wskaźnika stosu użytkownika 6809 jako IP NEXT staje się POP. Używa rejestru indeksów dla jednego ze stosów Forthsa. Top-of-Stack w rejestrze Skuteczność można znacznie poprawić, utrzymując górny element stosu parametrów w rejestrze Wiele słów Forth (takich jak 0), a następnie nie trzeba używać stosu. Inne słowa nadal wykonują tę samą liczbę naciśnięć i popów, tylko w innym miejscu w kodzie. Tylko kilka słów (DROP i 2DROP) staje się bardziej skomplikowanych, ponieważ nie można już po prostu dostosować wskaźnika stosu - trzeba również zaktualizować rejestr TOS. Podczas pisania słów CODE istnieje kilka reguł: słowo usuwające elementy ze stosu musi zawierać w tym polu cytat z TOS. Słowo, które dodaje elementy do stosu, musi wcisnąć na stos stosowny tekst TOS (chyba, że jest on zużywany przez słowo). Jeśli masz co najmniej sześć rejestrów procesora wielkości komórki, zalecam zachowanie TOS w rejestrze. Uważam, że TOS jest ważniejsze niż UP, ale ma mniejsze znaczenie niż W, IP, PSP i RSP. (TOS w rejestrze wykonuje wiele funkcji rejestru X). Jest to przydatne, jeśli rejestr ten może wykonywać adresowanie pamięci. PDP-11, Z8s i 68000 są dobrymi kandydatami. Dziewięć z 19 komputerów IBM PC Forths studiowanych przez Guy'a Kelly'ego KEL92 utrzymuje rejestrację TOS. Myślę, że ta innowacja została odrzucona z powodu fałszywych przekonań, że a) dodaje instrukcje, i b) element najwyższego stosu musi być dostępny jako pamięć. Okazuje się, że nawet takie słowa jak PICK, ROLL i DEPTH są trywialnie modyfikowane dla TOS-in-register. A co z buforowaniem dwóch elementów stosu w rejestrach Gdy zachowujesz szczyt stosu w rejestrze, całkowita liczba wykonanych operacji pozostaje zasadniczo taka sama. Nacisk pozostaje push, niezależnie od tego, czy jest przed lub po operacji, którą wykonujesz. Z drugiej strony, buforowanie dwóch elementów stosu w rejestrach dodaje dużą liczbę instrukcji - naciśnięcie staje się naciśnięciem, a następnie ruchem. Tylko dedykowane procesory Forth, takie jak RTX2000 i fantastycznie inteligentne kompilatory optymalizujące, mogą skorzystać z buforowania dwóch elementów stosu w rejestrach. Kilka przykładów Oto przypisania rejestru dokonane przez Forths dla wielu różnych procesorów. Spróbuj wydedukować decyzje projektowe autorów z tej listy. quotSPquot odnosi się do wskaźnika stosu sprzętu. quotZpagequot odnosi się do wartości przechowywanych na stronie pamięci 6502s, które są prawie tak samo użyteczne jak - czasem bardziej użyteczne niż - wartości przechowywane w rejestrach, np. mogą być używane do adresowania pamięci. quotFixedquot oznacza, że Paynes 8051 Forth ma pojedynczy, nieruchomy obszar użytkownika, a UP jest stałym zakodowaniem. Wąskie rejestry Zwróć uwagę na coś nieparzystego na poprzedniej liście Model 6502 Forth - model 16-bitowy - używa 8-bitowych wskaźników stosu. Możliwe jest, aby PSP, RSP i UP były mniejsze niż rozmiar komórki Fortha. Jest tak dlatego, że stosy i obszar użytkownika są względnie małymi obszarami pamięci. Każdy stos może mieć długość 64 komórek, a obszar użytkownika rzadko przekracza 128 komórek. Musisz po prostu upewnić się, że: a) te obszary danych są ograniczone do małego obszaru pamięci, więc można użyć krótkiego adresu, lub b) wysokie bity adresu są dostarczane w inny sposób, np. wybierz stronę pamięci. W 6502, stos sprzętu jest ograniczony do pierwszej strony pamięci RAM (adresy 01xxh) przez projekt CPU. 8-bitowy wskaźnik stosu może być użyty dla stosu powrotnego. Stos parametrów jest przechowywany na stronie zerowej pamięci RAM, do której pośredni dostęp może mieć ośmiobitowy rejestr indeksowy X. (Pytanie dla zaawansowanego ucznia: dlaczego warto korzystać z X 6502, a nie Y Wskazówka: spójrz na dostępne tryby adresowania. ) W 8051 można użyć rejestrów 8-bitowych R0 i R1 w celu adresowania zewnętrznej pamięci RAM, pod warunkiem, że jawnie wypiszesz 8 bitów adresu do portu 2. Pozwala to na wybór partii cenowej dla dwóch stosów. UP różni się od PSP i RSP: po prostu dostarcza adresu bazowego, nigdy nie jest zwiększany ani zmniejszany. Praktyczne więc jest dostarczanie tylko wysokich bitów tego wirtualnego rejestru. Niskie bity muszą następnie zostać dostarczone za pomocą dowolnej techniki adresowania indeksowanego. Na przykład w kodzie 6809 można użyć rejestru DP do przechowywania 8 bitów UP, a następnie użyć bezpośredniego adresowania strony, aby uzyskać dostęp do dowolnej z 256 lokalizacji na tej stronie. Zmusza to wszystkie obszary użytkownika do rozpoczęcia pod adresem xx00h, co nie jest wielkim trudem i ogranicza obszar użytkownika do 128 komórek długości. W 8086 można użyć rejestru segmentów, aby określić adres bazowy obszaru użytkownika. REFERENCJE CUR93a Curley, Charles, cytuje Life na FastForth Lane, czekając na publikację w Forth Dimensions. Opis metody 68000 z podprogramem Forth. CUR93b Curley, Charles, quotOptymizacja w BSRJSR Threaded Forth, oczekiwanie na publikację w Forth Dimensions. Jednoprzepustowa optymalizacja kodu dla FastForth, tylko w pięciu ekranach kodu Obejmuje listing. KEL92 Kelly, Guy M. quotForth Systems Comparisons, quot Forth Dimensions XIII: 6 (MarApr 1992). Opublikowany również w Procederingach Konferencji FORML w 1991 roku. Oba dostępne od Forth Interest Group, P. O. Box 2154, Oakland, CA 94621. Przedstawia kompromisy projektowe wielu modeli 8086 Forths z fragmentami kodu i wzorcami - wysoce zalecane KOG82 Kogge, Peter M. quotAn Architectural Trail to Threaded-Code Systems, quot IEEE Computer, vol. 15 nr. 3 (Mar 1982). Pozostaje ostateczny opis różnych technik gwintowania. ROD91 Rodriguez, B. J., cyt. Y. Y.O. Asembler, część 1, The Computer Journal 52 (SepOct 1991). Ogólne zasady pisania dalej asemblerów. ROD92 Rodriguez, B. J., cyt. Y. Y.O. Asembler, część 2, The Computer Journal 54 (JanFeb 1992). Asembler 6809 w Forth. SCO89 Scott, Andrew, quotAn Extensible Optimizer for Compiling Forth, cyt. 1989 Proceed Konferencja Proceedings. Forth Interest Group, P. O. Box 2154, Oakland, CA 94621. Dobry opis optymalizatora 68000 bez kodu. CUR86 Curley, Charles, prawdziwy Forth za 68000. prywatnie dystrybuowane (1986). JAM80 James, John S. fig-Forth dla PDP-11. Forth Interest Group (1980). KUN81 Kuntze, Robert E. MVP-Forth dla Apple II. Mountain View Press (1981). LAX84 Laxen, H. and Perry, M. F83 na IBM PC. wersja 2.1.0 (1984). Dystrybuowane przez autorów, dostępne od Forth Interest Group lub GEnie. LOE81 Loeliger, R. G. Threaded Interpretive Languages. BYTE Publications (1981), ISBN 0-07-038360-X. Może być jedyną książką kiedykolwiek napisaną na temat tworzenia jądra podobnego do Fortha (użyty przykład to Z80). Warto, jeśli możesz znaleźć kopię. MPE92 MicroProcessor Engineering Ltd. MPE Z8Super8 PowerForth Target. MPE Ltd. 133 Hill Lane, Shirley, Southampton, S01 5AF, U. K. (June 1992). A commercial product. PAY90 Payne, William H. Embedded Controller FORTH for the 8051 Family . Academic Press (1990), ISBN 0-12-547570-5. This is a complete quotkitquot for a 8051 Forth, including a metacompiler for the IBM PC. Hardcopy only files can be downloaded from GEnie. Not for the novice SER90 Sergeant, Frank, Pygmy Forth for the IBM PC . version 1.3 (1990). Distributed by the author, available from the Forth Interest Group. Version 1.4 is now available on GEnie, and worth the extra effort to obtain. TAL80 Talbot, R. J. fig-Forth for the 6809 . Forth Interest Group (1980). Authors note for web publication: the files formerly available on the GEnie online service are now available from the Forth Interest Group FTP server, ftp:ftp. forth. orgpubForth. The Private Participation in Infrastructure (PPI) Project Database has data on over 6,400 infrastructure projects in 139 low - and middle-income countries. The database is the leading source of PPI trends in the developing world, covering projects in the energy, telecommunications, transport, and water and sewerage sectors. Some key changes were made to the methodology of the PPI database in 2018. See details here (PDF) New Sources of Financing for PPPs in 2018 Access the data on how PPPs in low and middle income countries were financed in 2018. Available under PPI Resources. - Total investments in private infrastructure in emerging markets in 2018 remained steady at US111.6 billion. - 2018 saw the largest single investment commitment ever recorded: Turkeys US35.6 billion IGA Airport. - Excluding Brazil, China, and India, global PPI in 2018 increased by 92 percent year over year. - Solar energy investment climbed 72 percent higher than the previous five-year average to reach US9.4 billion. - Renewable energy captured nearly two-thirds of energy investments with private participation. PPI in IDA Countries, 2009 to 2017: Private investment in infrastructure in IDA countries from 2009 to 2017 totaled US73 billion.
Autoregresyjna symulacja ruchoma (pierwsze zdanie) Demonstracja jest ustawiona tak, że używa się tej samej losowej serii punktów, bez względu na to, jak są stałe i są one zróżnicowane. Jednak po naciśnięciu przycisku quotrandomizequot zostanie wygenerowana i wykorzystana nowa seria losowa. Utrzymanie losowej serii identycznej pozwala użytkownikowi zobaczyć dokładnie efekty zmian serii w obu seriach ARMA. Stała jest ograniczona do (-1,1), ponieważ rozbieżność serii ARMA wynika z tego, kiedy. Demonstracja dotyczy tylko procesu pierwszego rzędu. Dodatkowe terminy AR umożliwiłyby generowanie bardziej złożonych serii, podczas gdy dodatkowe warunki MA zwiększyłyby wygładzanie. Szczegółowy opis procesów ARMA znajduje się na przykład G. Box, G. M. Jenkins i G. Reinsel, Analiza szeregów czasowych: Prognozowanie i sterowanie. 3 ed. Englewood Cliffs, NJ: Prentice-Hall, 1994. POWIĄZANE LINKI2.1 Modele średniej ruchomej (modele MA) Modele czasowe znane jako modele ARIMA mogą zawierać terminy autore...
Comments
Post a Comment