IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Astuce PSTR / sprintf_P


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 986
    Par défaut Astuce PSTR / sprintf_P
    Bonjour,

    sprintf_P() est une fonction pratique, mais chaque appel est coûteux en code

    Il est possible de passer la chaine de format en paramètre tout en la laissant en flash, voici un example (la fonction sert à écrire des nombre sous forme de texte à des emplacements précis dans un buffer) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    typedef uint16_t FlashAddress;
    const char Display_Dec[] PROGMEM = {"%3d"};
    const char Display_Hex[] PROGMEM = {"%02X"};
    void DisplaySetupMenu() {
    	byte i;
    	FlashAddress pBuffer;
    	for (i=EusOffset;i<EusLen;i++) {
    		if (i < EusMac) {
    			//sprintf_P(Buffer_HTTP + PRINT_Text_Setup_First_Text_Address - EusOffset*4 + i*4, PSTR("%3d"), Eus[i]); 
    			pBuffer = Display_Dec;
    		} else {
    			//sprintf_P(Buffer_HTTP + PRINT_Text_Setup_First_Text_Address - EusOffset*4 + i*4, PSTR("%02X"), Eus[i]); 
    			pBuffer = Display_Hex;
    		}
    		sprintf_P(Buffer_HTTP + PRINT_Text_Setup_First_Text_Address - EusOffset*4 + i*4, pBuffer, Eus[i]); 
    	}
    	DisplayData();
    }
    Le type FlashAddress dépend de votre microcontrôleur.

    Sur un Arduino UNO, c'est uint16_t car l'UNO a 32ko de flash

    Si votre microcontrôleur a plus de 64ko de flash il faut utiliser un uint32_t

    A bientôt

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 883
    Par défaut
    c'est quoi EusMac, EusOffset et EusLen?

    pourquoi ne pas faire usage de PSTR() tout simplement, on peut même avoir un paramètre en progmem avec %S par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     char buffer[100];
    const char txt1[] PROGMEM = "'Hello World'";
    sprintf_P(buffer, PSTR("le texte est %S"), txt1);

  3. #3
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 986
    Par défaut
    Bonjour,

    l'intérêt de mon code est que j'avais besoin d'afficher dans un buffer certaines valeurs en décimal et d'autres en hexadécimal

    ma façon de faire est économe car évite deux appels de sprintf_P(), ou un unique appel de sprintf_P() avec une longue chaine de format et 17 paramètres

    A bientôt

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 883
    Par défaut
    pas bien compris votre usage ....

    Peut-être si vous faisiez un petit code complet de démo?

  5. #5
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 986
    Par défaut
    Bonjour,

    Je comprend tout à fait - mais le code complet c'est mon fameux projet qui est assez conséquent

    Après je pense que celui qui cherchera à faire ce que j'explique tombera sur mon sujet.
    Moi-même j'ai cherché assez longtemps avant de trouver.

    Bon je vais quand même expliquer un peu...

    Alors dans mon projet j'ai un buffer qui contient des paramètres sauvegardés en EEPROM

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // This table stores user settings, written on the UNO EEPROM ==========================================================================
    #define EusLen 18
    #define EusOffset 3
    #define EusServerIP 0
    #define EusClientIP 4
    #define EusDelayPingServer 8
    #define EusBacklightMinDarkness 9
    #define EusBacklightAmbiantLightK 10
    #define EusBacklightTimeout 11
    #define EusMacAddress 12
    byte EepromUserSettings[EusLen]; // = { 192, 168, 123, 032, 192, 168, 123, 177, 010, 205, 003, 012, 0xA8, 0x61, 0x0A, 0xAE, 0x75, 0xCA}; 
    //                                       0    1    2    3    4    5    6    7    8    9   10   11    12    13    14    15    16    17
    //                                       ----------------    ----------------   ---  ---  ---  ---  ----------------------------------
    //                                            SERVER IP           CLIENT IP      8:Delay Ping              MAC ADDRESS 
    //                                                                               9:Backlight min value 
    // WARING : SERVER and CLIENT are connected to the same local network            10:Backlight ambiant light K 
    //          bytes 0, 1 and 2 of server.IP and client.IP are the same             11:Backlight timeout 
    //          so we don't store bytes 0, 1 and 2 of server.IP in EEPROM  
    //
    // Calibration data of touch screen is also stored in EEPROM after bytes [EusOffset] to [EusLen-1] of EepromUserSettings[]
    // =====================================================================================================================================
    Le but c'est d'afficher ces valeurs sur un écran tactile pour permettre à l'utilisateur de les modifier :

    Nom : TFT_SETUP_CLIENT.jpg
