Caratteristiche di memoria dei sistemi
Home › Forum › Informazioni ambiente di sviluppo LogicLab › Caratteristiche di memoria dei sistemi
- Questo topic ha 13 risposte, 1 partecipante ed è stato aggiornato l'ultima volta 3 anni, 2 mesi fa da
Sergio Bertana.
-
AutorePost
-
Aprile 23, 2020 alle 3:08 pm #54823
Marcello
PartecipanteUltimamente ricevo una warning Spazio dati disponibile minore del 10% Il mio programma occupa:
92kB memoria programma
640B memoria tampone
14kB memoria datiIl Target selezionato è SlimLine Mps054 XTarget 12.0 Le caratteristiche riportate nelle istruzioni reperibili nel sito sono:
262kB memoria programma
6kB memoria tampone
20kB memoria datiLe caratteristiche indicate sulle risorse di LogicLab (vers. 3.1.0.0 – 5.12.0.13) sono:
256 kB memoria programma
6kB memoria tampone
12kB memoria datiQuelle riportate dal compilatore:
255kB memoria programma (max)
1kB memoria tampone
16 kB memoria dati.Quali sono quelle corrette? Ho pensato fosse un problema di aggiornamento e ho selezionato da “Progetto” -> “Aggiorna sistema corrente” ma il Risultato è che ora il compilatore mi da 791 errori per : Spazio vars Auto esaurito e non c’è verso di farlo compilare.
Che cosa è successo?
Come faccio a “dire” al compilatore i dati corretti?Aprile 23, 2020 alle 3:29 pm #54835Sergio Bertana
Amministratore del forumPer fare chiarezza la dimensione di memoria sui sistemi MPS054 dipende dal sistema, le versioni Lite dispongono di:
131 kB programma utente
12 kB RAM disponibili per dati utente di cui 6 kB sono ritentiviE’ possibile acquistare una opzione per estendere le dimensioni di memoria come nelle versioni Full che dispongono di:
262 kB programma utente
20 kB RAM disponibili per dati utente di cui 6 kB sono ritentiviCollegandoti ad un sistema Full con LogicLab ecco il report di memoria:
Used code size: 5E50h (23 KByte) Free code space: 3A1A0h (232 KByte) Total code space:3FFF0h (255 KByte) Used data space: 695h (1 KByte) Free data space: 396Fh (14 KByte) Total data space: 4004h (16 KByte) Used retain data space: 0h (0 KByte) Free retain data space: 3E8h (0 KByte) Total retain data space: 3E8h (0 KByte)
Come vedi il total code space è 3FFF0h pari a 262128 bytes, total data space è 4004h pari a 16388 bytes a cui devi sommare i 4096 bytes della DB100 per un totale di 20484 bytes.
Per quanto riguarda l’area retain abbiamo 3E8h pari a 1000 bytes di area retain a cui occorre sommare i 2048 bytes dell’area retain della DB100 (Da DB100.2048 a DB100.4096). Siccome l’area retain viene salvata 2 volte in FRAM ecco il risultato dei 6 kB.
Ma a parte questi discorsi teorici, il tuo problema è che probabilmente ti sei connesso ad un sistema Lite ed hai acquisito dal sistema valori di memoria che sono la metà di quelli del sistema Full ed il tuo programma necessita di più memoria dati. O come dici tu hai eseguito il comando Refresh current target che assegna i valori del sistema Lite.
Soluzione al problema è connetterti ad un sistema Full (O ad un sistema Lite con opzione installata) ed eseguire dal menù On-line il comando Force target image upload. In questo modo carichi dal sistema il file con estensione imgx che contiene i dati corretti.
Gennaio 19, 2022 alle 5:46 pm #63394Rubox
PartecipanteMi sto ponendo domande su com’è meglio utilizzare la memoria per i dati di un sistema Slimline MPS054.
Avendo più POU che magari definiscono lo stesso FB, oppure delle variabili dello stesso tipo, conviene definirne una a livello globale che poi si andrà a valorizzare nel POU, oppure conviene definirne una per ogni POU?Ad esempio il blocco funzione che restituisce data e ora di sistema, gli stessi blocchi FIFOFile che utilizzo in più parti del programma (qui utilizzerei un solo FB, ma ovviamente tanti indici quanti sono i FIFOFile) possono essere definiti una volta a livello globale e poi utilizzati?
Immagino che i blocchi HTTPClient, ModbusMaster e tutti i blocchi che inviano qualcosa e aspettano la risposta debbano invece essere “univoci” all’interno del POU (tutte le comunicazioni di rete).
Gennaio 19, 2022 alle 5:53 pm #63398Sergio Bertana
Amministratore del forumOgni volta che istanzi variabili o FB viene utilizzata memoria, quindi è certo che se possibile è meglio avere una sola istanza globale utilizzata in vari POUs. Ma occorre fare attenzione se è possibile farlo.
Và benissimo farlo per esempio per il FB SysETimeToDate, definendolo globale potrai da ogni POU riferirti ai suoi membri per avere i dati che ti servono. Lo faccio normalmente per i FB JSONEncode e JSONDecode, se guardi i miei esempi REST o HTTP vedrai questa tecnica.
Ma non puoi usarlo per il FB FIFOFile, perchè al di là degli indici ogni FB lavora con il file definito (Oppure memoria) e tiene traccia di dati riferiti allo stesso al suo interno.
Gennaio 24, 2022 alle 9:13 am #63404Rubox
PartecipanteQuindi avendo la necessità di due buffer di 6000 caratteri per spedire i valori in una mail conviene allocare memoria con SysRMalloc all’inizio del POU dove viene generato il corpo della email, inserire il tutto nel file FIFO e liberare la memoria allocata ad ogni ciclo di scrittura?
A questo punto invece di definire un buffer a livello locale nello spazio di memoria dei dati è meglio allocarlo quando serve e liberarlo?
La memoria di sistema a cui attinge SysRMalloc la trovo indicata sul datasheet sotto quale voce?Oppure come faccio per sapere quanta memoria c’è?
Gennaio 24, 2022 alle 9:23 am #63410Sergio Bertana
Amministratore del forumCerto quando è possibile conviene sempre allocare memoria con SysRMalloc, puoi tenere la memoria allocata per tutto il tempo che ti serve e poi liberarla con SysRMFree. Occorre sempre controllare che SysRMalloc sia riuscito ad allocare il buffer richiesto prima di utilizzarlo.
Attenzione all’utilizzo della memoria allocata, la funzione non ritorna direttamene un puntatore come invece fa la SysMAlloc, ma ritorna l’indirizzo della memoria allocata in un buffer. Occorre sempre fare riferimento al valore nel buffer perchè il sistema operativo sposta automaticamente il blocco di memoria per ottimizzarne l’allocazione. In pratica il buffer allocato si sposta di posizione a tua insaputa quindi l’unico punto in cui è noto l’indsirizzo di allocazione è nel buffer fornito come parametro alla funzione.
La memoria disponibile alla funzione dipende dalla versione ddel sistema operativo, il comando da Telnet RMStats ne riporta indicazione.
[Admin]> RMStats Memory size......... 36000 Act free memory..... 31100
Come vedi in questo caso lo spazio totale è di 36KBytes e lo spazio libero è di 31KBytes.
Gennaio 25, 2022 alle 8:16 am #63457Rubox
PartecipanteGrazie, non avevo visto la sezione “Note” sulla pagina del manuale online.
L’esecuzione della funzione SysRMalloc è “immediata”? Nel senso: quando richiamo la funzione ottengo subito lo spazio di memoria (o la mancanza di spazio) nello stesso loop di esecuzione, oppure la risposta del sistema operativo può arrivare anche nei loop successivi? (un po’ come succede con le comunicazioni di rete che impiegano del tempo per esser stabilite).
Avendo bisogno di un buffer in quasi tutti i POU è meglio allocarne uno con SysRMalloc nella task boot e poi utilizzarlo nelle varie POU, oppure allocare e liberare a inizio e fine di ogni singolo POU?
Gennaio 25, 2022 alle 8:25 am #63464Sergio Bertana
Amministratore del forumTutte le funzioni non avendo la possibilità di gestire variabili statiche al loro interno tornano immediatamente il risultato. Solo i FB possono gestire operazioni per la cui esecuzione occorrono più cicli di programma.
La SysRMAlloc è una funzione quindi ritorna immediatamente TRUE nel caso sia riuscita ad allocare il buffer richiesto, FALSE in caso contrario.
Certo se vuoi puoi allocare un buffer con la SysRMAlloc e poi utilizzarlo in tutti i POUs, ma attenzione la task di Boot è eseguita una sola volta, e anche se probabilmente si riuscirà ad allocare la memoria, nel caso non si riuscisse non avresti il buffer disponibile.
E’ meglio invece allocarlo in un POU eseguito in Back e prima di utilizzarlo controllare se è stato allocato.
Gennaio 25, 2022 alle 5:00 pm #63467Rubox
PartecipanteAdesso il mio dubbio è questo: se non c’è spazio per i buffer rischio che determinate azioni non siano mai eseguite.
C’è un comando che fornisca le stesse informazioni della console nel programma?
In questo modo si potrebbe verificare quanta memoria è possibile richiedere e adeguare il comportamento. Per un corpo di una email si potrebbe optare per un messaggio più breve, ad esempio.
Gennaio 25, 2022 alle 5:07 pm #63481Sergio Bertana
Amministratore del forumSi certo questa è una possibilità, se cerchi di allocare uno spazio e non hai mai memoria disponibile tutte le operazioni legate al buffer di memoria sono bloccate.
Il verificare con un comando la disponibilità di spazio non è possibile e comunque siccome l’allocazione potrebbe essere richiesta da altre task corri il rischio che il comando dia una disponibilità che poi un’attimo dopo non sia più vera.
La soluzione migliore è di provare ad allocare lo spazio che ti serve, se dopo un tempo non riesci provare ad allocare uno spazio minore fino a quando l’allocazione riesce. Così sei certo che hai effettivamente la memoria disponibile.
Se poi vuoi cimentarti nella richiesta della memoria disponibile puoi utilizzare il FB CLIClient per eseguire il comando RMStats,l’esempio è già pronto nella pagina del manuale.
Febbraio 16, 2022 alle 3:10 pm #63912George
PartecipanteI have a MPS056A320 (SFW198E010) and compiling my program i get:
Used code size: 9180h ( 36 KByte) Free code space: 16E70h ( 91 KByte) Total code space: 1FFF0h ( 127 KByte) Used data space: 1E88h ( 7 KByte) Free data space: 178h ( 0 KByte) Total data space: 2000h ( 8 KByte) Used retain data space: 214h ( 0 KByte) Free retain data space: 1D4h ( 0 KByte) Total retain data space: 3E8h ( 0 KByte)
In the characteristics of the CPU i see the data memory size is 20Kb RAM which is different from 8KBytes that i get. I have already executed the command “Force target image upload”.
Febbraio 16, 2022 alle 3:15 pm #63927Sergio Bertana
Amministratore del forumUnfortunately there’s an error on the product data. The MPS056A320 has only 12Kb of data memory.
LogicLab report 8Kb because there’s 8Kb of memory available for the LogicLab’s linker and additional 4Kb are for the DB100 area. This area is preallocated in the system and it’s not reported by LogicLab.
But remind over the 12Kb there’s also additional 4Kb that can be used by allocating buffers on it with the SysMAlloc function. And up to 32Kb that can be used by allocating buffers on it with the SysRMAlloc function.
It’s possible to buy an option that extends memory up to 255Kb of code and 20Kb of data memory (16Kb for LogicLab’s linker and 4Kb for DB100 area). The availbale area for the malloc functions still remain unchanged.
Febbraio 17, 2022 alle 3:17 pm #63935George
PartecipanteSo, the information (20 kB RAM user data) I read in product characteristics is not valid?
Is there the 20Kb option available?
Febbraio 17, 2022 alle 3:21 pm #63940Sergio Bertana
Amministratore del forumYes it’s true there’s a mismatch in the product data.
To extend the data memory to 20 Kb it’s possible to buy the CPU program code extension option (See here).
-
AutorePost
- Devi essere connesso per rispondere a questo topic.