Ogni linea di microcontrollori ha il suo linguaggio / sintassi di programmazione?


10

Ho programmato Arduino e ho iniziato a programmare Teensy. Sono simili a C ma ci sono lievi sfumature nel linguaggio di programmazione.

Ad esempio, nella C di Arduino chiamate una funzione pinMode (pin #, Output / Input) per designare un pin digitale per segnali in uscita o per ricevere segnali. In Teensy C, si imposta il registro "DDR" associato a una delle quattro porte (ognuna delle quali rappresenta una raccolta di pin) che vengono designate collettivamente come input o output ( sintassi Teensy IO ).

Vorrei sapere se nel caso in cui si utilizzi un microcontrollore nuovo per te, è necessario apprendere efficacemente una nuova "lingua". Metto la parola "linguaggio" tra virgolette perché, nonostante le sfumature nella sintassi, i componenti e il modo in cui sono impostati nel software sono fondamentalmente equivalenti, ad esempio, la nozione di porte e pin fa ancora riferimento a un terminale dal quale è possibile produrre / immettere digitalmente segnali.

Nello stesso vano discorso: ci sono microcontrollori che non sono programmati nel software o ci sarà sempre un livello software utilizzato per programmare uController? Se quest'ultimo, chi scrive / fornisce la documentazione per loro?


2
Il linguaggio di programmazione per Arduino è C ++ (non (solo) C) - o forse solo un sottoinsieme di C ++ (o persino Elaborazione ). Non è del tutto chiaro, ma è certamente più di C; ad esempio ha classi e operatore definibile dall'utente + = .
Peter Mortensen,

1
È C ++, si compila usando g ++ - avr. Tecnicamente sarebbe un'implementazione C ++ indipendente, e non include la libreria standard C ++ (a causa di cose come l'allocazione dinamica della memoria e le eccezioni necessarie). Puoi usare funzionalità linguistiche come classi e template, ho visto una sostituzione digitalWrite () basata su template che raggiunge le stesse prestazioni dell'accesso diretto ai registri, il metodo Arduino ha abbastanza il sovraccarico.
r_ahlskog,

1
La lingua è la stessa È l'API che è diversa. Se ti allontani dai microcontrollori e inizi a scrivere app desktop, incontrerai esattamente gli stessi problemi quando scrivi programmi C per Windows, Linux e Mac. Anche se usi puramente l'API POSIX (supportata da tutte e 3 le piattaforme), quando vuoi salvare le impostazioni / le preferenze dell'utente, otterrai comunque differenze specifiche della piattaforma.
Slebetman,

Risposte:


3

I microprocessori e i microcontrollori generalmente utilizzano un'architettura condivisa tra diverse linee di prodotti e produttori. Queste architetture in genere definiscono un set di comandi di basso livello ( set di istruzioni ) comune a tutte le implementazioni. Il compilatore AC o C ++ sarà in grado di generare eseguibile bytecode su tutti i processori ARM, ad esempio.

Tuttavia, l'architettura è solo metà dell'immagine. Poiché ci sono molti indirizzi di memoria specifici, periferiche a bordo, gestione della memoria e altri dettagli di implementazione che l'architettura non affronta

Un produttore o una terza parte in genere fornirà una raccolta di file di origine (un HDK ) che fornirà definizioni, mappature delle porte e codice di esempio. Tipicamente l'HDK è per C e C ++ . Tipicamente l'HDK avrà una scheda dimostrativa associata (pensate a $ 500 arduino). Spesso è necessario un lavoro di configurazione dettagliato per adattare la piattaforma di sviluppo / campione al dispositivo che si sta progettando

Arduino si basa sull'architettura AVR ed è principalmente supportato da Atmel. Arduino ha creato un bootloader della piattaforma e una libreria di funzioni e oggetti C ++ semplificati per l'utilizzo della piattaforma con il minimo sforzo. La piattaforma Arduino e IDE è progettata per gli appassionati con attrezzature minime. Prima dell'arduino, il PIC svolgeva un ruolo simile con un ambiente BASIC facile da usare ed economico.

In un ambiente professionale, in genere questo supporto è fornito dal fornitore / produttore o è affidato a terzi. Forniscono il codice e le intestazioni di basso livello e tu scrivi la tua applicazione con quell'HDK, nelle organizzazioni più grandi questo potrebbe essere fatto internamente. Vi è una tendenza recente per i produttori di creare un ecosistema API / software aperto attorno alla loro piattaforma che li rende facili da usare immediatamente come Arduino. Esistono ancora innumerevoli chip con pochissimo supporto per la programmazione e la maggior parte delle conoscenze sulla piattaforma è rinchiusa nel mondo aziendale.


14

La lingua in questo caso è esattamente la stessa. L'ambiente Arduino sembra avere alcune librerie extra (solo più codice C) che "avvolgono" l'accesso agli attuali registri hardware (DDRx, PORTx, INx, ecc.) Con funzioni leggermente più user-friendly. Ciò aumenta il sovraccarico (è necessario eseguire più istruzioni per la stessa operazione) ma aumenta la flessibilità in quanto è "semplice" scrivere un programma che utilizza solo queste chiamate, quindi eseguirne il retarget per un altro chip (diciamo, un arduino mega) e la libreria gestirà la mappatura corretta internamente.

Non ci sono davvero API 'standard' per un accesso di basso livello tra chip di diversi fornitori. Tuttavia, tutti gli accessi di basso livello vengono eseguiti allo stesso modo - legge e scrive su indirizzi di memoria fissi - quindi il metodo di accesso complessivo sarà simile tra parti diverse, solo i dettagli e i nomi saranno diversi. Forse uno fornirà solo file di intestazione con enormi elenchi di indirizzi di registro #defines trasmessi ai puntatori. O forse i file di intestazione useranno strutture per mantenere le cose organizzate con un po 'di una gerarchia. Alcuni produttori possono anche fornire API di livello superiore. Questo può essere molto utile per le periferiche che sono complesse e difficili da configurare. GPIO è molto semplice, ma qualcosa come un controller USB con supporto DMA potrebbe avere centinaia di registri.

Quindi la linea di fondo è sì, dovrai imparare alcuni nuovi nomi di registro, ma la lingua è ancora C ++ (o C, assembly, o forse qualcosa di più esoterico).


4
Arduino non è solo C (in realtà, C ++), ha un preprocessore che apporta alcune modifiche prima di inviarlo al compilatore C.
Nick Johnson,

In realtà, per Arduino, è più di C. È C ++ (o forse un sottoinsieme di C ++).
Peter Mortensen,

È solo C ++ nativo con librerie Arduino o qualcosa di più?
kayleeFrye_onDeck,

Apparentemente l'IDE di Arduino esegue un po 'di pre-elaborazione aggiuntiva rispetto al C ++ altrimenti standard. La maggior parte degli IDE non lo fa.
alex.forencich,

È fondamentalmente C ++ ma con main()predefinito per te. Invece ottieni due punti di ingresso: init()e loop()(correggimi se sbaglio ma ho toccato Arduino solo con un palo da 20 piedi)
slebetman

5

Stai confondendo microcontrollori e compilatori. Le lingue di alto livello in cui è possibile programmare qualsiasi micro in particolare dipendono da quali compilatori sono disponibili per quel micro.

A basso livello, il micro esegue le istruzioni della macchina, che un compilatore ricava per il file di testo che gli dai che consideri il "programma". Stai davvero specificando un po 'di logica da eseguire e il compilatore scopre come utilizzare le istruzioni macchina disponibili per implementare quella logica. In questo caso, ciò che programmate è una funzione del compilatore, non l'insieme di istruzioni native del micro.

È possibile programmare un micro specificando direttamente le istruzioni native. Questo viene fatto usando il linguaggio assembly. Come un compilatore, l'assemblatore è un traduttore che prende un file di testo che scrivi e di conseguenza produce istruzioni per la macchina. La differenza è che in questo caso si stanno specificando direttamente quelle istruzioni della macchina. A ogni istruzione viene assegnato un nome e si scrivono questi nomi anziché i codici binari, ma si stanno ancora specificando le istruzioni direttamente. L'assemblatore fa solo il grugnito di capire l'esatta codifica binaria di ogni istruzione dal nome e dalle opzioni che scrivi nel file di testo.

Mentre un linguaggio di alto livello può essere lo stesso su micro molto diversi, le istruzioni della macchina sono generalmente simili solo all'interno di una famiglia di micro correlati. Ad esempio, tutti i Microchip PIC 18 hanno lo stesso set di istruzioni (principalmente), che è diverso dal PIC 16 di base, e di nuovo diverso dalle parti a 16 bit come il PIC 24 e dsPIC 30 e 33.


1
L'assemblatore risolve anche le etichette per le istruzioni jump, che sono altamente soggette a errori quando eseguite manualmente.
Pete Becker,

2

Il linguaggio di programmazione è ancora C. Ma la libreria del produttore per accedere all'hardware differisce. Per quanto ne so non esiste uno standard, quindi ogni produttore ha la propria API. Se si desidera essere portatili tra produttori diversi, è possibile che si desideri introdurre la propria API astratta per accedere all'hardware con implementazioni specifiche che associano l'API ai metodi specifici del produttore.


In realtà, è più di C. È C ++ (o forse un sottoinsieme di C ++).
Peter Mortensen,

2

Altre risposte hanno fatto la distinzione tra linguaggi di alto livello (come C ++) e codice macchina, anche se non credo che ciò invalidi l'affermazione secondo cui a ciascun microcontrollore è associato un "linguaggio".

Le differenze nelle implementazioni linguistiche non sono abbastanza grandi per essere classificate come lingue diverse, anche se non esiterei a differenziarle in "dialetti". Qui possono esistere due livelli di cambiamento.

  1. Le librerie wrapper di alto livello potrebbero essere disponibili presso il produttore o terze parti
  2. Alcuni compilatori potrebbero non emettere codice conforme allo standard

Prendiamo questi punti osservando la piattaforma Arduino.

  • La community Arduino fornisce librerie C ++ fortemente astratte per i chip di architettura AVR. Queste librerie suggeriscono un flusso di controllo diverso da quello che ci si potrebbe aspettare da un tipico programma C ++ (ad esempio il nascondimento di main ()).
  • Sotto il cofano, Arduino compila il suo codice usando avr-gcc, che emette codice C / C ++. Le eccezioni non sono ben supportate sui chip AVR, tuttavia, e sono quasi sempre disabilitate. Mancando una funzionalità così ampia, il programma risultante potrebbe non funzionare come un normale programma C ++.

Sapendo questo, come decidi come programmare un microcontrollore arbitrario? Hai diverse opzioni:

  1. Cerca le librerie e gli IDE creati dalla community per il tuo chip specifico. I chip AVR sono talvolta sviluppati utilizzando solo C, ma il progetto Arduino offre un'esperienza più user-friendly per gli appassionati.
  2. Trova compilatori in grado di compilare per il tuo chip specifico. Con il compilatore appropriato, i fogli dati del tuo chip e un po 'di pazienza, sarai in grado di scrivere codice molto vicino al metal.

Per riferimento, ecco un elenco di backend supportati per GCC. Noterai che c'è supporto per ARM, AVR, MIPS e pochi altri.

Informazioni sui chip che non sono programmati con "software" ...

Potresti voler esaminare array di gate programmabili sul campo (FPGA)! Gli FPGA vengono controllati modificando i valori delle tabelle di ricerca per emulare le porte logiche. Questo non ha un modulo software corrispondente, di per sé, ma è ancora sviluppato usando linguaggi di descrizione hardware come VHDL e Verilog.


1

Guardo una scheda e vedo alcuni dispositivi a montaggio superficiale, alcuni resistori, condensatori e led. Ciò significa che, poiché una di quelle schede è una scheda video, tutte le schede con resistori e condensatori e più livelli e tracce sono tutte schede video? No.

Ecco un altro esempio, questa pagina web utilizza l'alfabeto inglese e le parole inglesi. Quindi il sito web del New York Times rende questo sito il New York Times? No, condividono solo lo stesso alfabeto e la stessa lingua, ma per il resto sono completamente diversi.