Affichages : 1096
Taille : 60,1 Ko

    Sur l'image de l'écran, on voit que la valeur "177" est sélectionnée, en cliquant sur les boutons +1 -1 +10 -10 ... l'utilisateur peut changer la valeur
    L'utilisateur peut cliquer sur une autre valeur pour la sélectionner
    Et contrairement à ce qu'on pourrait craindre la saisie est assez rapide, c'est ergonomique et intuitif
    Car avec un clavier "normal" il aurait fallu 10 touches + des touches de navigation et d'effacement, c'est à dire des touches plus petites, sans parler du code nécessaire pour les vérifications et la nécessité d'afficher des erreurs...

    Alors le problème que j'ai c'est d'écrire ces valeurs sous forme de "nombre en texte" pour les afficher avec ma fonction TFT.Print()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    typedef uint16_t FlashAddress; // We can handle PROGMEM as UInt16 vars for functions that use PSTR macros :-)
    const char Display_Dec[] PROGMEM = {"%3d"};
    const char Display_Hex[] PROGMEM = {"%02X"};
    void DisplaySetupMenu() {
    	// This function print in Buffer_HTTP[] text corresponding to values from EepromUserSettings[]
    	// at address used by Print_Text_Setup instructions
    	// It's a little bit complex but efficient
    	byte i;
    	FlashAddress pBuffer;
    	for (i=EusOffset;i<EusLen;i++) {
    		if (i < EusMacAddress) {
    			pBuffer = Display_Dec;
    		} else {
    			pBuffer = Display_Hex;
    		}
    		sprintf_P(Buffer_HTTP + PRINT_Text_Setup_First_Text_Address - EusOffset*4 + i*4, pBuffer, EepromUserSettings[i]); 
    	}
    	DisplayData();
    }
    La particularité est que l'adresse MAC est à afficher et à saisir en hexa, les autres paramètres en décimal.

    Buffer_HTTP contient à la fois des instructions graphiques et des données, mon Arduino le balaye pour exécuter les instructions qu'il contient pour faire l'affichage.
    La il faudrait que je mette le code en entier avec celui de la bibliothèque graphique, c'est inapproprié dans un post, mais tu l'auras quand le projet sera publié.

    Mais je pense que tu as compris le principe.

    sprintf_P() va mettre les nombres sous forme de texte au bons endroits dans Buffer_HTTP avant que j'appelle ma routine d'affichage.

    A bientôt

  6. #6
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 986
    Par défaut
    Rebonjour,

    Je vais publier le contenu du fameux Buffer_HTTP contenant les données correspondant à l'affichage de ce menu de réglages de l'écran tactile :


    ------------------ Il y a une ligne pour chaque octet de Buffer_HTTP() -------------------
    n° | n° depuis la première instruction | Valeur décimal | Valeur hexadécimal | Description
    ------------------------------------------------------------------------------------------
      0 ---  60 3C Protocol Start char '<'
      1   0  67 43 67 + color index 0 Fill Screen
      2   1  18 12 16 + size 1 Set Font
      3   2  73 49   Int8 73 LineSpace=2 CarSpace=2 FontIndex=1
      4   3  24 18 Set Text Cursor
      5   4   0 00   Int9 0 X
      6   5   0 00   Int9 0 Y
      7   6  52 34 46 + color index 6 Print Text
      8   7  12 0C   in text: Tab 4 spaces
      9   8  83 53   'S'
     10   9  69 45   'E'
     11  10  84 54   'T'
     12  11  85 55   'U'
     13  12  80 50   'P'
     14  13  32 20   ' '
     15  14  83 53   'S'
     16  15  67 43   'C'
     17  16  82 52   'R'
     18  17  69 45   'E'
     19  18  69 45   'E'
     20  19  78 4E   'N'
     21  20  12 0C   in text: Tab 4 spaces
     22  21   2 02   in text: Set Text Cursor X < 254  Y < 254
     23  22   1 01            X+1
     24  23  25 19            Y+1
     25  24  72 48   'H'
     26  25  69 45   'E'
     27  26  76 4C   'L'
     28  27  80 50   'P'
     29  28  47 2F   '/'
     30  29  83 53   'S'
     31  30  67 43   'C'
     32  31  82 52   'R'
     33  32  46 2E   '.'
     34  33  67 43   'C'
     35  34  65 41   'A'
     36  35  76 4C   'L'
     37  36  58 3A   ':'
     38  37  87 57   'W'
     39  38  65 41   'A'
     40  39  73 49   'I'
     41  40  84 54   'T'
     42  41  32 20   ' '
     43  42  57 39   '9'
     44  43 115 73   's'
     45  44   2 02   in text: Set Text Cursor X < 254  Y < 254
     46  45   1 01            X+1
     47  46  59 3B            Y+1
     48  47  77 4D   'M'
     49  48  67 43   'C'
     50  49   2 02   in text: Set Text Cursor X < 254  Y < 254
     51  50   1 01            X+1
     52  51  93 5D            Y+1
     53  52  73 49   'I'
     54  53  80 50   'P'
     55  54   2 02   in text: Set Text Cursor X < 254  Y < 254
     56  55   1 01            X+1
     57  56 127 7F            Y+1
     58  57  83 53   'S'
     59  58  69 45   'E'
     60  59  82 52   'R'
     61  60  86 56   'V'
     62  61  69 45   'E'
     63  62  82 52   'R'
     64  63  32 20   ' '
     65  64  73 49   'I'
     66  65  80 50   'P'
     67  66   2 02   in text: Set Text Cursor X < 254  Y < 254
     68  67   1 01            X+1
     69  68 161 A1            Y+1
     70  69  80 50   'P'
     71  70  73 49   'I'
     72  71  78 4E   'N'
     73  72  71 47   'G'
     74  73  32 20   ' '
     75  74  68 44   'D'
     76  75  69 45   'E'
     77  76  76 4C   'L'
     78  77  65 41   'A'
     79  78  89 59   'Y'
     80  79  32 20   ' '
     81  80  40 28   '('
     82  81 109 6D   'm'
     83  82 115 73   's'
     84  83  41 29   ')'
     85  84   2 02   in text: Set Text Cursor X < 254  Y < 254
     86  85   1 01            X+1
     87  86 195 C3            Y+1
     88  87  84 54   'T'
     89  88  70 46   'F'
     90  89  84 54   'T'
     91  90  32 20   ' '
     92  91  66 42   'B'
     93  92  76 4C   'L'
     94  93   0 00   End of Text
     95  94  17 11 Set Button Offset
     96  95   5 05   Int8 5 Offset
     97  96  24 18 Set Text Cursor
     98  97  10 0A   Int9 10 X
     99  98 228 E4   Int9 228 Y
    100  99  50 32 46 + color index 4 Print Text
    101 100  43 2B   '+'
    102 101  49 31   '1'
    103 102  54 36   '6'
    104 103   1 01   in text: Set Text Cursor X < 254
    105 104  71 47            X+1
    106 105  32 20   ' '
    107 106  43 2B   '+'
    108 107  49 31   '1'
    109 108   1 01   in text: Set Text Cursor X < 254
    110 109 126 7E            X+1
    111 110  43 2B   '+'
    112 111  49 31   '1'
    113 112  48 30   '0'
    114 113   1 01   in text: Set Text Cursor X < 254
    115 114 181 B5            X+1
    116 115  43 2B   '+'
    117 116  49 31   '1'
    118 117  48 30   '0'
    119 118  48 30   '0'
    120 119   3 03   in text: Set Text Cursor X < 254  Y > 254
    121 120  11 0B            X+1
    122 121   8 08            Y-254
    123 122  45 2D   '-'
    124 123  49 31   '1'
    125 124  54 36   '6'
    126 125   1 01   in text: Set Text Cursor X < 254
    127 126  71 47            X+1
    128 127  32 20   ' '
    129 128  45 2D   '-'
    130 129  49 31   '1'
    131 130   1 01   in text: Set Text Cursor X < 254
    132 131 126 7E            X+1
    133 132  45 2D   '-'
    134 133  49 31   '1'
    135 134  48 30   '0'
    136 135   1 01   in text: Set Text Cursor X < 254
    137 136 181 B5            X+1
    138 137  45 2D   '-'
    139 138  49 31   '1'
    140 139  48 30   '0'
    141 140  48 30   '0'
    142 141  24 18   in text: Set Color Index 6
    143 142   3 03   in text: Set Text Cursor X < 254  Y > 254
    144 143  31 1F            X+1
    145 144  42 2A            Y-254
    146 145  83 53   'S'
    147 146  65 41   'A'
    148 147  86 56   'V'
    149 148  69 45   'E'
    150 149  24 18   in text: Set Color Index 6
    151 150   1 01   in text: Set Text Cursor X < 254
    152 151 141 8D            X+1
    153 152  67 43   'C'
    154 153  65 41   'A'
    155 154  78 4E   'N'
    156 155  67 43   'C'
    157 156  69 45   'E'
    158 157  76 4C   'L'
    159 158   0 00   End of Text
    160 159  24 18 Set Text Cursor
    161 160 191 BF   Int9 191 X
    162 161 126 7E   Int9 126 Y
    163 162  59 3B 53 + color index 6 Print Text Setup @(address + 237) IP3 server
    164 163   1 01   Int8 1 Address
    165 164  24 18 Set Text Cursor
    166 165  35 23   Int9 35 X
    167 166  92 5C   Int9 92 Y
    168 167  59 3B 53 + color index 6 Print Text Setup @(address + 237) IP0
    169 168   5 05   Int8 5 Address
    170 169  24 18 Set Text Cursor
    171 170  87 57   Int9 87 X
    172 171  92 5C   Int9 92 Y
    173 172  59 3B 53 + color index 6 Print Text Setup @(address + 237) IP1
    174 173   9 09   Int8 9 Address
    175 174  24 18 Set Text Cursor
    176 175 139 8B   Int9 139 X
    177 176  92 5C   Int9 92 Y
    178 177  59 3B 53 + color index 6 Print Text Setup @(address + 237) IP2
    179 178  13 0D   Int8 13 Address
    180 179  24 18 Set Text Cursor
    181 180 191 BF   Int9 191 X
    182 181  92 5C   Int9 92 Y
    183 182  57 39 53 + color index 4 Print Text Setup @(address + 237) IP3 client
    184 183  17 11   Int8 17 Address
    185 184  24 18 Set Text Cursor
    186 185 191 BF   Int9 191 X
    187 186 160 A0   Int9 160 Y
    188 187  59 3B 53 + color index 6 Print Text Setup @(address + 237) DELAY PING
    189 188  21 15   Int8 21 Address
    190 189  24 18 Set Text Cursor
    191 190 139 8B   Int9 139 X
    192 191 194 C2   Int9 194 Y
    193 192  59 3B 53 + color index 6 Print Text Setup @(address + 237) BACKLIGHT min
    194 193  25 19   Int8 25 Address
    195 194  24 18 Set Text Cursor
    196 195 191 BF   Int9 191 X
    197 196 194 C2   Int9 194 Y
    198 197  59 3B 53 + color index 6 Print Text Setup @(address + 237) BACKLIGHT K
    199 198  29 1D   Int8 29 Address
    200 199  24 18 Set Text Cursor
    201 200  87 57   Int9 87 X
    202 201 194 C2   Int9 194 Y
    203 202  59 3B 53 + color index 6 Print Text Setup @(address + 237) BACKLIGHT TIMEOUT
    204 203  33 21   Int8 33 Address
    205 204  24 18 Set Text Cursor
    206 205  33 21   Int9 33 X
    207 206  58 3A   Int9 58 Y
    208 207  59 3B 53 + color index 6 Print Text Setup @(address + 237) MAC0
    209 208  37 25   Int8 37 Address
    210 209  24 18 Set Text Cursor
    211 210  69 45   Int9 69 X
    212 211  58 3A   Int9 58 Y
    213 212  59 3B 53 + color index 6 Print Text Setup @(address + 237) MAC1
    214 213  41 29   Int8 41 Address
    215 214  24 18 Set Text Cursor
    216 215 105 69   Int9 105 X
    217 216  58 3A   Int9 58 Y
    218 217  59 3B 53 + color index 6 Print Text Setup @(address + 237) MAC2
    219 218  45 2D   Int8 45 Address
    220 219  24 18 Set Text Cursor
    221 220 141 8D   Int9 141 X
    222 221  58 3A   Int9 58 Y
    223 222  59 3B 53 + color index 6 Print Text Setup @(address + 237) MAC3
    224 223  49 31   Int8 49 Address
    225 224  24 18 Set Text Cursor
    226 225 177 B1   Int9 177 X
    227 226  58 3A   Int9 58 Y
    228 227  59 3B 53 + color index 6 Print Text Setup @(address + 237) MAC4
    229 228  53 35   Int8 53 Address
    230 229  24 18 Set Text Cursor
    231 230 213 D5   Int9 213 X
    232 231  58 3A   Int9 58 Y
    233 232  59 3B 53 + color index 6 Print Text Setup @(address + 237) MAC5
    234 233  57 39   Int8 57 Address
    235 234  17 11 Set Button Offset
    236 235   0 00   Int8 0 Offset
    237 236   8 08 INSTR STOP
    238 237  32 20   ' '
    239 238  51 33   '3'
    240 239  50 32   '2'
    241 240   0 00   End of Text
    242 241  49 31   '1'
    243 242  57 39   '9'
    244 243  50 32   '2'
    245 244   0 00   End of Text
    246 245  49 31   '1'
    247 246  54 36   '6'
    248 247  56 38   '8'
    249 248   0 00   End of Text
    250 249  49 31   '1'
    251 250  50 32   '2'
    252 251  51 33   '3'
    253 252   0 00   End of Text
    254 253  49 31   '1'
    255 254  55 37   '7'
    256 255  55 37   '7'
    257 256   0 00   End of Text
    258 257  32 20   ' '
    259 258  49 31   '1'
    260 259  48 30   '0'
    261 260   0 00   End of Text
    262 261  50 32   '2'
    263 262  48 30   '0'
    264 263  53 35   '5'
    265 264   0 00   End of Text
    266 265  32 20   ' '
    267 266  32 20   ' '
    268 267  51 33   '3'
    269 268   0 00   End of Text
    270 269  32 20   ' '
    271 270  49 31   '1'
    272 271  50 32   '2'
    273 272   0 00   End of Text
    274 273  49 31   '1'
    275 274  56 38   '8'
    276 275   0 00   End of Text
    277 276   0 00   End of Text
    278 277  54 36   '6'
    279 278  49 31   '1'
    280 279   0 00   End of Text
    281 280   0 00   End of Text
    282 281  48 30   '0'
    283 282  65 41   'A'
    284 283   0 00   End of Text
    285 284   0 00   End of Text
    286 285  65 41   'A'
    287 286  69 45   'E'
    288 287   0 00   End of Text
    289 288   0 00   End of Text
    290 289  55 37   '7'
    291 290  53 35   '5'
    292 291   0 00   End of Text
    293 292   0 00   End of Text
    294 293  67 43   'C'
    295 294  65 41   'A'
    296 295   0 00   End of Text
    297 296   0 00   End of Text
    298 ---   1 01 Protocol Len (MSB)
    299 ---  44 2C Protocol Len (LSB) - Len = 300
    300 --- 165 A5 Protocol CRC = XOR Bytes(1...299)
    A bientôt

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 883
    Par défaut
    Citation Envoyé par electroremy Voir le message
    Rebonjour,

    Je vais publier le contenu du fameux Buffer_HTTP contenant les données correspondant à l'affichage de ce menu de réglages de l'écran tactile :


    ------------------ Il y a une ligne pour chaque octet de Buffer_HTTP() -------------------
    n° | n° depuis la première instruction | Valeur décimal | Valeur hexadécimal | Description
    ------------------------------------------------------------------------------------------
      0 ---  60 3C Protocol Start char '<'
      1   0  67 43 67 + color index 0 Fill Screen
      2   1  18 12 16 + size 1 Set Font
      3   2  73 49   Int8 73 LineSpace=2 CarSpace=2 FontIndex=1
      4   3  24 18 Set Text Cursor
      5   4   0 00   Int9 0 X
      6   5   0 00   Int9 0 Y
      7   6  52 34 46 + color index 6 Print Text
      8   7  12 0C   in text: Tab 4 spaces
      9   8  83 53   'S'
     10   9  69 45   'E'
     11  10  84 54   'T'
     12  11  85 55   'U'
     13  12  80 50   'P'
     14  13  32 20   ' '
    ....
    Pourquoi ne pas avoir pris une structure (ou une union avec un tableau d'octet si vous avez besoin d'accéder aux octets)?

  8. #8
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 986
    Par défaut
    Citation Envoyé par Jay M Voir le message
    Pourquoi ne pas avoir pris une structure (ou une union avec un tableau d'octet si vous avez besoin d'accéder aux octets)?
    C'est un buffer, qui peut être rempli de n'importe quelle façon

    Un peut comme la mémoire ram d'un afficheur LCD, ou le tampon d'un W5100

    Cordialement

  9. #9
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 883
    Par défaut
    OK - pigé ce que vous vouliez faire, je suppose que vous avez prévu la place pour le '\0' que rajoute sprintf_P ?

    mais pourquoi ne pas prendre simplement un vrai pointeur (const char*) au lieu de ce type FlashAddress (comme ça pas besoin de se demander si on est sur des pointeurs 16 bits ou 32 bits)?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    char buffer[100];
    const char displayDec[] PROGMEM = "%3d";
    const char displayHex[] PROGMEM = "%02X";
    byte valeur = 129;
     
    void setup() {
      const char* ptrFormat;
      Serial.begin(115200);
      strcpy(buffer, "En decimal: XXX, en Hexadecimal: 0xXX");
      Serial.print(F("Avant: ")); Serial.println(buffer);
      ptrFormat = displayDec;
      sprintf_P(buffer + 12, ptrFormat, valeur);
      buffer[15] = ','; // petit hack pour ce test parce que sprintf a mis un caractère nul
      ptrFormat = displayHex;
      sprintf_P(buffer + 35, ptrFormat, valeur);
      Serial.print(F("Après: ")); Serial.println(buffer);
    }
     
    void loop() {}
    la console série donnera bien

    Avant: En decimal: XXX, en Hexadecimal: 0xXX
    Après: En decimal: 129, en Hexadecimal: 0x81

  10. #10
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 986
    Par défaut
    Citation Envoyé par Jay M Voir le message
    OK - pigé ce que vous vouliez faire, je suppose que vous avez prévu la place pour le '\0' que rajoute sprintf_P ?
    C'est exactement ça !

    sprintf_P ajoute toujours \0 à la fin d'une chaîne il faut en tenir compte

    D'ailleurs c'est emmerdant ça m'arrangerais de pouvoir désactiver l'ajout de \0

    Citation Envoyé par Jay M Voir le message
    mais pourquoi ne pas prendre simplement un vrai pointeur (const char*) au lieu de ce type FlashAddress (comme ça pas besoin de se demander si on est sur des pointeurs 16 bits ou 32 bits)?
    En effet ça fonctionne aussi et c'est plus propre (je n'avais pas pensé à faire un pointeur de 'const char')

    Curieusement le code compilé avec const char* à la place de uint16_t occupe 2 octets de flash supplémentaire (je m'attendais logiquement à ce que la compilation soit strictement identique)

    A bientôt

  11. #11
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 883
    Par défaut
    Citation Envoyé par electroremy Voir le message
    Curieusement le code compilé avec const char* à la place de uint16_t occupe 2 octets de flash supplémentaire (je m'attendais logiquement à ce que la compilation soit strictement identique)
    bizarre en effet. Peut-être une optimisation du compilateur qui voit pBuffer comme un entier va mettre cela dans un registre directement pour l'appel de fonction ?

    Vous n'avez pas un warning quand vous faites l'affectation sans cast?le compilateur C++ n'aime pas trop ça normalement. De même sprintf_P() devrait se plaindre de ne pas avoir un pointeur comme argument

    EDIT: dans mon code si vous remplacez const char* ptrFormat; par uint16_t ptrFormat; vous avez bien les warning
    warning: invalid conversion from 'const char*' to 'uint16_t {aka unsigned int}' [-fpermissive]
    De plus, la taille occupée sur un UNO est strictement identique.

  12. #12
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 883
    Par défaut
    OK - ça a avait l'air très structuré à l'octet près

  13. #13
    Membre chevronné Avatar de electroremy
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2007
    Messages
    986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 986
    Par défaut
    En fait c'est très structuré

    Le fameux buffer est rempli d'instructions suivies chacune par des données de type et de longueur dépendant de l'instruction.

    Mon code "execute" le buffer de la façon suivante :
    - lecture de l'instruction (codée sur un octet)
    - execution de l'instruction, qui elle même peut lire un ou plusieurs des octets suivant du buffer et les interpréter d'une façon particulière
    - on arrête si on atteins la fin des données ou si on tombe sur l'instruction "STOP"
    - sinon on recommence (lecture instruction suivante)

    En fait, ce buffer, c'est quasiment une mémoire de programme type architecture Von Neumann.
    D'ailleurs j'ai l'équivalent du compteur de programme qui est l'index de l'octet en cours de lecture dans le Buffer.

    Certaines instructions ont le pouvoir de lire des données à une autre adresse, pour réutiliser des données.
    Par exemple, j'ai une instruction qui permet de dessiner un bitmap.
    Cette instruction attend comme paramètre des coordonnées X,Y puis une adresse.
    Si l'adresse est égal à 0, alors l'instruction va lire les données bitmap juste après
    Si non, l'instruction va lire les données bitmap à l'adresse spécifiée ; cela permet d'imprimer le bitmap à plusieurs endroits de l'écran sans renvoyer à chaque fois toutes les données

    A bientôt

  14. #14
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 883
    Par défaut
    Ok donc c’est structuré mais variable, c’est un mini langage de description de taches et de variables

Discussions similaires

  1. Docs, Tutoriels et astuces Tomcat et JBoss (US)
    Par Ricky81 dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 13/03/2009, 21h00
  2. [Astuce] Approximation de racines carrées
    Par Smortex dans le forum Assembleur
    Réponses: 16
    Dernier message: 18/05/2004, 06h17
  3. [Astuces] Ou se trouve la barre de tâche ?
    Par donkey dans le forum C++Builder
    Réponses: 4
    Dernier message: 11/09/2003, 13h28
  4. Astuces XML/XSLT
    Par haypo dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 25/06/2003, 08h42
  5. Réponses: 2
    Dernier message: 06/03/2003, 16h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo