Speicheroptimierung BIT statt BOOLEAN

  • 1
  • 2
  • Page 1 of 2
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Speicheroptimierung BIT statt BOOLEAN

 · 
Posted: 24.03.2018 - 22:42  ·  #1
Hallo rolf,

der Compiler verschwendet ja leider immer ein komplettes Byte für einen BOOL.

Wäre sowas als Type/Record möglich?

Code

TPVSIO_OUTPUT2 = record
          Buffer1       : byte;
          QK00[@Buffer1, 0] : bit;
          QK01[@Buffer1, 1] : bit;
          QK02[@Buffer1, 2] : bit;
          QK03[@Buffer1, 3] : bit;
          QK04[@Buffer1, 4] : bit;
          QK05[@Buffer1, 5] : bit;
          QK06[@Buffer1, 6] : bit;
          QK07[@Buffer1, 7] : bit;
          Buffer2       : byte;
          QK10[@Buffer2, 0] : bit;
          QK11[@Buffer2, 1] : bit;
          QK12[@Buffer2, 2] : bit;
          QK13[@Buffer2, 3] : bit;
          QK14[@Buffer2, 4] : bit;
          QK15[@Buffer2, 5] : bit;
          QK16[@Buffer2, 6] : bit;
          QK17[@Buffer2, 7] : bit;
         end;


Bei VARs kann ich es ja so machen, aber bei Types und Records :-(

BITs lassen sich ja an vielen Stellen wie BOOLs ohne Probleme abfragen und setzen, Ich denke man könnte hier schon einiges an Speicher sparen. Oder gibt es da einen anderen Lösungsansatz?

Auch dieser Weg geht mit dem Compiler leider nicht:

Code
TYPE
TPVSIO_OUTPUT2 = record
          Buffer1       : byte;
          Buffer2       : byte;
         end;

VAR
 OUT : TPVSIO_OUTPUT2;
 QK00[@OUT.Buffer1, 0] : bit;
 QK01[@OUT.Buffer1, 1] : bit;
 QK02[@OUT.Buffer1, 2] : bit;
 QK03[@OUT.Buffer1, 3] : bit;
...


Gruß
Thorsten
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Speicheroptimierung BIT statt BOOLEAN

 · 
Posted: 25.03.2018 - 14:51  ·  #2
Hallo Thorsten,

der 8051 und der AVR können in begrenzten Bereichen Bits adressieren.
Aber bei allen Compilern/Sprachen ist ein Boolean ein byte.

Der AVRco bietet aber Bitsets an. Hier können praktisch 8 quasi Boolean
in ein Byte gepackt werden.

rolf
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: Speicheroptimierung BIT statt BOOLEAN

 · 
Posted: 25.03.2018 - 15:14  ·  #3
Hallo Thorsten,

hast du dir das Compiler-Manual - Bit-Verarbeitung mal durchgelesen? Interessante Lektüre :) .... Hab ich mir auch erst rein gezogen.

Harry
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Speicheroptimierung BIT statt BOOLEAN

 · 
Posted: 25.03.2018 - 15:46  ·  #4
Quote by rh

Der AVRco bietet aber Bitsets an. Hier können praktisch 8 quasi Boolean
in ein Byte gepackt werden.


Hallo rolf,

das mit den BitSets finde ich beim programmieren zu unhandlich, wenn es nur ein paar sind benutze ich diese auch. Auch die Funktion Byte.Bit usw. nutze ich, mir geht es aber um die schnelle übersichtliche Programmierung.