C è un linguaggio di programmazione generico che estrae le istruzioni impostate sotto di esso. Può essere utilizzato per bare metal, può essere utilizzato per creare sistemi operativi diversi e incompatibili tra loro, può essere utilizzato per creare videogiochi, ecc. Tutti utilizzano lo stesso linguaggio C di base, alcune funzioni e costruzioni C comuni, nonché chiamate di funzione che hanno creato specifiche per l'applicazione di destinazione. Per ciascuna di quelle piattaforme menzionate o altre potrebbe esserci una serie di funzioni che qualcuno ha scelto di creare. Proprio come una manciata di persone finora, incluso me stesso, ti hanno dato la stessa risposta ma l'hanno scritta in un modo diverso. Prendi 100 programmatori e isolali gli uni dagli altri e assegna loro un compito di programmazione per risolvere un problema particolare, senza limitare completamente la loro libertà di programmazione, e otterrai ovunque da 1 a 100 diverse, incompatibili tra loro soluzioni, probabilmente non 1 ma diversi temi comuni a seconda della loro formazione ed esperienza, quindi nomi di variabili e nomi di funzioni che come set sono probabilmente unici per ogni individuo. Prendi le stesse schede di cui stai già parlando e scoprirai che sicuramente ho il mio codice C che è incompatibile (con le funzioni di Arduino) per essere eseguito su di loro, come con molti altri, oltre che incompatibile con altre piattaforme. Questa è la bellezza della programmazione embedded bare metal, non sei vincolato in alcun modo, non devi vivere all'interno delle chiamate di libreria standard dei sistemi operativi o delle regole limitate di guis, ecc. Completa libertà. probabilmente non 1 ma diversi temi comuni a seconda della loro formazione ed esperienza, quindi nomi di variabili e nomi di funzioni che come set sono probabilmente unici per ogni individuo. Prendi le stesse schede di cui stai già parlando e scoprirai che sicuramente ho il mio codice C che è incompatibile (con le funzioni di Arduino) per essere eseguito su di loro, come con molti altri, oltre che incompatibile con altre piattaforme. Questa è la bellezza della programmazione embedded bare metal, non sei vincolato in alcun modo, non devi vivere all'interno delle chiamate di libreria standard dei sistemi operativi o delle regole limitate di guis, ecc. Completa libertà. probabilmente non 1 ma diversi temi comuni a seconda della loro formazione ed esperienza, quindi nomi di variabili e nomi di funzioni che come set sono probabilmente unici per ogni individuo. Prendi le stesse schede di cui stai già parlando e scoprirai che sicuramente ho il mio codice C che è incompatibile (con le funzioni di Arduino) per essere eseguito su di loro, come con molti altri, oltre che incompatibile con altre piattaforme. Questa è la bellezza della programmazione embedded bare metal, non sei vincolato in alcun modo, non devi vivere all'interno delle chiamate di libreria standard dei sistemi operativi o delle regole limitate di guis, ecc. Completa libertà. Prendi le stesse schede di cui stai già parlando e scoprirai che certamente ho il mio codice C che è incompatibile (con le funzioni di Arduino) per essere eseguito su di loro, come con molti altri, oltre che incompatibile con altre piattaforme. Questa è la bellezza della programmazione embedded bare metal, non sei vincolato in alcun modo, non devi vivere all'interno delle chiamate di libreria standard dei sistemi operativi o delle regole limitate di guis, ecc. Completa libertà. Prendi le stesse schede di cui stai già parlando e scoprirai che certamente ho il mio codice C che è incompatibile (con le funzioni di Arduino) per essere eseguito su di loro, come con molti altri, oltre che incompatibile con altre piattaforme. Questa è la bellezza della programmazione embedded bare metal, non sei vincolato in alcun modo, non devi vivere all'interno delle chiamate di libreria standard dei sistemi operativi o delle regole limitate di guis, ecc. Completa libertà.

Puoi scegliere, e un'alta percentuale di persone, di giocare nella sandbox di qualcun altro invece di crearne una tua, il che significa usare l'arduino gui e le loro librerie C.

Puoi prendere lo stesso PC ed eseguire diverse versioni di Windows, Linux, BSD e un elenco di altri sistemi operativi che a un certo livello utilizzano C ma le cui chiamate di funzione sono incompatibili tra loro. Lo stesso hardware e C incompatibile, che si estende a hardware diverso, stessa lingua, può avere un codice compatibile o incompatibile. La lingua non li rende in alcun modo compatibili.

