- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 19 von 19

Thema: &-operator Problem, constante im Programmspeicher, sizeo

  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Anzeige

    Praxistest und DIY Projekte
    Das Problem ist, dass du den Kram erst einmal aus dem Flash rauslesen musst ... dafür gibt es in in "pgmspace.h" entsprechende Methoden.

    mfG
    Markus

  2. #12
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    Du solltest dir mal ein Tutorial zu Progmem durchlesen. Ich glaube unter mikrokontroller.net oder avrfreaks gibts da was ganz brauchbares.

    sast

    雅思特史特芬
    开发及研究

  3. #13
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.05.2006
    Beiträge
    184
    ich schau mal, besser wär en link, aber trotzdem Danke.

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.05.2006
    Beiträge
    184
    Hi,

    hab es nun endlich hinbekommen.

    die #include <avr/pgmspace.h>
    hält alle Lösungen parat.

    Da ich meine Informationen in einer Strukturen im PROGMEM Speicher abgelegt hab, kopiere ich mir beim Zugriff darauf die Struktur in eine lokale Struktur im .data Bereich.

    Code:
       norm_t      Norm_tmp;        // local Norm structure element
       PGM_VOID_P  p_Norm_tmp;      // local pointer to PROGMEM Norm structure
    
    p_Norm_tmp = (U32*) pgm_read_word_far( (U16) &NormArray[i] );
    memcpy_P(&Norm_tmp, p_Norm_tmp, sizeof(norm_t));
    
    // einfacher Zugriff
    ... = (S8*) Norm_tmp.normName;
    ... = (S8*) Norm_tmp.normUnit;
    Bin froh, dass es jetzt endlich hingehauen hat.
    \/
    Danke, für die Hilfe und Beschleunigung in die richtige Richtung.

  5. #15
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.05.2006
    Beiträge
    184
    Hi,
    so jetzt hab ich noch ein Problem von früher.

    .c Ausschnitt

    Code:
    #include <avr/io.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <avr/pgmspace.h>
    
    #include "main.h"
    
    void initio(void);
    void delay_ms(unsigned int ms);
       
       norm_t NormArray[] PROGMEM =
       {   // Faktor Decimal Unit Name
          {1, 0, {  "V"}, {"VOLTAGE 1"}}, //  0
          {1, 3, { "mV"}, {"VOLTAGE 2"}}, //  1
          {1, 0, {  "A"}, {"CURRENT 1"}}, //  2
       };
    
    int main( void )
    {
       int i;
    
       unsigned char normAmound;
       
       normAmound = sizeof (NormArray);
       
       initio();
    ...
    und die .h

    Code:
    ...
    #define NORM_UNIT_MAXLEN 4
    #define NORM_NAME_MAXLEN 12
    
    
       
       typedef char PROGMEM prog_S8;
    
       typedef unsigned char PROGMEM prog_U8;
    
    typedef struct Norm
    {
        prog_U8 factor;   
        prog_U8 decimal;
                 
        const prog_S8 sNormUnit[NORM_UNIT_MAXLEN];
        const prog_S8 sNormName[NORM_NAME_MAXLEN];
    }norm_t;
    der Compiler frisst das Zwar aber das ist leider nur die halbe Miete.

    das sizeof() ergibt immer entweder die größe eines Elements oder die Pointergröße 2.

    egal in welcher Konstellation:
    normAmound = sizeof (NormArray);
    normAmound = sizeof ( (norm_t*) NormArray);
    normAmound = sizeof ( (norm_t**) NormArray);
    normAmound = sizeof ( (PGM_P) NormArray);
    normAmound = sizeof ( (PGM_P*) NormArray);
    normAmound = sizeof ( (PGM_VOID_P) NormArray);
    normAmound = sizeof ( (PGM_VOID_P*) NormArray);

    gibt es eine Möglichkeit die größe des Arrays zu ermitteln?

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.05.2006
    Beiträge
    184
    Sorry,

    hab da was verwechselt das

    normAmound = sizeof (NormArray);

    passt.

  7. #17
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502

    Manchmal hilft es, wenn man einfach mal mit jemandem darüber gesprochen hat. Dann kommt man bereits alleine auf die Lösung.

    Geht mir auch oft so.

    sast

    雅思特史特芬
    开发及研究

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.05.2006
    Beiträge
    184
    Hi,

    mal ne andere Frage:

    wird das sizeof (NormArray); eigendlich zur laufzeit gebildet oder macht das der Preprozessor?

    mit anderen Worten geht das auch (ich habs nicht hinbekommen ) ?

    #define NORMAMOUND (sizeof (NormArray))

  9. #19
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von chientech
    wird das sizeof (NormArray); eigendlich zur laufzeit gebildet oder macht das der Preprozessor?
    Weder noch. Das macht der Compiler.

    mit anderen Worten geht das auch (ich habs nicht hinbekommen ) ?

    #define NORMAMOUND (sizeof (NormArray))
    Preprozessor Defines sind immer nur reine Textersetzungen. Wenn du irgendwo im Source "NORMAMOUND" schreibst, ersetzt er das stumpf durch "(sizeof (NormArray))". Das Ganze funktioniert also nur dort, wo NormArray für den Compiler vollständig bekannt ist.
    MfG
    Stefan

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad