Boucle "for" pour un tableau qui plante tout [Forums - Langage C]
Boucle "for" pour un tableau qui plante tout [Forums - Langage C]
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
Recherche
 
   
 

Parcourir ce sujet :   1 Utilisateur(s) anonymes



« 1 (2) 3 4 5 ... 14 »


Re: Boucle "for" pour un tableau qui plante tout
Pilier de la communauté
Inscrit:
13/10/2005 10:06
De haute-savoie (74)
Messages: 1164
Hors Ligne
Petite astuce
Afin de vérifier si ton code a été optimisé tu peux aller lire le fichier *.lst (il faut cocher une case dans la config du compilateur pour le générer). Ce fichier va te donner beaucoup d'infos : tu vas voir ton code en C avec en face l'affectation mémoire et l'ASM généré. En fin de fichiers tu as également la taille de ton code qui apparait et au début tu as les définitions des blocs mémoire ce qui permet aussi de visualiser où se trouve la pile et d'autres segments mémoire...

D'ailleurs, sais tu ce que c'est que la pile (stack) ?


++
Stéphane

Posté le : 04/03/2016 21:50
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Merci Stéphane,

Je viens d'essayer en ajoutant le "volatile" devant le type. Rien y fait.

Ou en pas à pas, cela fonctionne. Chaque case de "page-data" se remplissent de FF (des valeurs bidons pour le coup).

En fait, ça me fait comme au tout début lorsque j'essayais de faire clignoter ma led tu te rappelle ? Et ça me fait penser que j'étais aussi dans un for ...
Donc quand ça plante, je suppose que mon micro fait un reset ou freeze, car je perd la main avec le débug, et j'ai la fenêtre de mon bdm qui s'ouvre en me disant :

Citation :
Enabling BDM interface on target failed.
The target may be secured.
(Use stand-alone programmer to mass erase if necessary)

Please cycle power to the target.

Retry connection ?


Donc j'éteind et je rallume ma carte, et je reprend la main.

Pour la pile oui, le cpu stocke du bas vers le haut de la mémoire toutes les variables de registre et de mémoire ainsi que le PC lorsqu'il rencontre une interruption, ou bien lorsque l'on fait des push/pul, jsr, bsr, rti, rts etc ...

Voilà comment je me représente la pile.

Posté le : 04/03/2016 22:33
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Pilier de la communauté
Inscrit:
13/10/2005 10:06
De haute-savoie (74)
Messages: 1164
Hors Ligne
Donc ton programme va au bout en pas à pas ? Tu arrives jusqu'au nop ?

Posté le : 04/03/2016 22:40
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Ben disons qu'en pas à pas vu que c'est un peu long, je remplie 2 ou 3 case de page_data puis je m'arretes.

Quoi que je vais essayer en modifiant le compteur du for à 6 par exemple ...

Posté le : 04/03/2016 22:46
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Arf ....

Là je faisais le pas à pas, et il vient de me planter ici :

unsigned char OWReadByte(void)
{
    
unsigned char loopresult=0;
            for (
loop 0loop 8loop++)
                {
// shift the result to get it ready for the next bit
                
result >>= 1;
// if result is one, then set MS bit
                
if (OWReadBit())    <-plantage ici
                    result 
|= 0x80;    <-ou ici
                
}
                return 
result;
}

Posté le : 04/03/2016 22:55
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Pffff je désespère.

J'arrive à faire des run entre 2 break points histoire de récupérer mes octets au coup par coup, mais ça plante de manière aléatoire ...

Soit CW n'aime pas mes boucles for, soit j'ai un soucis avec mon USBDM ou ma carte ...

Posté le : 04/03/2016 23:16
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Pilier de la communauté
Inscrit:
13/10/2005 10:06
De haute-savoie (74)
Messages: 1164
Hors Ligne
lorsque tu fais du pas à pas, il faut que tu entres dans les sous fonction avec le bouton Step into. et continuer le débug dans ta fonction. Il est impératif de rigoureusement dérouler le code partout pour voir ce qui merde.
peux tu publier le détail de tes fonctions tickdelay, owin, owout et les valeurs de A et B ?

Posté le : 05/03/2016 00:25
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Bonjour Stéphane, et les autres

Je me suis couché tard hier ... le désespoir se fait ressentir !!!

Bon pour une bonne lisibilité, je te remet le code entier. uniquement les fonctions concernées :

