{"id":148,"date":"2009-01-10T03:40:55","date_gmt":"2009-01-10T02:40:55","guid":{"rendered":"http:\/\/www.oscene.net\/site\/?p=148"},"modified":"2009-01-10T03:40:55","modified_gmt":"2009-01-10T02:40:55","slug":"come-funziona-un-processore-arm","status":"publish","type":"post","link":"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm","title":{"rendered":"Come funziona un processore ARM"},"content":{"rendered":"<h3>Introduzione<\/h3>\n<p>Le CPU con architettura ARM sono utilizzate in milioni di dispositivi embedded, come microcontrollori, router, schede wifi, telefoni cellulari, smartphones, palmari, console portatili (GameBoy Advance, Nintendo DS), lettori DVD\/DivX, lettori MP3\/MP4 e tanti altri&#8230;<\/p>\n<p>Per brevit\u00c3\u00a0 indicher\u00c3\u00b2 con ARM tutta la categoria, evitando di specificare ogni volta il tipo di processore, nonostante questa terminologia non sia corretta in tutti i casi. Infatti con il termine ARM si identificano tante cose, tra cui l&#8217;azienda che detiene i brevetti, il nome della microarchitettura, il nome del set di istruzioni a 32 bit.<\/p>\n<p>I processori ARM si differenziano dai pi\u00c3\u00b9 noti x86 (nda. i classici processori per PC) per diverse caratteristiche.<\/p>\n<p>Innanzitutto, la grossa distinzione \u00c3\u00a8 data dal tipo di architettura interna: i processori ARM sono di tipo RISC, mentre i processori x86 sono di tipo CISC. Rimando a Wikipedia per una descrizione dettagliata delle differenze tra i due tipi di architettura. Per i nostri scopi basta soltanto porre l&#8217;accento sul fatto che i processori di tipo RISC tendono a implementare istruzioni molto semplici, ma che vengono eseguite ad altissima velocit\u00c3\u00a0 (tipicamente 1 solo ciclo di clock), mentre i processori CISC generalmente implementano una vasta gamma di istruzioni complesse che richiedono anche diverse decine di cicli di clock per essere eseguite. Queste istruzioni complesse in genere servono a facilitare \u00c2\u00a0il compito del programmatore di compilatori, a discapito dell&#8217;efficienza e della semplicit\u00c3\u00a0 interna del chip.<\/p>\n<p><!--more--><\/p>\n<h3>Caratteristiche generali<\/h3>\n<h4>Set di istruzioni ortogonale<\/h4>\n<p>I processori ARM dispongono di 31 registri interni, ma in ogni momento sono visibili solo 16 di questi, che vengono selezionati in base alla modalit\u00c3\u00a0 di funzionamento (modalit\u00c3\u00a0 Utente, modalit\u00c3\u00a0 Interrupt, modalit\u00c3\u00a0 System, ecc&#8230;). Ciascuno di questi registri pu\u00c3\u00b2 essere utilizzato indifferentemente come registro sorgente o come registro destinazione di qualunque istruzione. Ad esempio \u00c3\u00a8 possibile eseguire una somma del contenuto dei registri 3 e 4 e inserire il risultato nel registro 2 in questo modo:<\/p>\n<pre>add r2, r3, r4<\/pre>\n<p>Questa flessibilit\u00c3\u00a0 nell&#8217;uso dei registri consente la scrittura di programmi molto compatti. Infatti, a differenza di molte architetture CISC nelle quali ogni calcolo avviene su un singolo registro detto <a href=\"http:\/\/en.wikipedia.org\/wiki\/Accumulator_(computing)\">accumulatore<\/a>, il cuore delle architetture RISC, come quella ARM, risiede proprio nell&#8217;<strong>ortogonalit\u00c3\u00a0 del set di istruzioni<\/strong> che, seppur ridotto e semplificato, espone un&#8217;ampia flessibilit\u00c3\u00a0 al programmatore Assembly.\u00c2\u00a0<\/p>\n<h4>Esecuzione condizionata<\/h4>\n<p>Un&#8217;altra caratteristica molto apprezzata dei processori ARM risiede nella cosiddetta <strong>esecuzione condizionata<\/strong>. Quasi tutte le istruzioni dei processori ARM possono essere accompagnate da un codice di controllo, chiamato <strong>condition code<\/strong>, che modifica l&#8217;esecuzione dell&#8217;istruzione alla quale viene applicato. L&#8217;utilit\u00c3\u00a0 dell&#8217;esecuzione condizionata si nota immediatamente esaminando questo frammento di codice:<\/p>\n<pre>\/\/ Codice C\nif (a &lt; b)\n{\n        a = a + b;\n}\nelse\n{\n        a = a - b;\n}<\/pre>\n<p>che in Assembly diventa:<\/p>\n<pre>cmp Ra, Rb          ; confronta le due variabili\n                    ; settando dei flags interni\n                    ; in base al risultato\naddlt Ra, Ra, Rb    ; esegue la somma se LT (Less than)\nsubge Ra, Ra, Rb    ; esegue la sottrazione se GE (greater or equal)<\/pre>\n<p>da notare come in questo pezzo di codice non siano presenti salti, che invece sarebbero necessari per indirizzare il flusso di programma verso i rami di codice corretti, nel caso in cui mancasse la possibilit\u00c3\u00a0 di effettuare istruzioni condizionate.<\/p>\n<p>In questo esempio \u00c2\u00a0si mostra come in soli 3 cicli di clock l&#8217;architettura sia in grado di eseguire un confronto, un&#8217;operazione di somma e un&#8217;assegnazione&#8230;\u00c2\u00a0<\/p>\n<h4>Il Barrel Shifter<\/h4>\n<p>Supponiamo di dover scrivere un pezzo di codice che esegua questa operazione:<\/p>\n<pre>a = b + c \/ 32;<\/pre>\n<p>In questo caso dobbiamo effettuare una divisione per 32 (che corrisponde ad uno shift aritmetico a destra di 5 bit), una somma e un&#8217;assegnazione. In teoria sarebbero 3 istruzioni separate, ma grazie alla potenza dell&#8217;architettura ARM riusciamo a scrivere tutto questo in una sola istruzione, che viene eseguita in 1 singolo ciclo di clock, vediamo come:<\/p>\n<pre>add Ra, Rb, Rc ASR#5    ; ASR sta per Arithmetic Shift Right\n                        ; #5 \u00c3\u00a8 il numero di bit per lo shift<\/pre>\n<h3>Le estensioni DSP<\/h3>\n<h4>Operazioni con saturazione<\/h4>\n<p>I processori ARM dalla versione ARMv5e in poi (come l&#8217;ARM946E-S presente nel Nintendo DS, in alcuni lettori MP3 Samsung e in moltissimi altri dispositivi) contengono alcune istruzioni votate al signal processing. Sono istruzioni che includono un controllo sulla saturazione del risultato e risultano molto utili nelle applicazioni multimediali come ad esempio mixer digitali, decoder MP3, filtri grafici come alpha blending, ecc&#8230;<\/p>\n<p>Ad esempio il seguente frammento di codice in C:<\/p>\n<pre>a = b + c;\nif (a &gt; MAXINT)\n{\n    a = MAXINT;\n}<\/pre>\n<p>viene reso in Assembly dalla singola istruzione:<\/p>\n<pre>qadd Ra, Rb, Rc<\/pre>\n<h4>Istruzioni SIMD<\/h4>\n<p>Processori pi\u00c3\u00b9 recenti, dalla versione ARMv6 in poi, inoltre hanno delle istruzioni ancora pi\u00c3\u00b9 potenti che risultano estremamente utili quando si lavora con immagini e suoni. Supponiamo ad esempio di dover implementare un filtro grafico che calcoli la somma dei valori RGBA tra 2 pixel (un esempio simile si potrebbe fare nel caso di un filtro audio digitale che debba mixare diverse sorgenti audio su un sistema multitraccia).<br \/>\nI dati di colore ci vengono presentati sotto forma di numeri interi a 32 bit, strutturati in questo modo:<\/p>\n<p>bit 0-7: canale R<br \/>\nbit 8-15: canale G<br \/>\nbit 16-23: canale B<br \/>\nbit 24-31: canale Alpha<\/p>\n<p>In C scriveremmo qualcosa del genere (per chi non avesse padronanza con gli <a href=\"http:\/\/www.oscene.net\/site\/programmazione\/c\/capire-e-sfruttare-le-operazioni-bitwise\">operatori binari<\/a>, si rimanda al relativo articolo):<\/p>\n<pre>int R,G,B,A;   \/\/ risultato\nint destinazione;\nint R1, R2, G1, G2, B1, B2, A1, A2; \/\/ operandi\nint colore1, colore2;\n\n\/\/ estraggo i canali dal primo pixel\nR1 = (colore1 &amp; 0x000000FF) &gt;&gt; 0;\nG1 = (colore1 &amp; 0x0000FF00) &gt;&gt; 8;\nB1 = (colore1 &amp; 0x00FF0000) &gt;&gt; 16;\nA1 = (colore1 &amp; 0xFF000000) &gt;&gt; 24;\n\n\/\/ estraggo i canali dal secondo pixel\nR2 = (colore2 &amp; 0x000000FF) &gt;&gt; 0;\nG2 = (colore2 &amp; 0x0000FF00) &gt;&gt; 8;\nB2 = (colore2 &amp; 0x00FF0000) &gt;&gt; 16;\nA2 = (colore2 &amp; 0xFF000000) &gt;&gt; 24;\n\n\/\/ calcolo il risultato\nR = R1 + R2;\nif (R &gt; 255) R = 255; \/\/ il massimo valore consentito \u00c3\u00a8 255 per canale\nG = G1 + G2;\nif (G &gt; 255) G = 255;\nB = B1 + B2;\nif (B &gt; 255) B = 255;\nA = A1 + A2;\nif (A &gt; 255) A = 255;\n\n\/\/ impacchetto nuovamente i canali nel pixel di destinazione\ndestinazione = (A &lt;&lt; 24) | (B &lt;&lt; 16) | (G &lt;&lt; 8 ) | (R &lt;&lt; 0);<\/pre>\n<p>Queste 16 righe di codice (che in realt\u00c3\u00a0 corrispondono a circa una quarantina di operazioni elementari), possono essere rese incredibilmente compatte in ARM:<\/p>\n<pre>uqadd8 Rrisultato, Rcolore1, Rcolore2<\/pre>\n<p>questo calcolo estremamente complesso <strong>viene eseguito dal processore in un singolo ciclo di clock<\/strong>&#8230; sembra incredibile? \ud83d\ude42<\/p>\n<p>L&#8217;istruzione UQADD8 sostanzialmente effettua 4 somme da 8 bit in parallelo, una somma per ogni byte dei registri in ingresso, saturando i risultati al limite massimo per gli interi senza segno a 8 bit (cio\u00c3\u00a8 da 0 a +255). Esiste anche la variante QADD8 che effettua la saturazione con segno (quindi da -128 a +127)<\/p>\n<h4>Multiply Accumulate<\/h4>\n<p>Un altro esempio di istruzione DSP-like \u00c3\u00a8 l&#8217;istruzione MLA (Multiply and Accumulate). Questa istruzione viene pesantemente utilizzata nei motori di rendering 3D e in numerose altre applicazioni che richiedono il calcolo di espressioni polinomiali della forma Y = A1 * X1 + A2 * X2 + &#8230; + An * Xn. Queste operazioni sono estremamente comuni quando si trattano vettori e matrici (un esempio classico \u00c3\u00a8 il calcolo di una matrice inversa o il calcolo di un prodotto scalare tra 2 vettori).<\/p>\n<p>Ad esempio questo frammento di codice in C:<\/p>\n<pre>y = a1 * x1\u00c2\u00a0+ a2 * x2 + a3 * x3;<\/pre>\n<p>viene reso in Assembly da queste poche istruzioni<\/p>\n<pre>mul R0, R1, R4\nmla R7, R2, R5, R0\nmla R0, R3, R6, R7<\/pre>\n<p>L&#8217;istruzione MUL \u00c3\u00a8 una normale istruzione di moltiplicazione, ciascuna delle istruzioni MLA successive eseguono il prodotto di due registri e sommano il risultato al contenuto del registro specificato nel primo parametro. Da notare come sia possibile specificare uno qualsiasi dei registri da R1 a R15 come parametri, i registri R13, R14 ed R15 sono utilizzati come registri speciali, rispettivamente come <strong>Stack Pointer<\/strong>, <strong>Link Register <\/strong>e <strong>Program Counter<\/strong>, quindi il loro utilizzo deve essere regolato in modo molto attento.<\/p>\n<h3>Obiettivo: 1 istruzione \/ ciclo macchina<\/h3>\n<p>Spulciando i reference documents di ARM ci si accorge di un dettaglio importante: molte delle istruzioni pi\u00c3\u00b9 complesse (come le istruzioni Multiply-Accumulate) impiegano un certo numero di cicli di clock per essere eseguite (nel caso specifico l&#8217;istruzione MLA impiega 3 cicli macchina sul core <strong>ARM9E-S<\/strong>, pu\u00c3\u00b2 variare in altre implementazioni) ma, grazie a particolari tecniche, \u00c3\u00a8 possibile avvicinarsi al valore medio di 1 istruzione per ogni ciclo macchina.<br \/>\nCom&#8217;\u00c3\u00a8 possibile?<\/p>\n<p>Questo traguardo viene raggiunto tramite l&#8217;organizzazione interna dell&#8217;architettura, che si suddivide in subunit\u00c3\u00a0 funzionali costituendo una cosiddetta pipeline di esecuzione. Esistono diverse possibili implementazioni della pipeline, ne mostriamo una soltanto a titolo esemplificativo:<\/p>\n<p>\u00c2\u00a0<\/p>\n<div style=\"width: 478px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/21\/Fivestagespipeline.png\"><img loading=\"lazy\" decoding=\"async\" class=\"  \" title=\"5 stage pipeline\" src=\"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/21\/Fivestagespipeline.png\" alt=\"5 stage pipeline\" width=\"468\" height=\"150\" \/><\/a><p class=\"wp-caption-text\">5 stage pipeline<\/p><\/div>\n<p>\u00c2\u00a0<\/p>\n<p>\u00c2\u00a0<\/p>\n<p>Le 5 fasi (stage) della pipeline sono: Fetch, Decode, Execute, Memory, Write.<\/p>\n<ul>\n<li>Lo stadio di <strong>Fetch <\/strong>del processore si occupa di recuperare dalla memoria la prossima istruzione da eseguire<\/li>\n<li>lo stadio di <strong>Decode <\/strong>serve a predisporre i circuiti interni per l&#8217;esecuzione dell&#8217;istruzione precedentemente caricata (durante la precedente fase di fetch)<\/li>\n<li>l&#8217;istruzione cos\u00c3\u00ac decodificata passa allo stadio di <strong>Execute<\/strong>, dove vengono eseguiti effettivamente tutti i calcoli, il barrel shifting e il calcolo degli offset per le istruzioni di branch<\/li>\n<li>successivamente l&#8217;istruzione passa allo stadio di <strong>Memory<\/strong>, che consiste nell&#8217;accesso ai dati (operandi) dalla memoria nel caso di istruzioni che operano in memoria (come istruzioni di load, o istruzioni con operandi fuori dai registri), oppure semplicemente lascia transitare l&#8217;esecuzione alla fase successiva, se l&#8217;istruzione corrente non prevede accesso in memoria (come le istruzioni che operano sui registri), oppure ancora serve per completare la fase di esecuzione per le istruzioni di moltiplicazione o di Multiply Accumulate (le istruzioni di moltiplicazione richiedono 2 fasi per essere completate, durante la prima fase vengono calcolati i prodotti parziali e durante la seconda fase vengono sommati dando il prodotto finale)<\/li>\n<li>lo stadio finale, quello di <strong>Write<\/strong>, serve per riporre i risultati dell&#8217;operazione all&#8217;interno del registro di destinazione.<\/li>\n<\/ul>\n<p>Internamente, il processore \u00c3\u00a8 a sua volta suddiviso in 5 stadi, ciascuno dei quali opera in maniera semi-indipendentemente dagli altri. Pertanto, mentre lo stadio di Execute sta effettuando dei calcoli, lo stadio di decode sta gi\u00c3\u00a0 preparando i circuiti per l&#8217;istruzione successiva, e lo stadio di Fetch ha gi\u00c3\u00a0 recuperato le prossime 3 istruzioni (quella in Execute, quella in Decode e quella corrente). Questa organizzazione a catena di montaggio consente l&#8217;esecuzione <strong>contemporanea <\/strong>di pi\u00c3\u00b9 istruzioni all&#8217;interno di un singolo ciclo macchina. Pi\u00c3\u00b9 precisamente, ciascuna istruzione pu\u00c3\u00b2 essere spezzata in 5 sottofasi, ciascuna delle quali, a sua volta, viene eseguita da uno dei 5 stadi del processore. In questo modo si massimizza l&#8217;efficienza di esecuzione sfruttando appieno tutte le parti del processore, ciascuna impegnata ad eseguire il proprio compito e successivamente a passare il risultato allo stadio successivo.<\/p>\n<p>Grazie a questa strategia il processore \u00c3\u00a8 in grado di iniziare una nuova istruzione (in condizioni ottimali, ma ci\u00c3\u00b2 non \u00c3\u00a8 sempre possibile) ad ogni ciclo macchina, mentre in output fornisce il risultato dell&#8217;istruzione iniziata 5 cicli macchina prima. Superati quindi (nel caso ideale) i primi 4 cicli macchina, dal quinto ciclo in poi il processore \u00c3\u00a8 in grado di processare praticamente 1 istruzione per ogni ciclo.<\/p>\n<p>La struttura a pipeline ha comunque degli svantaggi, ma per approfondire l&#8217;argomento vi consiglio di dare un&#8217;occhiata ad altre fonti pi\u00c3\u00b9 prettamente tecniche, seguendo i link che troverete a fine articolo.<\/p>\n<h3>Set di istruzioni multipli<\/h3>\n<p>I processori ARM si distinguono per la loro capacit\u00c3\u00a0 di eseguire codice con set di istruzioni misti. Tipicamente un processore ARM moderno supporta fino a 4 set di istruzioni diversi (il numero e il tipo cambiano in base al modello): il set ARM a 32 bit, il set Thumb a 16 bit, il Thumb-2 misto a 16 e 32 bit e il set Java ByteCode (Jazelle) a 8bit.<\/p>\n<p>Le caratteristiche principali dei vari set:<\/p>\n<ul>\n<li><strong>ARM<\/strong>: Consente la scrittura di codice molto denso, indicato per le sezioni di codice dedicate al calcolo intensivo (applicazioni multimediali in primis)<\/li>\n<li><strong>Thumb <\/strong>e <strong>Thumb-2<\/strong>: Sono set ridotti a 16 bit (il secondo include anche istruzioni a 32 bit) che consentono la scrittura di codice che occupa poco spazio, adatto per quei casi in cui il bus di sistema sia a 16 bit (come nel Nintendo DS), per ottimizzare i tempi di caricamento delle istruzioni dalla RAM (1 ciclo di sistema per caricare ogni istruzione a 16 bit, 2 cicli di sistema per le istruzioni a 32 bit)<\/li>\n<li><strong>Jazelle<\/strong>: Set di istruzioni Java, consente l&#8217;esecuzione rapida di bytecode Java, utile per l&#8217;implementazione di macchine virtuali Java particolarmente ottimizzate. Contiene un meccanismo intelligente di software fallback, per consentire al programma di mixare istruzioni Java eseguite in hardware con istruzioni Java interpretate via software in modo classico<\/li>\n<\/ul>\n<p>In ciascun momento il processore pu\u00c3\u00b2 passare da una modalit\u00c3\u00a0 all&#8217;altra tramite delle semplici istruzioni di salto (BX e BXJ).<\/p>\n<h3>Conclusioni<\/h3>\n<p>Spero di aver soddisfatto la curiosit\u00c3\u00a0 di molti appassionati di architetture, ma soprattutto di aver stuzzicato il palato di quei programmatori un po&#8217; smaliziati che volessero avvicinarsi al mondo della programmazione a basso livello su macchine RISC. Per ulteriori approfondimenti potete iniziare a spulciare questi link, dai quali io stesso ho imparato parecchio e che costituiscono una fonte molto vasta di informazioni, tecniche e riferimenti di vario genere:<\/p>\n<p><a href=\"http:\/\/en.wikipedia.org\/wiki\/ARM_architecture\">http:\/\/en.wikipedia.org\/wiki\/ARM_architecture<\/a>\u00c2\u00a0(informazioni generali sull&#8217;architettura ARM, in inglese)<br \/>\n<a href=\"http:\/\/en.wikipedia.org\/wiki\/Classic_RISC_pipeline\">http:\/\/en.wikipedia.org\/wiki\/Classic_RISC_pipeline<\/a>\u00c2\u00a0(alcune informazioni sulla pipeline dell&#8217;ARM9)<br \/>\n<a href=\"http:\/\/infocenter.arm.com\/help\/topic\/com.arm.doc.qrc0001m\/QRC0001_UAL.pdf\">http:\/\/infocenter.arm.com\/help\/topic\/com.arm.doc.qrc0001m\/QRC0001_UAL.pdf<\/a>\u00c2\u00a0(set di istruzioni a 32 bit ARM e Thumb-2)<br \/>\n<a href=\"http:\/\/infocenter.arm.com\/help\/topic\/com.arm.doc.qrc0006e\/QRC0006_UAL16.pdf\">http:\/\/infocenter.arm.com\/help\/topic\/com.arm.doc.qrc0006e\/QRC0006_UAL16.pdf<\/a>\u00c2\u00a0(set di istruzioni a 16 bit Thumb e Thumb-2)<br \/>\n<a href=\"http:\/\/infocenter.arm.com\/help\/index.jsp\">http:\/\/infocenter.arm.com\/help\/index.jsp<\/a>\u00c2\u00a0(tutto quello che c&#8217;\u00c3\u00a8 da sapere sui processori ARM parte da qui!!!)<\/p>\n<p>Buona lettura!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduzione Le CPU con architettura ARM sono utilizzate in milioni di dispositivi embedded, come microcontrollori, router, schede wifi, telefoni cellulari, smartphones, palmari, console portatili (GameBoy Advance, Nintendo DS), lettori DVD\/DivX, lettori MP3\/MP4 e tanti altri&#8230; Per brevit\u00c3\u00a0 indicher\u00c3\u00b2 con ARM tutta la categoria, evitando di specificare ogni volta il tipo di processore, nonostante questa terminologia [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[29],"tags":[23,24,25,165,31,76,78,163,86],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Come funziona un processore ARM - OScene.net<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Come funziona un processore ARM - OScene.net\" \/>\n<meta property=\"og:description\" content=\"Introduzione Le CPU con architettura ARM sono utilizzate in milioni di dispositivi embedded, come microcontrollori, router, schede wifi, telefoni cellulari, smartphones, palmari, console portatili (GameBoy Advance, Nintendo DS), lettori DVD\/DivX, lettori MP3\/MP4 e tanti altri&#8230; Per brevit\u00c3\u00a0 indicher\u00c3\u00b2 con ARM tutta la categoria, evitando di specificare ogni volta il tipo di processore, nonostante questa terminologia [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm\" \/>\n<meta property=\"og:site_name\" content=\"OScene.net\" \/>\n<meta property=\"article:published_time\" content=\"2009-01-10T02:40:55+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/21\/Fivestagespipeline.png\" \/>\n<meta name=\"author\" content=\"Antonio Barba\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Antonio Barba\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm\",\"url\":\"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm\",\"name\":\"Come funziona un processore ARM - OScene.net\",\"isPartOf\":{\"@id\":\"https:\/\/www.oscene.net\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm#primaryimage\"},\"thumbnailUrl\":\"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/21\/Fivestagespipeline.png\",\"datePublished\":\"2009-01-10T02:40:55+00:00\",\"dateModified\":\"2009-01-10T02:40:55+00:00\",\"author\":{\"@id\":\"https:\/\/www.oscene.net\/it\/#\/schema\/person\/df83abe3c21cb652c3ffc4aa525b96d1\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm#primaryimage\",\"url\":\"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/21\/Fivestagespipeline.png\",\"contentUrl\":\"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/21\/Fivestagespipeline.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.oscene.net\/it\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Come funziona un processore ARM\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.oscene.net\/it\/#website\",\"url\":\"https:\/\/www.oscene.net\/it\/\",\"name\":\"OScene.net\",\"description\":\"Ope(rating)n S(ystem)ource Scenario\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.oscene.net\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.oscene.net\/it\/#\/schema\/person\/df83abe3c21cb652c3ffc4aa525b96d1\",\"name\":\"Antonio Barba\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/www.oscene.net\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3cd4232e83d5d207d431e6fbafe5c3c2?s=96&d=retro&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3cd4232e83d5d207d431e6fbafe5c3c2?s=96&d=retro&r=g\",\"caption\":\"Antonio Barba\"},\"sameAs\":[\"http:\/\/www.oscene.net\"],\"url\":\"https:\/\/www.oscene.net\/it\/author\/thekaneb\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Come funziona un processore ARM - OScene.net","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm","og_locale":"it_IT","og_type":"article","og_title":"Come funziona un processore ARM - OScene.net","og_description":"Introduzione Le CPU con architettura ARM sono utilizzate in milioni di dispositivi embedded, come microcontrollori, router, schede wifi, telefoni cellulari, smartphones, palmari, console portatili (GameBoy Advance, Nintendo DS), lettori DVD\/DivX, lettori MP3\/MP4 e tanti altri&#8230; Per brevit\u00c3\u00a0 indicher\u00c3\u00b2 con ARM tutta la categoria, evitando di specificare ogni volta il tipo di processore, nonostante questa terminologia [&hellip;]","og_url":"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm","og_site_name":"OScene.net","article_published_time":"2009-01-10T02:40:55+00:00","og_image":[{"url":"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/21\/Fivestagespipeline.png"}],"author":"Antonio Barba","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Antonio Barba","Tempo di lettura stimato":"11 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm","url":"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm","name":"Come funziona un processore ARM - OScene.net","isPartOf":{"@id":"https:\/\/www.oscene.net\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm#primaryimage"},"image":{"@id":"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm#primaryimage"},"thumbnailUrl":"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/21\/Fivestagespipeline.png","datePublished":"2009-01-10T02:40:55+00:00","dateModified":"2009-01-10T02:40:55+00:00","author":{"@id":"https:\/\/www.oscene.net\/it\/#\/schema\/person\/df83abe3c21cb652c3ffc4aa525b96d1"},"breadcrumb":{"@id":"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm#primaryimage","url":"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/21\/Fivestagespipeline.png","contentUrl":"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/21\/Fivestagespipeline.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.oscene.net\/it\/come-funziona\/come-funziona-un-processore-arm#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.oscene.net\/it"},{"@type":"ListItem","position":2,"name":"Come funziona un processore ARM"}]},{"@type":"WebSite","@id":"https:\/\/www.oscene.net\/it\/#website","url":"https:\/\/www.oscene.net\/it\/","name":"OScene.net","description":"Ope(rating)n S(ystem)ource Scenario","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.oscene.net\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/www.oscene.net\/it\/#\/schema\/person\/df83abe3c21cb652c3ffc4aa525b96d1","name":"Antonio Barba","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/www.oscene.net\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3cd4232e83d5d207d431e6fbafe5c3c2?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3cd4232e83d5d207d431e6fbafe5c3c2?s=96&d=retro&r=g","caption":"Antonio Barba"},"sameAs":["http:\/\/www.oscene.net"],"url":"https:\/\/www.oscene.net\/it\/author\/thekaneb"}]}},"_links":{"self":[{"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/posts\/148"}],"collection":[{"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/comments?post=148"}],"version-history":[{"count":1,"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/posts\/148\/revisions"}],"predecessor-version":[{"id":160,"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/posts\/148\/revisions\/160"}],"wp:attachment":[{"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/media?parent=148"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/categories?post=148"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/tags?post=148"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}