Multicore Permalink

Con la funzione CODESYS Multicore, i task IEC possono essere assegnati a core CPU dedicati, tenendo conto del numero di core CPU acquisiti. Questo può portare a un miglioramento delle prestazioni.

  • Il task IEC viene eseguito su tutti i core della CPU:

    Il sistema operativo assume il controllo della distribuzione di uno o più compiti di un gruppo sui core della CPU.

Quando i compiti IEC sono distribuiti sui core della CPU, si verificano alcuni cambiamenti nel comportamento del programma IEC, che devono essere presi in considerazione.

  • L'elaborazione dei compiti IEC per priorità non è più scontata. Vengono elaborati in base alla priorità solo se i task sono raggruppati in un unico core della CPU.

  • La coerenza del ciclo dei dati nel task IEC con la priorità più alta non è più un dato di fatto. Pertanto, i dati devono essere copiati localmente all'inizio del ciclo del task IEC se i valori non devono cambiare durante il ciclo.

  • Per tutti i compiti, esiste un'immagine di processo condivisa da cui i compiti operano. La funzione ‎ReadInputs()‎ viene chiamata all'inizio di ogni attività e la funzione ‎WriteOutputs()‎ viene chiamata alla fine. Di conseguenza, il modello IPO si applica a ogni singolo compito. Queste funzioni leggono e scrivono sull'immagine del processo condiviso. Anche l'immagine del processo viene scritta fisicamente e i pacchetti vengono trasmessi solo quando viene richiamato il task del ciclo del bus. Tuttavia, il task del ciclo del bus attende per ogni chiamata di ‎WriteOutputs‎ e ‎ReadInputs‎ dei task. Ciò garantisce la coerenza dei dati all'interno del task del ciclo bus.

    • Le uscite possono essere assegnate solo a un compito.

    • Gli ingressi possono essere assegnati a più compiti, ma l'accesso diretto deve essere evitato. Gli input devono essere scritti nelle variabili locali del task mediante operazioni atomiche.

    • Un secondo task, che aggiorna l'immagine del processo con ‎ReadInputs()‎ in parallelo al primo task, aggiorna anche gli input del primo task mentre è in esecuzione.

    • Di conseguenza, la coerenza dei dati di un task è garantita solo su singoli core per il task a priorità più alta.

    Nota: È possibile impostare il task ciclo bus nella scheda «PLC Settings».

    Nota: È possibile visualizzare l'accesso I/O sulla scheda: Distribuzione dei compiti.

  • Per i contatori coerenti (incrementatore, decrementatore), si deve sempre utilizzare la funzione di libreria esterna atomica ‎SysCpuAtomicAdd()‎ (per maggiori dettagli, vedere ‎SysCpuHandling.library‎).

Coerenza dei dati

Coerenza dei dati

  • L'accesso ai bit (tipo di dati ‎BIT‎) non viene elaborato in modo coerente (atomico) sulle CPU multicore nel programma IEC. A questo scopo si consiglia di utilizzare la funzione di libreria esterna ‎SysCpuTestAndSetBit()‎. (Per maggiori dettagli, vedere: ‎SysCpuHandling.library‎)

  • I tipi di dati semplici fino a una larghezza di 32 bit (‎BOOL, BYTE, WORD/INT, DWORD/DINT‎, ecc.) vengono elaborati in modo coerente (atomico) nel programma IEC anche su CPU multicore.

  • I tipi di dati a 64 bit (‎LINT, LWORD‎, e ‎LREAL‎) vengono elaborati in modo coerente (atomico) nel programma IEC solo su sistemi a 64 bit e sistemi multicore. Per farlo, non è necessario prendere alcuna precauzione.

  • Per accedere a tipi di dati complessi (‎STRING, FB, STRUCT‎, e ‎ARRAY‎), è necessario provvedere autonomamente alla sincronizzazione/consistenza.

  • Nella configurazione del task, nella scheda Uso delle variabili, è possibile definire se una variabile in un task IEC ha accesso in lettura o in scrittura.

  • Sui sistemi multicore può verificarsi un "effetto di riordino della memoria". Per ulteriori informazioni, vedere: Operatore IEC: ‎__MemoryBarrier()‎.