Wenn ich eine Struktur / Record habe, dann kann ich einfach, bei eingabe der VAR..... in der Liste die Werte beim Programmieren auswählen. Diesen Komfort würde ich ja dann komplett verwerfen um Speicher zu sparen. :-(

Ich habe einige Strukturen, wie:
Code
TPVSTuerM = record
    M_Freigabe_FTSS      : boolean;
    M_Freigabe_ZKS      :  boolean;
    M_Freigabe_GMS      :  boolean;
    M_Freigabe_FTTT      :  boolean;
    M_Freigabe_Nutzer    :  boolean;
    M_SofortAlarm_Blinken    :  boolean;
    M_Timer_Bruecke          :  boolean;
    M_Timer_Bruecke_Reset    :  boolean;
    M_Voralarm      :  boolean;
    M_Selbsthaltung      :  boolean;
    M_Hupe_Timer      :  boolean;
    M_Alarm        :  boolean;
    M_TimerSelbstReset           :  boolean;
    M_Berechtigt      :  boolean;  (* Merker für Zeitüberschreitungsalarm*)
    M_BOOL_Timer_Auf    :  boolean;
    M_Oeffnung      :  boolean;
    M_Timer_NutzerEnde    :  boolean;
    M_Timer_Bruecke_Reset_ZWP  :  boolean;
    Temp_Zeitwert_Stoerung    :  integer;
    M_Freigabe      :  boolean;
    M_FWSS_Wartezeit    :  boolean;
    M_BlockOhneZeit      :  boolean;
    RT_Rueckmeldekontakt_X007  :  boolean;
    FT_Rueckmeldekontakt_X007  :  boolean;
    RT_Reset_X000      :  boolean;
    M_AHM_Punkt      :  boolean;
    M_PotiReset      :  boolean;
    FT_RKEO_X11      :  boolean;
    M_PulsStartVoralarm    :  boolean;
    FT_NotAufUeberw_GND_X005  :  boolean;
    M_ResetStart      :  boolean;
    M_SofortAlarm_Aktiv    :  boolean;
    M_RWA_Alarm      :  boolean;
    FT_FuncRWA      :  boolean;
    M_FreigabeInput      :  boolean;
    M_ExtAlarmAktiv      :  boolean;
    RT_M_ExtAlarmAktiv    :  boolean;
    M_NutzerAlarmAktiv    :  boolean;
    RT_M_NutzerAlarmAktiv    :  boolean;
    RTM_Timer_Bruecke    :  boolean;
    M_SelbsthaltVerriegelung  :  boolean;
    M_RKMAlarm      :  boolean;
    M_Testbetrieb      :  boolean;
    M_PulsStart      :  boolean;
    M_StartTon1      :  boolean;
    M_Nutzer_Blinken    :  boolean;
    M_Alarm_Nutzer_a_Y105         :  boolean;
    M_RadarFunktionAktiv    :  boolean;
    M_AktiviereKurzzeit    :  boolean;
    M_KurzStart      :  boolean;
    M_DauerAus      :  boolean;
    M_ResetFlipFlop      :  boolean;
    M_Dauerfreig      :  boolean;
    M_GMSStack      :  boolean;
                M_ZKSStack      :  boolean;
    M_hGMSStack      :  boolean;   // Hilfsmerker
                M_hZKSStack      :  boolean;   // Hilfsmerker
    M_TofSperre      :  boolean;
    M_RadarTuerAuf      :  boolean;
    M_AnsteuerungMotorRadar    :  boolean;
    M_RadarNAlarmAktiv    :  boolean;
    M_UmschaltRadar      :  boolean;
    M_KurzZeitRadar      :  boolean;
    M_DoorNotOpen      :  boolean;
                M_FuncNetzstoerung     :  boolean;
                M_FuncStoerung             :  boolean;
                M_FuncRWA                  :  boolean;
                M_FuncGMS                       :  boolean;
                M_FuncBWM                       :  boolean;
                M_FuncRMKEOE         :  boolean;
                M_FuncSchleuse         :  boolean;
                M_FuncAlarm         :  boolean;
                M_FuncSabo          :  boolean;
                M_FuncGMSDauer         :  boolean;
                M_FuncNutzerDauer      :  boolean;
                M_FlipFlopFTSS      :  boolean;
                M_FlipFlopNutzer      :  boolean;
                (* Funktionszustände Ausgänge *)
                OUT_FuncStoerungVerz       :  boolean;
                OUT_FuncStoerung           :  boolean;
                OUT_FuncAnstMotor      :  boolean;
                OUT_FuncArbstrEOeff      :  boolean;
                OUT_FuncMotorschloss     :  boolean;
                OUT_FuncAHM              :  boolean;
                OUT_FuncWatchDog      :  boolean;
                OUT_FuncSchleuse     :  boolean;
                OUT_FuncAlarm       :  boolean;
                OUT_FuncSabo        :  boolean;
                OUT_LEDSonder1       :  boolean;
                OUT_LEDSonder2      :  boolean;
                M_PVS_Stromstoss2_1_Q           :       boolean;
                M_PVS_TOF_Kurz01_3_DIF          :       boolean;
                M_PVS_TOF_Kurz01_3_DIFN         :       boolean;
                M_WarteRKHM                     :       boolean;
    M_Temp_Var                      :  word;
                M_PVS_RTRG_FWSSWarte            :       boolean;
                (* Fehlermerker *)
                M_err_Netz      :       boolean;   (*Fehler Netz*)
                M_err_Akku      :       boolean;   (*Fehler Akku*)
                M_err_Sicherung      :       boolean;   (*Fehler Sicherung*)
                M_err_Erdschluss    :       boolean;   (*Fehler Erdschluss*)
                M_err_Kx24V      :       boolean;   (*Fehler K1_24V*)
                M_err_KxGND      :       boolean;   (*Fehler K2_GND*)
                M_err_NotGND      :       boolean;   (*Fehler NotGND*)
                M_err_Not24V                  :       boolean;   (*Fehler Not24V*)
                (* Eingangs Zuordnung *)
                M_IN11_VKE                      :       boolean;
                M_IN12_VKE                      :       boolean;
                M_IN13_VKE                      :       boolean;
                M_IN14_VKE                      :       boolean;
                M_IN15_VKE                      :       boolean;
                M_IN16_VKE                      :       boolean;
                M_IN17_VKE                      :       boolean;
                M_IN18_VKE                      :       boolean;

  end;

Da kommen schon einige Byte zusammen :-(

Diese Struktur gibt mir beim programmieren schnelle zugriffe auf die Werte und ich kann die komplette Struktur in einen Rutsch per RS485 und USB übertragen, ohne diese zusätzlich aufzuarbeiten.

Wenn Du einen sinnvollen Lösungsvorschlag hast, wie ich hier die einfache Auswahl weiterhin beim arbeiten in der IDE habe, würde ich auch auf diese Bitsets ändern :-D

@Harry; Ja, ich kenne das im Handbuch mit der Bit-Adressierung, habe ich auch schon bei meinen alten 8051 Projekten genutzt.

Thorsten
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Speicheroptimierung BIT statt BOOLEAN

 · 
Posted: 25.03.2018 - 18:01  ·  #5
Hallo Thorsten,

ausser Bitsets sehe ich keine Lösung zum shrinken von Boolean, sorry.

rolf
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Speicheroptimierung BIT statt BOOLEAN

 · 
Posted: 26.03.2018 - 10:11  ·  #6
Hallo rolf,

wäre sowas evtl. in Zukunft machbar für den Compiler?

Code
TPVSIO_OUTPUT2 = record
          Buffer1       : byte;
          QK00[@Buffer1, 0] : bit;
          QK01[@Buffer1, 1] : bit;
          QK02[@Buffer1, 2] : bit;
          QK03[@Buffer1, 3] : bit;
          QK04[@Buffer1, 4] : bit;
          QK05[@Buffer1, 5] : bit;
          QK06[@Buffer1, 6] : bit;
          QK07[@Buffer1, 7] : bit;
          Buffer2       : byte;
          QK10[@Buffer2, 0] : bit;
          QK11[@Buffer2, 1] : bit;
          QK12[@Buffer2, 2] : bit;
          QK13[@Buffer2, 3] : bit;
          QK14[@Buffer2, 4] : bit;
          QK15[@Buffer2, 5] : bit;
          QK16[@Buffer2, 6] : bit;
          QK17[@Buffer2, 7] : bit;
         end; 


Hat aber Zeit, ich finde sowas ein gutes Feature um gerade bei den kleinen MCs Speicher zu sparen und trotzdem den Vorteil einer Struktur / Records zu haben.

Thorsten
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Speicheroptimierung BIT statt BOOLEAN

 · 
Posted: 26.03.2018 - 14:55  ·  #7
Hallo Thorsten
Für die Beschreibung eines Bits wird eine 16bit Adresse benötigt und zusätzlich ein Byte um das einzelne Bit an dieser stelle zu adressieren. Macht eine 24bit Adresse. Das passt nicht in das Schema eines Compilers und erst recht nicht in einen record.
Sorry
Rolf
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Speicheroptimierung BIT statt BOOLEAN

 · 
Posted: 26.03.2018 - 16:19  ·  #8
Quote by rh

Hallo Thorsten
Für die Beschreibung eines Bits wird eine 16bit Adresse benötigt und zusätzlich ein Byte um das einzelne Bit an dieser stelle zu adressieren. Macht eine 24bit Adresse. Das passt nicht in das Schema eines Compilers und erst recht nicht in einen record.
Sorry
Rolf


OK??
Code

VAR
 OUT : byte;
 QK00[@OUT, 0] : bit;
 QK01[@OUT, 1] : bit;
 QK02[@OUT, 2] : bit;
 QK03[@OUT, 3] : bit;


Ist das hier nicht das selbe Problem? Das unterstützt doch schon der Compiler.

Thorsten
  • 1
  • 2
  • Page 1 of 2
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 14 · Cache Hits: 14   140   154 · Page-Gen-Time: 0.032591s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI