Go Down

Topic: Accéder à une structure existant en dehors de son appli (Read 1 time) previous topic - next topic

J-M-L

Quote
En mettant l'extern dans le fichier ino ça devrait fonctionner, mais J'ai essayé et il ne réussi pas à trouver la table à l'édition de lien (je soupçonne un bug du compilateur ou  de l'ide).
Non pas si le tableau  n'est pas créé...
il y'a le #if ONEWIRE_CRC8_TABLE et un #if ONEWIRE_CRC... sont ils définis et non nuls?
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

kamill


J-M-L

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

MicroQuettas

Bonsoir,

La syntaxe du PROGMEM est très pointue, cf.
https://www.arduino.cc/reference/en/language/variables/utilities/progmem/

En résumé :
 - soit en variable globale,
 - soit en static,
et la position du PROGMEM dans la déclaration est critique :
 const dataType variableName[] PROGMEM = {}; // use this form
 const PROGMEM dataType variableName[] = {}; // or this one

Bonne bidouille,

MicroQuettas

bricofoy

Ou alors je me l'installe sous Linux, j'ai un ubuntu prêt. L'IDE sous Linux est identique à celui sous Windows ?   

oui
-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

PatMax

Merci  MicroQuettas, j'ai modifié ma syntaxe pour respecter les contraintes bien expliquées dans ce lien.
Il est amusant de s'apercevoir que l'auteur des fonctions OneWire, lui, ne respecte pas la doc :)

static const uint8_t PROGMEM dscrc_table[] = {   

J'espérais que cela résolve mon problème, mais non... en passant, c'est un peu le sac de noeuds cette affaire : la directive PROGMEM doit être accompagnée par un "static" sauf si on déclare tout en global, ce qui empêche d'y accéder par un extern, je commence  à comprendre pourquoi j'y arrive pas trop.

Bonnes bidouilles, good stuff, Ouaiiiiis


OK bricofoy, bientôt une de mes applis de plus qui passe sous Linux, et donc une de moins pour Win, ça c'est super

MicroQuettas

Bonsoir,

Pour ma part, j'utilise couramment la PROGMEM, mais toujours en variable globale depuis le fichier principal.
Quand il y a des compilations séparées avec des .h et des .cpp, la solution doit être celle donnée par
_pepe_ dans ce post :
https://forum.arduino.cc/index.php?topic=515808.0

En prime, la routine de calcul de la CRC 8 bits avec le polynome Maxim. Je l'ai adaptée de la notice d'application Maxim (ex Dallas), parue il y a quelques années. Je l'utilise pour "verrouiller" des zones EEPROM, c-à-d pour m'assurer que les données contenues en EEPROM sont valides. Curieusement, Maxim semble avoir abandonné la méthode par calcul pour utiliser la méthode tabulaire. C'est une bonne solution si on a beaucoup de mémoire.

Code: [Select]

/**********************************************************************
   CRC 8 bits calculations
   Optimized Dallas (now Maxim) iButton 8-bit CRC calculation.

Polynomial: x^8 + x^5 + x^4 + 1 (0x8C)
Initial value: 0x00

See http://www.maxim-ic.com/appnotes.cfm/appnote_number/27
Init: crc=0x00
Test case (hex): 02 1C B8 01 00 00 00  CRC = 0xA2

Two properties of the 1-Wire CRC can be helpful in debugging code
used to calculate the CRC values. The first property has already
been mentioned for the hardware implementation.
 1- If the current value of the CRC register is used as the next
    byte of data, the resulting CRC value is always 0x00,
 2- A second property that can be used to confirm proper operation
    of the code is to enter the 1's complement of the current value
    of the CRC register.
    For the 1-Wire CRC algorithm, the resulting CRC value is always
    0x35, or 53 decimal = CRC8_Sign.

Crc can be initialised either 0x00 or 0xff (preferred).

If the last data byte is the Crc of the previous array, the
Crc returns 0.

Do not include the <util\crc16.h> routines (unless needed).

Tested OK on 03/07/14
***********************************************************************/

/************************* CRC8 functions *****************************/
#ifndef _GParMgt
#define CRC8_Sign 0x35
#endif

/**********************************************************************/

uint8_t CRC8_Updt(uint8_t Crc, uint8_t Data)
  {
uint8_t i;

Crc = Crc ^ Data;      /* bitwise XOR */
for (i = 0; i < 8; i++)
  {
  if (Crc & 0x01)
    {
    Crc = (Crc >> 1) ^ 0x8C;  /* Polynomial */
    }
    else
    {
    Crc >>= 1;
    }
  }

return Crc;
  };

uint8_t CRC8(uint8_t Crc, uint8_t *Data, uint8_t Nbr)
  {
  uint8_t i;

  for (i = 0; i < Nbr; i++)
    {
    Crc = CRC8_Updt(Crc, *(Data + i));
    }
  return Crc;
  }



/********************* End of CRC functions **************************/


Bonne bidouille,

MicroQuettas

PatMax


Salut Bonne Bidouille !

oui, j'utilise aussi les routines extraites des exemples Maxim depuis des années (avec le LastDiscrepancy...), sur différents contrôleurs et avec différents compilateurs; pour mes zones EEPROM, le transfert de trames... maintenant on a beaucoup de place, il est rare d'avoir à réduire la taille du code (ça arrive de temps en temps, alors que c'était la contrainte majeure au siècle dernier :) )

j'ai résolu mon problème comme cela, c'est la même chose que ton exemple :

Code: [Select]

void SendSerialCrc (byte val) {       
  Serial.write(val);                         
  for (uint8_t i = 8; i; i--) {             
    uint8_t mix = (Crc ^ val) & 0x01;
    Crc >>= 1;                               
    if (mix) Crc ^= 0x8C;                 
    val >>= 1;                               
  }                                             
}


Et pepe, il avait pas une idée pour ma table  à récupérer ? surtout pour comprendre ce qui s'est passé, et pourquoi on n'y est pas arrivés ; enfin, on a peut-être atteint le limites du compilateur de l'arduino ?

PatMax

C'est peut-être parce que le but d'Arduino n'est pas vraiment l'apprentissage, mais l'initiation et le bricolage simples et rapides avec le minimum de connaissances.
Oui, cela se défend ; maintenant rien n'empêcherait que partant d'un bricolage, des pistes soient données ou laissées ouvertes pour aborder un peu plus finement l'état de l'art. Mais en effet, l'Arduino semble plus orienté vers la facilité et la rapidité.

O tempora...

Go Up