B4R Question Occupation of Variables in RAM memory

Gerardo Tenreiro

Active Member
Licensed User
Hello Group

I have an application with a large structure that stores information in RAM for a period of about 4 seconds. I want to store the information at intervals of 20 to 40 ms.
The data structure is as follows:
Type D_Logger1 (P_Encoder As Int, _ ' Posicion del Encoder
P_Encoder_F As Int, _ ' Posicion del Encoder Filtrada
P_Puerta As Int , _ ' Posicion de la Puerta en %
C_Velocidad As Int, _ ' Consigna de Velocidad al Accionamiento
Intensidad_M As Int, _ ' Intensidad Consumida por el Motor
P_Abierta As Boolean, _ ' Indica Puerta abierta
P_Cerrada As Boolean, _ ' Indica Puerta Cerrada
P_Parada As Boolean, _ ' Indica Puerta Parada
P_Abriendo As Boolean, _ ' Indica Puerta Abriendo
P_Cerrando As Boolean, _ ' Indica Puerta Cerrando
O_Freno As Boolean, _ ' Indica la Orden al Freno
O_Abrir As Boolean, _ ' Indica la Orden de Abrir al Accionamiento
O_Cerrar As Boolean, _ ' Indica la Orden Cerrar al Accionamiento
Foto_Celula As Boolean, _ ' Estado de la foto celula
Secuencia As Byte, _ ' Numero de Secuencia
PRG_P_A As Boolean, _ ' El programa pide Abrir la puerta
PRG_P_C As Boolean, _ ' El programa pide Cerrar la Puerta
CP_Encoder As Byte, _ ' Calidad de la Comunicacion con el Encoder en el ultimo Segundo
CT_Encoder As Byte, _ ' Calidad de la Comunicacion con el Encoder Total
AOM As Boolean, _ ' Indica Alguna Orden de Movimiento a la Puerta
Contactor_A As Boolean, _ ' Orden al Contactor Abrir
Contactor_C As Boolean, _ ' Orden al Contactor Cerrar
Emergencia_Ok As Boolean, _ ' Estado General Parada de Emergencia
PLC_Run As Boolean, _ ' Indica si el PLC esta en RUN
Modo_M As Byte, _ ' Indica el Modo de maniobra de la Puerta
E00 As Boolean, _ ' Estado de la Entrada E00
E01 As Boolean, _ ' Estado de la Entrada E01
PE_Encoder As Boolean, _ ' Estado Parada de Emergencia del Encoder
Fallo_T_FT As Boolean, _ ' Indica Fallo en el Test de la Fotocelula
F_C_E As Boolean, _ ' Fallo de Comunicacion con el Encoder
Memo_E_NM As Boolean, _ ' Memoria Fallo el Encoder no se mueve
PE_Ext As Boolean, _ ' Estado Parada de Emergencia Exterior
VF_Fallo As Boolean, _ ' Estado del Fallo del Accionamiento
E11 As Boolean, _ ' Estado de la Entrada E11
E12 As Boolean, _ ' Estado de la Entrada E12
E13 As Boolean, _ ' Estado de la Entrada E13
E14 As Boolean, _ ' Estado de la Entrada E14
E15 As Boolean, _ ' Estado de la Entrada E15
E16 As Boolean, _ ' Estado de la Entrada E16
E06 As Boolean, _ ' Estado de la Entrada E06
E10 As Boolean _ ' Estado de la Entrada E10
)

Public Logger1(400) As D_Logger1 ' Datos del Logger

The problem I'm seeing is that the BOOLEAN variables take up 8 bits instead of 1 bit. They should take up one bit since a BOOLEAN is either a 1 or a 0.
How can I find out how much the variables take up in memory?

Thank you very much.
 

Daestrum

Expert
Licensed User
Longtime User
Maybe look at putting your boolean values in a C struct, where they can be 1 bit
B4X:
struct Flags {
    unsigned char flag1 : 1;
    unsigned char flag2 : 1;
    unsigned char flag3 : 1;
    unsigned char flag4 : 1;
    unsigned char flag5 : 1;
    unsigned char flag6 : 1;
    unsigned char flag7 : 1;
    unsigned char flag8 : 1;
 };
 
Upvote 0

Gerardo Tenreiro