//Example 1. 1-Wire Timing Generation
// Pause for exactly 'tick' number of ticks = 0.25us
void tickDelay(unsigned short tick// Implementation is platform specific
{
asm     {
        
pshh
        pshx
        ldhx    tick    
tempo
:    aix        #-1
        
cphx    #0
        
bne        tempo
        pulx
        pulh
        
}
}
// 'tick' values
unsigned short A,B,C,D,E,F,G,H,I,J;
//---------------------------------------------------------------------------
// Set the 1-Wire timing to 'standard' (standard=1) or 'overdrive' (standard=0).
//
void SetSpeed(unsigned char standard)
{
// Adjust tick values depending on speed
    
if (standard)
        {
// Standard Speed
            
14;        //6 * 4
            
159;    //64 * 4
            
149;    //60 * 4
            
24;        //10 * 4
            
22;        //9 * 4
            
136;    //55 * 4
            
0;
            
1198;    //480 * 4
            
174;    //70 * 4
            
1024;    //410 * 4
        
}
    else
        {
// Overdrive Speed
            
3;        //1.5 * 4
            
18;        //7.5 * 4
            
18;        //7.5 * 4
            
5;        //2.5 * 4
            
1;        //0.75 * 4
            
17;        //7 * 4
            
5;        //2.5 * 4
            
174;    //70 * 4
            
20;        //8.5 * 4
            
99;        //40 * 4
        
}
}

//Example 2. 1-Wire Basic Functions
//---------------------------------------------------------------------------
// Generate a 1-Wire reset, return 1 if no presence detect was found,
// return 0 otherwise.
// (NOTE: Does not handle alarm presence from DS2404/DS1994)
//
unsigned char OWTouchReset(void)
{
            
unsigned char result;
            
tickDelay(G+1);
            
OWOUT(0);        // Drives DQ low
            
tickDelay(H);
            
OWOUT(1);        // Releases the bus
            
tickDelay(I);
            
OWIN();
            
sync 1
            
result PORT_PTDD_PTDD0;
            
sync 0;
            
//result = inp(PORTADDRESS) ^ 0x01; // Sample for presence pulse from slave
            
tickDelay(J); // Complete the reset sequence recovery
            
return result// Return sample presence pulse result
}

//---------------------------------------------------------------------------
// Read a bit from the 1-Wire bus and return it. Provide 10us recovery time.
//
unsigned char OWReadBit(void)
{
    
unsigned char result;
            
OWOUT(0);        // Drives DQ low
            
tickDelay(A);
            
OWOUT(1);         // Releases the bus
            
tickDelay(E);
            
sync 1;
            
OWIN();
            
result PORT_PTDD 0x01// Sample the bit value from the slave
            
sync 0;
            
tickDelay(F); // Complete the time slot and 10us recovery
            
return result;
}

//---------------------------------------------------------------------------
// Read 1-Wire data byte and return it
//
unsigned char OWReadByte(void)
{
    
unsigned char loopresult=0;
            for (
loop 0loop 8loop++)
                {
// shift the result to get it ready for the next bit
                
result >>= 1;
// if result is one, then set MS bit
                
if (OWReadBit())
                    
result |= 0x80;
                }
                return 
result;
}

//Read 8 bytes
void OWReadPackets(void)
{
    
volatile unsigned char page_data[8];
    
unsigned char i;
for (
0<= 7i++)
    {
    
page_data[i] = OWReadByte();
    }
asm(nop);
}

//Master en émetteur
void OWOUT(unsigned short dq)
{
    
PORT_PTDIE_PTDIE0 0;
    
PORT_HDRVE_PTD0 1;
    
PORT_PTDOE_PTDOE0 1;
    
PORT_PTDD_PTDD0 dq;
}

//Master en récepteur
void OWIN(void)
{
    
PORT_PTDOE_PTDOE0 0;
    
PORT_PTDIE_PTDIE0 1;
}



//Main()
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "INIT_S08PA16.h"
#include "I2C.h"
#include "OWIRE.h"




void main(void) {
  
EnableInterrupts;
  
/* include your code here */
      
WDOG_CS1_EN 0;    //Watchdog désactivé
      
initMCU();            //Initialisation du S08
      
sync 0;            //Signal de synchro pour l'annalyseur logique
      
sync 1;
      
sync 1;
      
sync 1;
      
sync 1;
      
SetSpeed(1);        //Selection de la vitesse standard du bus 1-WIRE
      
OWTouchReset();        //Envoi d'un reset sur le bus
      
OWWriteByte(0x33);    //Demande de lecture du ROMCODE
      
OWReadPackets();    //Lecture des 64 bits ROMCODE
      
OWReadByte();
      
OWReadByte();
      
OWReadByte();
      
OWReadByte();
      
OWReadByte();
      
OWReadByte();
      
OWReadByte();
      
OWReadByte();
      
OWReadByte();
      
asm(nop);
      
//OWReadPackets();


      
      
      
      
      
      /*I2C_ON();

I2C_START();
I2C_OUT(0b01111100);
R_I2C_OUT(0x00);
R_I2C_OUT(0x38);
R_I2C_OUT(0x39);
R_I2C_OUT(0x14);
R_I2C_OUT(0x79);
R_I2C_OUT(0x50);
R_I2C_OUT(0x6C);
R_I2C_OUT(0x0C);
R_I2C_OUT(0x01);
I2C_STOP();*/
 

  
for(;;) {
    
//__RESET_WATCHDOG();    /* feeds the dog */
      
PORT_PTDD_PTDD1 1;
      
asm {
          
nop
          
      
}
      
PORT_PTDD_PTDD1 0;
      
asm {
          
nop
          
      
}
  } 
/* loop forever */
  /* please make sure that you never leave main */
}



Je m'apprête à faire les tests que tu me proposes. J'apprend la fonction "step into".

Je te remercie

Posté le : 05/03/2016 13:42
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Y'a un truc que je trouve bizarre ...

Dans ma tempo : Je fais un pshh,pshx en entrée puis un pulx,pulh en sortie. Normal, je sauve puis je restitue le registre H:X que je m'apprete à modifier.

void tickDelay(unsigned short tick// Implementation is platform specific 

asm     
        
pshh 
        pshx 
        ldhx    tick     
tempo
:    aix        #-1 
        
cphx    #0 
        
bne        tempo 
        pulx 
        pulh 
        

}


Et voici au niveau du désassemblage :

tickDelay:
  
8   void tickDelay(unsigned short tick// Implementation is platform specific
c186:   89 PSHX
c187
:   8B PSHH
 11           pshh
c188
:   8B PSHH
 12           pshx
c189
:   89 PSHX
 13           ldhx    tick    
c18a
:   9EFE03 LDHX 3,SP
 14   tempo
:    aix        #-1
c18d:   AFFF AIX #-1
 
15           cphx    #0
c18f:   650000 CPHX #0x0000
 
16           bne        tempo
c192
:   26F9 BNE *-5 tickDelay+0x7 (0xc18d)
 
17           pulx
c194
:   88 PULX
 18           pulh
c195
:   8A PULH
 20   
}
c196:   A702 AIS #2
c198:   81 RTS  0x0000 (0)


C'est quoi ce why ??? Le compilo m'ajoute un pshx,pshh au début. Ok ça peut paraitre logique. Et en sortie il met un AIS #2 et un rts ???

Posté le : 05/03/2016 14:18
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer


Re: Boucle "for" pour un tableau qui plante tout
Accro
Inscrit:
28/09/2005 14:02
De Catalunya (66)
Messages: 581
Hors Ligne
Et pourtant ...

Mon BDM plante toujours, alors que ma trame elle, se réalise bien ...


Attacher un fichier:



png  Capture.PNG (91.65 KB)
24_56daf24cbbc77.png 1269X544 px

Posté le : 05/03/2016 15:50
Les octets s'envolent, les écrits restent !
Transférer la contribution vers d'autres applications Transférer



 Haut   Précédent   Suivant
« 1 (2) 3 4 5 ... 14 »



Vous pouvez voir les sujets.
Vous ne pouvez pas débuter de nouveaux sujets.
Vous ne pouvez pas répondre aux contributions.
Vous ne pouvez pas éditer vos contributions.
Vous ne pouvez pas effacez vos contributions.
Vous ne pouvez pas ajouter de nouveaux sondages.
Vous ne pouvez pas voter en sondage.
Vous ne pouvez pas attacher des fichiers à vos contributions.
Vous ne pouvez pas poster sans approbation.

[Recherche avancée]


Powered by XOOPS© The XOOPS Project
Contacter les administrateurs

Boucle "for" pour un tableau qui plante tout [Forums - Langage C]