C viene utilizzato su queste piattaforme incorporate perché questa è la pratica comune, non esiste un altro linguaggio in grado di sostituire C per questo. Il primo passo per un nuovo processore è ovviamente l'assemblaggio, quindi quasi sempre è il successivo C, quindi forse altri se è abbastanza potente per eseguire un sistema operativo (Linux, bsd, ecc.). C è stato inventato e sperava di risolvere il problema al momento del porting del codice su piattaforme diverse e fino a quando si dispone di un sistema operativo come nel caso di un compilatore compatibile C che crea codice che ESEGUE SU UN SISTEMA OPERATIVO, eseguirà il file C standard operazioni e stampa e cose del genere. Ma il bare metal è una storia diversa, non esiste un sistema operativo, spesso non esiste alcuna nozione di un file system né di un display, ma di solito esiste un compilatore C che alla radice trasforma C in un linguaggio di assemblaggio specifico di destinazione.


In realtà, per Arduino, è più di C. È C ++ (o forse un sottoinsieme di C ++).
Peter Mortensen,

1

Per rispondere alla tua seconda domanda, il termine "microcontrollore" implica che il chip ha una CPU e RAM (e probabilmente una ROM) a bordo. Tutti i microcontrollori eseguono software: ecco perché ci piacciono.

Approfondendo la prima domanda, nota che mentre (quasi?) Tutte le MCU hanno un compilatore C, il linguaggio C di base non supporta tutte le istruzioni su ogni processore. Ad esempio, C ha gli operatori di spostamento a sinistra / a destra, ma nessun operatore di rotazione a sinistra / a destra. Il sistema di puntatori di C non supporta naturalmente spazi di indirizzi dati e programma separati (come in alcune Harvard Architectures). C non ha un supporto SIMD diretto.

I compilatori hanno alcune opzioni per gestire queste funzionalità:

  1. Amplia la lingua di base, di solito con nuove parole chiave (ad es. Vicino e lontano per memorie paginate).

  2. Fornire funzioni intrinseche (ad es. __Ror () e __rol () per la rotazione).

  3. Lavorali nell'ottimizzatore in modo che le sequenze di operazioni C vengano compilate in un'istruzione efficiente (ad esempio un moltiplicare / accumulare).

  4. Ignorateli e fate scrivere all'utente il codice assembly se desiderano funzionalità non standard C.

Il livello successivo è costituito dai file di intestazione forniti dal produttore che definiscono principalmente tutti i registri per te. Potresti farli da soli, ma è un grande dolore a meno che tu non sia un esperto in quell'MCU.

Infine, ci sono funzioni di libreria fornite dal produttore, che gestiscono le cose basse come le scritture del registro per te.

Il tuo esempio unisce due livelli. DDR è una macro che fa riferimento a un registro. È implementato come accesso puntatore o funzione intrinseca del compilatore (dimentico quale). pinMode () è una funzione che scrive per te nel registro DDR.

Quando passi da una linea MCU a un'altra, dovrai imparare nuovi registri e nuove stranezze del compilatore. Se rimani all'interno della stessa azienda, potresti ottenere un'API simile. Diverse aziende non condividono le API; perché dovremmo aiutarti a passare ai nostri concorrenti? :-)


1

I microcontrollori hanno spesso diversi microcodici a livello hardware. Per salvarci dall'immissione del codice macchina (ovvero istruzioni sotto forma di numeri - ognuno che rappresenta il microcodice grezzo del microcontrollore) o nell'assemblatore simbolico (che fornisce un'etichetta mnemonica per ciascuna istruzione del codice macchina), vengono utilizzate lingue portatili di alto livello.

C e Forth sono progettati deliberatamente per essere facilmente trasportabili su diversi set di codici macchina.

Quindi se usi C su Arduino e C su Teensy, stai usando C in entrambi i casi.

Se avessi usato Forth su Arduino e Forth su Teensy, avresti usato Forth su entrambi i casi.

A volte, strutture hardware aggiuntive spingono la persona (o il gruppo) che esegue il porting della lingua sul nuovo hardware a scrivere del codice prefabbricato per consentire l'accesso alle nuove strutture della piattaforma hardware, senza dover scrivere molto codice di basso livello te stesso.

Queste librerie (in C) o dizionari (in Forth) possono contenere alcune funzioni o parole specifiche dell'hardware.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.