Saturday, 2 September 2017

Moving Media Efficiente Attuazione


La Guida scienziato e ingegneri per Digital Signal Processing di Steven W. Smith, Ph. D. Capitolo 24: Lineare Convolution Image Processing da separabilità Questa è una tecnica di convoluzione veloce, fino a quando la PSF è separabile. Un PSF è detto essere separabili se può essere suddiviso in due segnali monodimensionali: verticale e proiezione orizzontale. La figura 24-5 illustra un esempio di un'immagine separabili, la PSF quadrato. In particolare, il valore di ciascun pixel dell'immagine è uguale al punto corrispondente nella proiezione orizzontale moltiplicato per il punto corrispondente nella proiezione verticale. In forma matematica: dove x r, c è l'immagine bidimensionale e vert r amp horz c sono le proiezioni unidimensionali. Ovviamente, la maggior parte delle immagini non soddisfano questo requisito. Ad esempio, il fortino, non è separabile. Vi sono, tuttavia, un numero infinito di immagini separabili. Questo può essere compreso generando proiezioni orizzontali e verticali arbitrarie, e trovare l'immagine corrispondente al loro. Ad esempio, Fig. 24-6 illustra questo con i profili che sono esponenziali fronte-retro. L'immagine che corrisponde a questi profili viene quindi situato Eq. 24-1. Quando viene visualizzato, l'immagine appare come una forma di diamante che decade esponenzialmente a zero la distanza dagli aumenti origine. Nella maggior parte dei compiti di elaborazione delle immagini, il PSF ideale è simmetrica circolarmente. come ad esempio il fortino. Anche se le immagini digitalizzate vengono generalmente memorizzati ed elaborati nel formato rettangolare di righe e colonne, si desidera modificare l'immagine stessa in tutte le direzioni. Questo solleva la domanda: c'è un PSF che è simmetrica circolarmente e separabile La risposta è sì, ma c'è solo una, la gaussiana. Come mostrato in fig. 24-7, un'immagine gaussiana bidimensionale ha sporgenze che sono anche gaussiane. I gaussiane di immagine e di proiezione hanno la stessa deviazione standard. Per convolvere un'immagine con un kernel di filtro separabili, convolvere ogni riga l'immagine con la proiezione orizzontale. producendo un'immagine intermedia. Successivamente, convolvere ogni colonna di questa immagine intermedia con la proiezione verticale del PSF. L'immagine risultante è identica alla convoluzione diretta dell'immagine originale e il kernel filtro. Se vi piace, convolvere le colonne e poi le righe il risultato è lo stesso. La convoluzione di volte un'immagine N N con un kernel volte filtro M M richiede un tempo proporzionale a N 2 M 2. In altre parole, ogni pixel nell'immagine di uscita dipende da tutti i pixel del kernel filtro. In confronto, convoluzione da separabilità richiede solo un tempo proporzionale a N 2 M. Per i kernel filtri che sono centinaia di pixel di larghezza, questa tecnica riduce il tempo di esecuzione di un fattore centinaia. Le cose possono migliorare ulteriormente. Se siete disposti a utilizzare un PSF rettangolare (Fig. 24-5) o PSF doppia faccia esponenziale (Fig. 24-6), i calcoli sono ancora più efficienti. Questo perché le circonvoluzioni monodimensionali sono il filtro media mobile (Capitolo 15) e il filtro bidirezionale unipolare (Capitolo 19), rispettivamente. Entrambi questi filtri unidimensionali può essere rapidamente effettuata da ricorsione. Ciò si traduce in un tempo convoluzione un'immagine proporzionale a solo N 2. completamente indipendente dalla dimensione del PSF. In altre parole, un'immagine può essere convoluta con il maggior PSF come necessario, con poche operazioni intere per pixel. Ad esempio, la convoluzione di un'immagine 512times512 richiede solo poche centinaia di millisecondi su un personal computer. Quello è veloce non piace la forma di questi due filtri kernel Convolve l'immagine con uno di loro diverse volte per approssimare una PSF gaussiano (garantita dal teorema del limite centrale, capitolo 7). Si tratta di grandi algoritmi, in grado di strappare il successo dalle fauci del fallimento. Essi sono ben merita remembering. MOVING AVANTI Parte 1: Le decisioni di progettazione nel quarto kernel di Brad Rodriguez Questo articolo è apparso in The Computer Journal 59 (JanuaryFebruary 1993). INTRODUZIONE Ognuno nel quarto parla di comunità su quanto sia facile è di port Forth ad una nuova CPU. Ma, come molti compiti quoteasyquot e quotobviousquot, non molto è scritto su come farlo Così, quando Bill Kibler suggerito questo argomento per un articolo, ho deciso di rompere con la grande tradizione orale di Forthwrights, e documentare il processo in bianco e nero. Nel corso di questi articoli mi svilupperò forths per il 6809, 8051 e Z80. Sto facendo il 6809 per illustrare un modello semplice e convenzionale Forth più, Ive ha già pubblicato un assemblatore 6809 ROD91, ROD92, e Ill essere che necessitano di un 6809 Forth per i futuri progetti TCJ. Sto facendo il 8051 Forth per un progetto universitario, ma illustra anche alcuni piuttosto diverse decisioni di progettazione. La Z80 Forth è per tutti i lettori di CPM TCJ, e per alcuni amici con TRS-80 a prendere polvere. HARDWARE ESSENZIALE È necessario scegliere una CPU. Non voglio approfondire i meriti di una CPU rispetto ad un altro per Forth, dal momento che la scelta della CPU è di solito costretto su di voi da altre considerazioni. Inoltre, l'oggetto di questo articolo è quello di mostrare come muoversi Forth a qualsiasi CPU. Ci si può aspettare il solito kernel Forth a 16 bit (vedi sotto) per occupare circa 8K byte di spazio programma. Per un kernel completo che può compilare Forth definizioni, si dovrebbe consentire un minimo di 1K byte di RAM. Per utilizzare il sistema di gestione del blocco forths per lo storage su disco, si dovrebbe aggiungere 3 Kbyte o più per i buffer. Per un modello a 32 bit Forth, doppi questi numeri. Questi sono i minimi per ottenere un Forth kernel installato e funzionante. Per eseguire un'applicazione sul proprio hardware, si dovrebbe aumentare PROM e RAM formati per soddisfare. 16 o 32 bit La dimensione parola usata da Forth non è necessariamente la stessa di quella della CPU. Il più piccolo Forth pratica è un modello a 16 bit cioè quello che utilizza interi a 16 bit e indirizzi a 16 bit. Il Forth comunità chiama questa dimensione quotcellquot, dal momento che quotwordquot si riferisce ad una definizione Forth. CPU 8-bit quasi invariabilmente supportano forths 16 bit. Questo di solito richiede esplicita codifica aritmetica doppio byte, anche se alcune CPU a 8 bit hanno un paio di operazioni a 16 bit. CPU 16 bit comunemente eseguiti forths 16 bit, anche se le stesse tecniche doppia precisione possono essere utilizzati per scrivere un 32-bit Forth su una CPU a 16 bit. Almeno un quarto a 32-bit è stato scritto per i 80868088. CPU a 32 bit funziona generalmente forths a 32 bit. Un modello più piccolo Forth raramente salva lunghezza del codice o il tempo del processore. Tuttavia, so di almeno un 16 bit Forth scritto per il 68000. Questo fa ridursi applicazione dimensione del codice di un fattore due, dato definizioni alto livello Forth diventano una serie di indirizzi a 16 bit anziché una stringa di 32 indirizzi bit. (Questo diventerà evidente a breve.) La maggior parte delle 68000s, però, hanno un sacco di RAM. Tutti gli esempi descritti in questo articolo sono forths a 16 bit in esecuzione su CPU a 8 bit. LA TECNICA FILETTATURA quotThreaded codequot è il segno distintivo di Forth. Un Forth quotthreadquot è solo un elenco di indirizzi di routine da eseguire. Si può pensare a questo come un elenco delle chiamate di subroutine, con le istruzioni CALL rimossi. Nel corso degli anni molte variazioni filettare sono stati ideati e qual è il migliore dipende dalla CPU e l'applicazione. Per prendere una decisione, è necessario capire come funzionano, e le loro compromessi. Indiretta Codice filettato (ITC) Questa è la classica tecnica Forth filettatura, utilizzata in gura Forth e F83, e descritto nella maggior parte dei libri di Forth. Tutti gli altri schemi di filettatura sono quotimprovementsquot su questo, quindi è necessario capire ITC ad apprezzare gli altri. Vediamo la definizione di un quadrato Forth parola: In un ITC tipico Forth questo apparirebbe nella memoria come mostrato in Figura 1. (L'intestazione sarà discusso in un prossimo articolo che contiene le informazioni di pulizia utilizzati per la compilazione, e non sta coinvolti nella filettatura .) si supponga SQUARE è verificato durante l'esecuzione di qualche altra parola Forth. Forths Interprete Pointer (IP) punterà a una cella nella memoria - contenuto all'interno di quella parola quototherquot - che contiene l'indirizzo della parola SQUARE. (Per essere precisi, quella cella contiene l'indirizzo di quadrati codice di campo.) L'interprete recupera l'indirizzo, e poi lo usa per recuperare il contenuto di piazze codice di campo. Questi contenuti sono ancora un altro indirizzo - l'indirizzo di una subroutine linguaggio macchina che esegue la parola quadrati. In pseudo-codice, questo è: Ciò illustra un principio importante, ma raramente chiarito: l'indirizzo del Forth parola appena entrato viene mantenuto in W. parole in codice non avete bisogno di queste informazioni, ma tutti gli altri tipi di Forth parole fare. Se SQUARE sono stati scritti in codice macchina, questa sarebbe la fine della storia: sarebbe stato eseguito quel po 'di codice macchina, e poi tornare al Forth interprete - che, dal momento che IP è stato incrementato, sta puntando alla parola successiva a essere eseguito. Questo è il motivo per cui l'interprete Forth di solito è chiamato NEXT. Ma, SQUARE è una definizione quotcolonquot di alto livello - detiene una quotthreadquot, un elenco di indirizzi. Per eseguire questa definizione, l'interprete Forth deve essere nuovamente avviato in una nuova posizione: il campo di parametro di SQUARE. Naturalmente, gli interpreti vecchia posizione deve essere salvato, per riprendere il quototherquot Forth parola una volta SQUARE è finito. Questo è proprio come una subroutine chiamata L'azione linguaggio macchina della piazza è semplicemente quello di spingere il vecchio IP, impostare IP in una nuova posizione, eseguire l'interprete, e quando è fatto SQUARE pop PI. (Come si può vedere, l'IP è il counterquot quotprogram di alto livello Forth.) Questo si chiama DOCOLON o ENTER in vari forths: Questo frammento di codice identico viene utilizzato da tutti di alto livello (ad esempio filettato) Forth definizioni Ecco perché un puntatore a questo frammento di codice, non il frammento stesso, è inclusa nella definizione Forth. Per centinaia di definizioni, i risparmi si sommano e questo è il motivo per cui la sua chiamata filettatura indiretta. Il quotreturn dal subroutinequot è la parola EXIT, che viene compilato quando Forth vede. (Alcuni forths chiamano S invece di uscire). EXIT solo esegue una routine di linguaggio macchina che esegue le seguenti operazioni: Passeggiata attraverso un paio di definizioni annidate Forth, solo per accertarvi che questo funziona. Si notino le caratteristiche di ITC: ogni Forth parola ha un codice di campo di un cellulare. definizioni Colon compilare una cella per ogni parola usata nella definizione. E l'interprete Forth deve effettivamente svolgere un doppio riferimento indiretto per ottenere l'indirizzo del codice macchina accanto a correre (prima attraverso IP, poi attraverso W). ITC non è né il più piccolo, né la tecnica di filettatura più veloce. Può essere il più semplice, anche se DTC (descritto di seguito) è in realtà più complessa. Allora, perché sono così tanti forths indiretta-threaded Soprattutto perché forths precedenti, utilizzati come modelli, sono stati indiretta - filettati. In questi giorni, DTC sta diventando sempre più popolare. Così, quando dovrebbe essere utilizzato ITC delle varie tecniche, ITC produce le definizioni più pulite e più eleganti - nient'altro che indirizzi. Se siete in sintonia a tali considerazioni, ITC può appello a voi. Se il codice traffica in giro con l'interno delle definizioni, la semplicità e l'uniformità della rappresentazione ITC possono aumentare la portabilità. ITC è il modello classico Forth, quindi potrebbe essere preferibile per l'istruzione. Infine, su CPU manca una istruzione di chiamata di sottoprogramma - come ad esempio il 1802 - ITC è spesso più efficiente di DTC. Diretta filettato codice (DTC) diretto codice threaded differisce da ITC in un solo aspetto: al posto del campo codice contenente l'indirizzo di qualche codice macchina, il campo codice contiene codice vero e proprio macchina stessa. Im non dicendo che il codice completo per ENTER è contenuta in ogni definizione del colon In parole quothigh-levelquot Forth, il campo codice conterrà una chiamata di subroutine. come mostrato in Figura 2. definizioni Colon, per esempio, conterrà una chiamata alla routine ENTER. Lo pseudo-codice successivo per la filettatura diretta è semplicemente: Questo guadagna velocità: l'interprete esegue ora un solo indiretto. Sul Z80 questo riduce la routine successiva - il frammento di codice più usato nel kernel Forth - da undici a sette istruzioni Questo costa spazio: ogni definizione di alto livello in un Z80 Forth (per esempio) è ora un byte più a lungo, poiché un indirizzo 2 byte è stata sostituita da una chiamata di 3 byte. Ma questo non è universalmente vero. A 68000 a 32 bit Forth può sostituire un indirizzo di 4 byte con una istruzione BSR 4 byte, per nessuna perdita netta. E sul Zilog Super8, che ha istruzioni macchina per DTC Forth, l'indirizzo 2 byte è sostituito da un 1 byte ENTER istruzioni, facendo un DTC Forth piccolo sul Super8 Naturalmente, le definizioni di DTC CODE sono due byte più breve, poiché non è più necessario un puntatore a tutto quello che ho usato per pensare che le definizioni di alto livello in DTC forths richiesto l'uso di una chiamata subroutine nel campo Codice. Frank Sergenti pigmeo Forth SER90 dimostra che un semplice salto può essere utilizzato con la stessa facilità, e di solito è più veloce. Guy Kelly ha compilato una superba revisione delle implementazioni indietro per il PC IBM KEL92, che consiglio vivamente a tutti Forth scrittori del kernel. Dei 19 forths ha studiato, 10 utilizzati DTC, 7 utilizzati ITC, e 2 filettatura subroutine utilizzati (discusso di seguito). Vi consiglio l'uso di-Threaded Diretta Codice over indiretto-Threaded codice per tutti i nuovi kernel Forth. Vai a NEXT, o il codice è in linea L'interprete Forth interno, NEXT, è una routine comune a tutte le definizioni di codice. Si potrebbe tenere solo una copia di questa routine comuni, e hanno tutte le parole in codice saltare ad esso. (Si noti che è Vai a PROSSIMO una subroutine chiamata non è necessario.) Tuttavia, la velocità di AVANTI è fondamentale per la velocità del sistema di tutto il Forth. Inoltre, in molte CPU, la routine AVANTI è piuttosto corta spesso solo due o tre istruzioni. Così può essere preferibile codice successivo in linea, dovunque sia usato. Questo è spesso fatto facendo AVANTI una macro assemblatore. Questa è una velocità semplice vs. decisione spazio: in-linea successiva sarà sempre più veloce, ma quasi sempre più grande. L'aumento totale dimensione è il numero di byte necessari per l'espansione in linea, volte il numero di parole di codice nel sistema. A volte non c'è nessun compromesso a tutti: in un 6809 DTC Forth, un filtro in linea successiva è più breve di un sottoprogramma Istruzione di salto filettato Codice (STC) Una definizione Forth ad alto livello non è altro che un elenco di subroutine da eseguire. Non avete bisogno di interpreti per raggiungere questo obiettivo si può ottenere lo stesso effetto, semplicemente infilare un elenco di subroutine chiamate insieme: Vedere Figura 3. Questa rappresentazione di Forth parole è stato utilizzato come punto di partenza per spiegare Forth tecniche di threading per i programmatori in linguaggio assembly KOG82. STC è un elegante definizioni rappresentazione del colon e CODICE parole sono ora identici. wordsquot quotDefined (variabili, costanti, e simili) sono gestite lo stesso che nel DTC - il campo del codice inizia con un salto o chiamare per un po 'di codice macchina altrove. Lo svantaggio principale è che le chiamate di subroutine di solito sono più grandi di indirizzi semplici. Sul Z80, ad esempio, la dimensione delle definizioni del colon aumenta del 50 - e la maggior parte della vostra applicazione è definizioni colon Al contrario, su un 32 bit 68000 ci può essere alcun aumento di dimensioni del tutto, quando gli indirizzi 4 byte vengono sostituiti con BSRS 4 byte. (Ma se la dimensione del codice supera i 64 KB, alcuni di questi indirizzi deve essere sostituito con JSR 6 byte.) Sottoprogramma filettatura può essere più veloce di filettatura diretta. Si risparmia tempo da non avere un interprete, ma si perde tempo, perché ogni riferimento ad una parola Forth comporta una spinta e pop di un indirizzo di ritorno. In un DTC Forth, solo parole di alto livello causano attività sulla pila di ritorno. Sul 6809 o Zilog Super8, DTC è più veloce di STC. C'è un altro vantaggio di STC: eroga con il registro IP. Alcuni processori - come il 8051 - sono disperatamente a corto di affrontare registri. Eliminando l'IP può davvero semplificare e velocizzare il kernel L'unico modo per sapere con certezza è quello di scrivere il codice di esempio. Questo è intimamente coinvolto con la selezione del registro, discusso nel prossimo paragrafo. STC con in linea di ottimizzazione espansione compilazione diretta sul vecchie CPU e 8-bit, quasi ogni Forth primitivo coinvolge diverse istruzioni macchina. Ma su CPU più potenti, molti Forth primitive sono scritti in una singola istruzione. Ad esempio, il 32-bit 68000, DROP è semplicemente In una subroutine filettati Forth, tramite DROP in una definizione colon comporterebbe la ADDQ sequenza è un'istruzione di due byte. Perché scrivere una subroutine chiamata a quattro byte per un'istruzione a due byte Non importa quante volte viene utilizzato GOCCIA, non c'è nessun risparmio Il codice è più piccolo e più veloce se il ADDQ è codificato direttamente nel flusso di BSRS. Alcuni Forth compilatori fanno quotin-line expansionquot di CODE parole CUR93a. Lo svantaggio di espansione in linea è che decompiling torna al codice sorgente originale diventa molto difficile. Fino a quando si usano le chiamate di subroutine, avete ancora puntatori (gli indirizzi sottoprogramma) alle parole Forth compongono il filo. Con puntatori alle parole, è possibile ottenere i loro nomi. Ma una volta che una parola è espansa in codice in-line, tutta la conoscenza del luogo in cui tale codice è venuto da è perduto. Il vantaggio di espansione in linea - a parte la velocità e le dimensioni - è il potenziale di ottimizzazione del codice. Ad esempio, la sequenza Forth verrebbe compilato 68000 STC come ma potrebbe essere esteso in-line come una singola istruzione macchina Ottimizzazione Forth compilatori è troppo ampia argomento di questo articolo. Questa è un'area attiva di ricerca lingua Forth vedere, per esempio, SCO89 e CUR93b. Il culmine finale ottimizzata STC è un Forth, che compila in quotpurequot codice macchina, proprio come un Fortran compilatore C o. Token filettato Codice (TTC) DTC e STC hanno lo scopo di migliorare la velocità di Forth programmi, ad un certo costo in memoria. Ora consente di muoversi nella direzione opposta da ITC, verso qualcosa di più lento ma più piccolo. Lo scopo di un filo Forth è specificare un elenco di Forth parole (subroutine) da eseguire. Supponiamo che un sistema a 16 bit Forth aveva solo un massimo di 256 parole diverse. Poi ogni parola potrebbe essere identificato in modo univoco da un numero a 8 bit. Invece di una lista di indirizzi a 16 bit, si avrebbe un elenco di identificatori a 8-bit o quottokens, quot e la dimensione delle definizioni del colon sarebbe dimezzato Un token-threaded Forth mantiene una tabella di indirizzi di tutte le parole indietro, come mostrato in Figura 4. il valore token viene quindi utilizzato per indicizzare questa tabella, trovare il Forth parola corrispondente ad una determinata token. Questo aggiunge un livello di indirezione al Forth interprete, quindi è più lento di un Forth quotaddress-threadedquot. Il vantaggio principale di forths token-threaded è di piccole dimensioni. TTC è più frequente nei computer palmari e altre applicazioni gravemente dimensioni limitate. Inoltre, la tabella di quotentry pointsquot in tutte le parole Forth può semplificare il collegamento di moduli separatamente compilati. Lo svantaggio di TTC è la velocità: TTC rende le forths più lente. Inoltre, il compilatore TTC è leggermente più complessa. Se avete bisogno di più di 256 Forth parole, il suo necessario avere qualche schema di codifica a tempo indeterminato di mescolare a 8-bit e gettoni di dimensioni maggiori. Posso immaginare un 32 bit Forth usando i token a 16 bit, ma come molti sistemi a 32 bit sono di dimensioni limitate segmento di codice filettato Poiché ci sono così tante 8086 derivati ​​in tutto il mondo, segmento filettatura merita una breve menzione. Invece di utilizzare indirizzi quotnormalquot byte all'interno di un segmento di 64 KB, vengono utilizzati gli indirizzi di paragrafo. (A quotparagraphquot è di 16 byte nel 8086.) Quindi, l'interprete può caricare questi indirizzi nei registri di segmento, anziché nei consueti registri di indirizzi. Questo permette un modello a 16 bit Forth per accedere in modo efficiente l'intera megabyte di memoria 8086. Lo svantaggio principale del segmento filettatura è il quotgranularityquot 16 byte di spazio di memoria. Ogni Forth parola deve essere allineato a un limite di 16 byte. Se Forth parole hanno lunghezze, una media di 8 byte verrà sprecato per Forth parola. REGISTRATI ASSEGNAZIONE Accanto alla tecnica di filettatura, l'utilizzo dei registri CPU è la decisione più importante di progettazione. La sua probabilmente il più difficile. La disponibilità di registri della CPU in grado di determinare quale tecnica di filettatura può essere utilizzato, e anche quello che la mappa di memoria sarà Avanti il ​​classico registra il modello classico Forth ha cinque registers. quot quotvirtual Questi sono entità astratte che vengono utilizzati nelle operazioni primitive di Forth. Quindi, immettere e uscire sono stati definiti in precedenza in termini di questi registri astratti. Ciascuno di questi è largo cellulare - ossia in un 16 bit Forth, questi sono registri a 16-bit. (Ci sono eccezioni a questa regola, come si vedrà più avanti.) Questi non possono essere tutti i registri della CPU. Se il vostro doesnt CPU hanno abbastanza registri, alcuni di questi possono essere tenuti in memoria. Ill descriverli in ordine di importanza vale a dire alla fine di questa lista sono i migliori candidati per essere memorizzati nella memoria. W è il registro di lavoro. E 'utilizzato per molte cose, tra cui riferimento di memoria, quindi dovrebbe essere registrare un indirizzo cioè si deve essere in grado di recuperare la memoria e negozio utilizzando il contenuto del W come l'indirizzo. È inoltre necessario essere in grado di fare l'aritmetica su W. (In DTC forths, si deve anche essere in grado di saltare indiretta utilizzando W.) W viene utilizzato dall'interprete in parola ogni Forth. In una CPU con un solo registro, si dovrebbe utilizzare per W e tenere tutto il resto nella memoria (e il sistema sarebbe incredibilmente lento). IP è il puntatore interprete. Questo è usato da ogni parola Forth (attraverso Successivamente, immettere, o EXIT). IP deve essere un registro indirizzo. È inoltre necessario essere in grado di incrementare IP. Subroutine filettato forths non hanno bisogno di questo registro. PSP è il parametro Stack (o stackquot quotdata) Pointer, a volte chiamato semplicemente SP. Io preferisco PSP perché SP è spesso il nome di un registro della CPU, ed essi sognerei essere confuso. La maggior parte delle parole in codice usano questo. PSP deve essere un puntatore di stack, o un registro di indirizzo che può essere incrementato e decrementato. E 'anche un vantaggio se si può fare indicizzato l'indirizzamento da PSP. RSP è il ritorno Stack Pointer, a volte chiamato semplicemente RP. Questo è usato da definizioni del colon in ITC e DTC forths, e da tutte le parole STC forths. RSP deve essere un puntatore di stack, o un registro di indirizzo che può essere incrementato e decrementato. Se a tutto il possibile. mettere W, IP, PSP, e RSP nei registri. I registri virtuali che seguono possono essere tenuti in memoria, ma di solito c'è un vantaggio di velocità per mantenerli in registri della CPU. X è un registro di lavoro, non considerato uno dei quotclassicalquot Forth registri, anche se la classica ITC forths bisogno per la seconda indiretto. In ITC si deve essere in grado di saltare indiretta utilizzando X. X può essere utilizzato anche da un paio di parole in codice per fare l'aritmetica e così via. Questo è particolarmente importante nei processori che non possono utilizzare la memoria come operando. Ad esempio, aggiungere un Z80 potrebbe essere (in pseudo-codice) A volte un altro registro di lavoro, Y, è anche definito. UP è il puntatore utente, tenendo l'indirizzo di base della zona di attività dell'utente. UP è di solito aggiunto un offset, e usate da alto livello di codice Forth, in modo che possa essere solo memorizzato da qualche parte. Ma se la CPU può non indicizzato l'indirizzamento dal registro UP, parole in codice possono più accedere facilmente e rapidamente variabili utente. Se si dispone di un surplus di registri di indirizzo, utilizzare uno per UP. Forths single-task non hanno bisogno UP. X - se necessario - è più importante tenere a registro di UP. UP è il più facile dei registri Forth virtuali a muoversi in memoria. L'utilizzo del Hardware Stack maggior parte delle CPU ha un stack pointer come parte del loro hardware, utilizzato da interruzioni e le chiamate di subroutine. Come funziona la mappa nei registri Forth Dovrebbe essere la PSP o il RSP La risposta breve è: dipende. Si dice che la PSP è utilizzata più che la RSP in ITC e DTC forths. Se la tua CPU ha pochi registri di indirizzi, e PUSH e POP sono più veloci di riferimento esplicito, utilizzare lo stack hardware come parametro Stack. D'altra parte, se la CPU è ricco di modi di indirizzamento - e permette indicizzata indirizzamento - theres un vantaggio nell'avere PSP come un registro di indirizzo generico. In questo caso, utilizzare lo stack hardware del Stack di ritorno. A volte si fa né Lo stack hardware TMS320C25s è solo otto cellule profondo - tutti, ma inutile per Forth. Così il suo stack di hardware viene utilizzato solo per gli interrupt, ed entrambi PSP e RSP sono registri di indirizzi di uso generale. (ANS Forth specifica un minimo di 32 cellule del parametro Pila e 24 celle di ritorno Stack preferisco 64 celle di ciascuno.) Si incontrano di tanto in tanto il dogma che la quotmust pila hardware bequot il parametro Stack, o quotmust bequot lo stack di ritorno. Invece, codice alcune primitive Forth esempio, come e vedere quale approccio è più piccolo o più veloce. (DUP e DROP, tra l'altro, non sono prova - theyre solito banale.) Di tanto in tanto si raggiunge strane conclusioni Gary Bergstrom ha fatto notare che un 6809 DTC Forth può essere fatta alcuni cicli più veloce utilizzando lo stack pointer 6809 utente come IP Next diventa un POP. Egli usa un registro indice per una delle pile forths. Top-of-stack in termini di prestazioni Registrati forths può essere migliorata notevolmente, mantenendo l'elemento superiore del Parametro stack in un registro Molti Forth parole (come ad esempio 0) dont quindi bisogno di utilizzare lo stack. Altre parole ancora fare lo stesso numero di spinte e pop, solo in un posto diverso nel codice. Solo poche parole Forth (DROP e 2DROP) diventato più complicato, dal momento che non è più possibile semplicemente modificare lo stack pointer - è necessario aggiornare i TOS registro pure. Ci sono alcune regole durante la scrittura di parole in codice: Una parola che rimuove gli elementi dallo stack deve apparire i TOS quotnewquot nel suo registro. Una parola che aggiunge elementi alla pila deve spingere i TOS quotoldquot sulla pila (a meno che, naturalmente, la sua consumata dalla parola). Se si dispone di almeno sei celle di dimensioni registri della CPU, vi consiglio di tenere la TOS in un registro. Ritengo TOS più importante che fino ad avere nel registro, ma meno importante di W, IP, PSP, e RSP. (TOS nel registro esegue molte delle funzioni del registro X). Il suo utile se questo registro può eseguire indirizzamento di memoria. PDP-11s, Z8s e 68000s sono buoni candidati. Nove dei 19 PC IBM forths studiati da Guy Kelly KEL92 tenere TOS nel registro. Credo che questa innovazione è stata resistito a causa delle false credenze che a) si aggiunge istruzioni, e b) l'elemento di stack superiore deve essere accessibile come memoria. Si scopre che anche parole come PICK, ROLL, e profondità sono banalmente modificati per TOS-in-registro. Che dire il buffering due elementi dello stack nei registri Quando si tiene la parte superiore dello stack in un registro, il numero totale di operazioni eseguite rimane essenzialmente la stessa. Una spinta rimane una spinta, indipendentemente dal fatto che sia prima o dopo l'operazione di sei esecuzione. D'altra parte, il buffering due elementi pila in registri aggiunge un gran numero di istruzioni - una spinta diventa una spinta seguito da un movimento. Solo processori dedicati sorgerà come l'RTX2000 e compilatori ottimizzanti straordinariamente intelligenti possono beneficiare di buffer due elementi dello stack nei registri. Alcuni esempi Ecco le assegnazioni dei registri realizzati da forths per una serie di diverse CPU. Cercare di dedurre le decisioni di progettazione degli autori da questo elenco. quotSPquot si riferisce al puntatore dello stack hardware. quotZpagequot si riferisce a valori custoditi nella pagina di memoria 6502s pari a zero, che sono quasi tanto utile quanto - a volte più utile di - valori conservati nei registri ad esempio essi possono essere utilizzati per l'indirizzamento della memoria. quotFixedquot significa che Paynes 8051 Forth ha un unico, area utente immobile, e UP è una costante hard-coded. Narrow Registri notato niente di strano nella lista precedente Il 6502 Forth - un modello a 16-bit - utilizza puntatori pila a 8-bit E 'possibile effettuare PSP, RSP, e UP inferiore alla dimensione delle cellule del Forth. Questo perché le pile e area utente sono entrambi relativamente piccole aree di memoria. Ogni stack può essere piccolo come 64 celle di lunghezza, e l'area utente raramente supera 128 cellule. Hai semplicemente bisogno di garantire che sia a) questi dati aree sono confinati ad una piccola area di memoria, quindi un breve discorso possono essere utilizzati, oppure b) i bit alti di indirizzo sono forniti in qualche altro modo, ad esempio, una pagina di memoria di selezione. Nel 6502, lo stack hardware è limitata alla prima pagina di RAM (indirizzi 01xxh) dal disegno della CPU. Il puntatore dello stack a 8-bit può essere utilizzato per lo stack di ritorno. Il parametro di Stack è tenuto in pagina zero della RAM, che può essere indirettamente accessibile dal registro indice X a 8 bit (Domanda per lo studente avanzato: perché usare i 6502s X, Y e non Suggerimento: guarda le modalità di indirizzamento disponibili. ) Nel 8051, è possibile utilizzare la 8-bit registri R0 e R1 per affrontare RAM esterna, a condizione che esplicitamente l'uscita delle alte 8 bit di indirizzo alla porta 2. Questo permette un selectquot quotpage per due pile. UP è diverso da PSP e RSP: fornisce semplicemente un indirizzo di base non è mai incrementato o decrementato. Così la sua pratica a fornire solo le alte bit di questo registro virtuale. I bit basse devono quindi essere forniti con qualsiasi tecnica di indirizzamento indicizzato viene utilizzato. Ad esempio, il 6809, è possibile utilizzare il registro di DP per contenere gli alti 8 bit di UP, e quindi utilizzare diretto pagina di indirizzamento per accedere a qualsiasi dei 256 luoghi in questa pagina. Questo costringe tutte le aree di utente per iniziare su un xx00h indirizzo, che non è un grande disagio, e limita l'area utente a 128 cellule di lunghezza. Al 8086 si potrebbe in teoria utilizzare un registro di segmento per specificare l'indirizzo di base della zona dell'utente. RIFERIMENTI CUR93a Curley, Charles, quotLife nel FastForth Lane, quot in attesa di pubblicazione in Forth Dimensioni. Descrizione di una Forth subroutine filettati 68000. CUR93b Curley, Charles, quotOptimizing in un BSRJSR filettato Forth, quot in attesa di pubblicazione in Forth Dimensioni. ottimizzazione del codice single-pass per FastForth, in soli cinque schermi di codice include quotazione. KEL92 Kelly, Guy M. quotForth Sistemi Confronti, quot Forth Dimensioni XIII: 6 (marapr 1992). Pubblicato anche in 1991 Forml Conference Proceedings. Entrambi disponibili dal Forth Interest Group, P. O. Box 2154, Oakland, CA 94621. Illustra compromessi di progettazione di molti 8086 forths con frammenti di codice e parametri di riferimento - altamente raccomandato KOG82 Kogge, Peter M. quotAn Trail architettonica di Threaded - Codice Sistemi, quot IEEE Computer, vol. 15 n. 3 (marzo 1982). Rimane la descrizione definitiva delle varie tecniche di filettatura. ROD91 Rodriguez, B. J. quotB. Y.O. Assembler, quot Parte 1, il computer Journal 52 (SepOct 1991). Principi generali di scrittura Forth assemblatori. ROD92 Rodriguez, B. J. quotB. Y.O. Assembler, quot parte 2, il computer Journal 54 (JanFeb 1992). Un 6809 assembler in Forth. SCO89 Scott, Andrew, quotAn Extensible Optimizer per la compilazione Forth, quot 1989 Formi Conference Proceedings. Forth Interest Group, P. O. Box 2154, Oakland, CA 94621. buona descrizione di un ottimizzatore di 68000 nessun codice fornito. CUR86 Curley, Charles, reale Forth per il 68000. distribuito privatamente (1986). JAM80 James, John S. fico-Forth per il PDP-11. Forth Interest Group (1980). KUN81 Kuntze, Robert E. MVP-Forth per l'Apple II. Mountain View Press (1981). LAX84 Laxen, H. e Perry, M. F83 per il PC IBM. versione 2.1.0 (1984). Distribuito da autori, disponibili dal Forth Interest Group o GEnie. LOE81 Loeliger, R. G. filettati interpretativi Lingue. Pubblicazioni BYTE (1981), ISBN 0-07-038360-X. Può essere l'unico libro mai scritto sul tema della creazione di un kernel Forth-like (l'esempio utilizzato è la Z80). Ne vale la pena se è possibile trovare una copia. 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 2015. See details here (PDF) New Sources of Financing for PPPs in 2015 Access the data on how PPPs in low and middle income countries were financed in 2015. Available under PPI Resources. - Total investments in private infrastructure in emerging markets in 2015 remained steady at US111.6 billion. - 2015 saw the largest single investment commitment ever recorded: Turkeys US35.6 billion IGA Airport. - Excluding Brazil, China, and India, global PPI in 2015 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 2014: Private investment in infrastructure in IDA countries from 2009 to 2014 totaled US73 billion.

No comments:

Post a Comment