2017-04-10 4 views
2

Quelqu'un peut-il aider avec cela? En résumé: déclarer et initialiser une variable ne fonctionne pas dans le matériel PIC - alors que cela fonctionne très bien en simulation. En outre, ce problème semble être pire si la variable est une structure. J'utilise: MPLAB X IDE V3.55, XC8 V1.41, PIC18F26K40 sur la carte Explorer 8 avec le câble de débogage PICKIT3.Déclaration de variable PIC18 et l'initialisation échoue dans le matériel

Détails:

Pour un cas simple comme:

uint8_t myvar = 0x55; 

void main(void) 
{ 
    uint8_t var = myvar; 
} 

Utilisation de la fenêtre des variables dans le débogueur myvar est toujours égale à zéro quand je lance ce dans le matériel. Mais si je cours le même code dans le simulateur, tout est OK!

J'ai:

  • cassé le problème à forme la plus simple qui reproduit le problème
  • essayé de désactiver l'optimisation du compilateur - qui ne résout pas ce

Vérification des valeurs dans le « Fichier Fenêtre de débogage des registres. Je ne vois pas 0x55 lorsqu'il est exécuté dans le matériel - mais il est là dans le simulateur (à l'adresse 0x21).

Il fonctionne dans le matériel si:

  • myvar est déclarée et initialisés comme const
  • myvar est déclarée et initialisés localement (à l'intérieur principal)

Maintenant, si j'utilise une struct tapez au lieu d'un simple uint8_t comme:

typedef struct { 
    uint8_t a; 
    char b[8]; 
}MYSTRUCT; 

MYSTRUCT ms = { 0x55, "HELLO" }; 

void main(void) 
{ 
    uint8_t var = ms.a; 
} 

La variable ms est initia correctement dans la simulation, mais pas dans le matériel. Cette fois il ne s'initialise pas si la variable est déclarée en main ou en tant que global. Encore une fois, déclarer comme un const fonctionne. Donc, il semble y avoir incohérence:

           uint8_t  struct type 
global variable declaration and initialisation  N  N 
global const declaration and initialisation  Y  Y 
local variable declaration and initialisation  Y  N 

Après le débogage et pas à pas dans avec l'assembleur (.as) fichier il ressemble maVar tente d'être initialisées, mais pour une raison quelconque ne tout simplement pas dans le matériel. Voir ci-dessous les lignes pertinentes du fichier .as. l'adresse et la valeur aux étapes clés sont montrées comme capturées du débogueur pendant la simulation. Vous pouvez voir à la fin '__pdataCOMRAM' (le pointeur vers RAM pour myVar) est affecté 0x55. Si je passe à travers cela dans le matériel, toutes les étapes sont identiques, mais quand nous arrivons à la fin '__pdataCOMRAM' n'a pas la valeur de 0x55, mais 0x00.

            Address Value 

global __pdataCOMRAM 
__pdataCOMRAM: 
    file "main.c" 
    line 32 
global _myVar 
    myVar:           0x21 0x00 
    ds  1   
    file "dist/C18_18F87K22/debug\initTest.X.debug.as"  
    line #  
psect cinit  
; Initialize objects allocated to COMRAM (1 bytes)  
    global __pidataCOMRAM        0x144 0xff55 
    ; load TBLPTR registers with __pidataCOMRAM 
    movlw low (__pidataCOMRAM)   
    movwf tblptrl  
    movlw high(__pidataCOMRAM)   
    movwf tblptrh  
    movlw low highword(__pidataCOMRAM)   
    movwf tblptru  
    tblrd*+ ;fetch initializer   
    movff tablat, __pdataCOMRAM+0     0x21  0x55 

Suis-je en train de faire quelque chose de stupide ici ou est-il une option de compilateur je manque ou est-ce un compilateur ou bug débogueur? Je voudrais comprendre ce problème afin de ne pas tomber dans les pièges de mon développement.

Cheers, Steve

+0

Vous devriez regarder votre script d'éditeur de liens, je suppose. Autant que je puisse comprendre le code de démarrage n'effectue pas une copie de la section flash '.data' à ram vers la variable globale init. Il semble que toutes les variables globales soient considérées comme des sections '.bss', donc mises à zéro au démarrage. Avez-vous essayé de déclarer statique 'uint8_t myvar = 0x55'? – LPs

+0

Il s'agit d'une erreur très courante dans la programmation du microcontrôleur en général. Je ne connais pas cette chaîne d'outils particulière, mais vous avez probablement créé un projet avec "démarrage minimal" ou "démarrage rapide" ou similaire. Créer un nouveau projet et voir s'il y a une option appelée "démarrage standard", "démarrage ANSI" ou quelque chose comme ça. – Lundin

+0

Un compilateur d'optimisation peut supprimer toute l'affectation 'uint8_t var = myvar;' l'affectation de 'var' comme' var' n'est jamais utilisée. Faites _something_ avec 'var', quelque chose de visible sans utiliser le débogueur. – chux

Répondre

2

Il semblerait il y a un problème de silicium connu arrêt de l'accès à la mémoire du programme immédiatement après une remise à zéro.Il y a une macro ERRATA 'NVMREG' pour se déplacer. Les étapes spécifiques à résoudre étaient les suivantes: Définir l'option de projet 'Conf'> 'Options globales XC8'> 'Éditeur XC8' sélectionner la catégorie 'Options supplémentaires', puis ajouter l'option NVMREG à l'errata. Ensuite, tout a bien fonctionné. Crédit au 1and0 sur le forum de la micropuce pour celui-là!

+1

Bien. Je suis content d'avoir quitté Microchip World ... – LPs