Active Member
Licensed User
I changed the structure from BOOLEAN to BYTE by grouping 8 BOOLEANs into a BYTE, and the size improved considerably.
The structure is now as follows:
Type D_Logger1 (P_Encoder As Int, _ ' Posicion del Encoder
P_Encoder_F As Int, _ ' Posicion del Encoder Filtrada
P_Puerta As Int, _ ' Posicion de la Puerta en %
C_Velocidad As Int, _ ' Consigna de Velocidad al Accionamiento
Intensidad_M As Int, _ ' Intensidad Consumida por el Motor
Secuencia As Byte, _ ' Numero de Secuencia
CP_Encoder As Byte, _ ' Calidad de la Comunicacion con el Encoder en el ultimo Segundo
CT_Encoder As Byte, _ ' Calidad de la Comunicacion con el Encoder Total
Modo_M As Byte, _ ' Indica el Modo de maniobra de la Puerta
SG1 As Byte, _ ' Grupo 1 de Variables
SG2 As Byte, _ ' Grupo 2 de Variables
SG3 As Byte, _ ' Grupo 3 de Variables
SG4 As Byte _ ' Grupo 4 de Variables
)
' SG1
' P_Abierta As Boolean, _ ' Indica Puerta abierta
' P_Cerrada As Boolean, _ ' Indica Puerta Cerrada
' P_Parada As Boolean, _ ' Indica Puerta Parada
' P_Abriendo As Boolean, _ ' Indica Puerta Abriendo
' P_Cerrando As Boolean, _ ' Indica Puerta Cerrando
' O_Freno As Boolean, _ ' Indica la Orden al Freno
' O_Abrir As Boolean, _ ' Indica la Orden de Abrir al Accionamiento
' O_Cerrar As Boolean, _ ' Indica la Orden Cerrar al Accionamiento

' SG2
' Foto_Celula As Boolean, _ ' Estado de la foto celula
' PRG_P_A As Boolean, _ ' El programa pide Abrir la puerta
' PRG_P_C As Boolean, _ ' El programa pide Cerrar la Puerta
' AOM As Boolean, _ ' Indica Alguna Orden de Movimiento a la Puerta
' Contactor_A As Boolean, _ ' Orden al Contactor Abrir
' Contactor_C As Boolean, _ ' Orden al Contactor Cerrar
' Emergencia_Ok As Boolean, _ ' Estado General Parada de Emergencia
' PLC_Run As Boolean, _ ' Indica si el PLC esta en RUN

' SG3
' E00 As Boolean, _ ' Estado de la Entrada E00
' E01 As Boolean, _ ' Estado de la Entrada E01
' PE_Encoder As Boolean, _ ' Estado Parada de Emergencia del Encoder
' Fallo_T_FT As Boolean, _ ' Indica Fallo en el Test de la Fotocelula
' F_C_E As Boolean, _ ' Fallo de Comunicacion con el Encoder
' Memo_E_NM As Boolean, _ ' Memoria Fallo el Encoder no se mueve
' PE_Ext As Boolean, _ ' Estado Parada de Emergencia Exterior
' VF_Fallo As Boolean, _ ' Estado del Fallo del Accionamiento
'
' SG4
' E11 As Boolean, _ ' Estado de la Entrada E11
' E12 As Boolean, _ ' Estado de la Entrada E12
' E13 As Boolean, _ ' Estado de la Entrada E13
' E14 As Boolean, _ ' Estado de la Entrada E14
' E15 As Boolean, _ ' Estado de la Entrada E15
' E16 As Boolean, _ ' Estado de la Entrada E16
' E06 As Boolean, _ ' Estado de la Entrada E06
' E10 As Boolean _ ' Estado de la Entrada E10


Public Logger1(800) As D_Logger1 ' Datos del Logger

Now I need to perform the BOOLEAN to BYTE conversion steps, but it's a workaround.

I still don't know how to measure the occlusion of variables in the processor's RAM. I don't know if B4R has any instructions that allow this.

Thank you very much.
 
Upvote 0

Gerardo Tenreiro

Active Member
Licensed User
AvailableRAM
StackBufferUsage
This is what I'm using, but the results are confusing. The ratio of RAM used isn't linear with the number of variables I declare.
Also, in the application, the "AvailableRAM" result changes depending on the time.

I've attached a screenshot of the LOGGER where I see the results.

.Dif.Segundo = -01
Fecha 24/05/2025 20:34:37.RAM Libre =024256.Pila Utilizada 0003831
CNT_NIST=13
20:35:03 RAM Libre =024668.Pila Utilizada 000035
Radio en modo BlueTooth
Nombre BT=TEST_BT.Reinicia BT. BT Correcto
20:35:33 RAM Libre =024668.Pila Utilizada 000035
Radio en modo WIFI
Wifi Conectada ... T= 3526 ms
Mi IP es:192.168.0.136
Inicio Conexion a NIST
Conectando al Servidor NIST "time.nist.gov"
Error Conexion a NIST...
20:36:03 RAM Libre =024188.Pila Utilizada 000035
Radio en modo BlueTooth
Nombre BT=TEST_BT.Reinicia BT. BT Correcto
20:36:33 RAM Libre =024188.Pila Utilizada 000035
Radio en modo WIFI
Wifi Conectada ... T= 3536 ms
Mi IP es:192.168.0.136
Inicio Conexion a NIST
Conectando al Servidor NIST "time.nist.gov"
Entrada Datos del NIST
Fecha 24/05/2025 20:36:36.RAM Libre =024112.Pila Utilizada 0003431
CNT_NIST=14

Thank you very much.
 
Upvote 0
Top