Compilateur Loop est optimisation [Forums - HC12 et S12]
Compilateur Loop est optimisation [Forums - HC12 et S12]
Pseudo Pass se souvenir de moi     Créer un compte
ARTICLES et TELECHARGEMENTS ~ FORUMS ~ LIENS  
 
             
 
Recherche
 
   
 

Parcourir ce sujet :   1 Utilisateur(s) anonymes





Compilateur Loop est optimisation
Accro
Inscrit:
06/07/2007 09:17
Messages: 697
Hors Ligne
Salut à tous

J'ai des problèmes d’exécution quand j'active les optimisation compilo (O3).
L'ordre d'envoi des data sur le SPI est perturbé...

Dans main.c
// variable globale
U1 u1ReturnState U1_FALSE;
U8 TxTab[2] = {0};
U8 RxTab[2] = {0};
...
//dans le main
for (Cptr1 0Cptr1<4Cptr1++)
  {
      
TxTab[1]=Cptr2;
      
u1ReturnState u1MAL_SPI_SyncExchange(TxTab,RxTab,2U);
      
Cptr2++;
  }
...


Dans Spi.c
U1 u1MAL_SPI_SyncExchange(
        
U8 au8TxData[],    /**<        array of data to send        */
        
U8 au8RxData[],            /**<[out]    array of data to received    */
        
U8 u8DataSize)    /**<        number of byte to proceed    */
{
    
/** Variable used to hold return status */
    
U1 u1ReturnStatus;
    
/** Variable used as buffer index */
    
U8 u8Index 0U;
    
/** Variable used as timeout for spi byte exchange */
    
U16 u16Timeout;
    
    
/** Reject command if Data size is null or above buffer size limit */
    
if ((u8DataSize == 0x00U) || (u8DataSize U8_MAL_SPI_MAX_BUFFER_SIZE))
    {
        
/** Set return status */
        
u1ReturnStatus U1_TRUE;
    }
    
/** Reject command if Rx or Tx buffer address are NULL */
    
else if ((au8TxData == NULL) || (au8RxData == NULL))
    {
        
/** Set return status */
        
u1ReturnStatus U1_TRUE;
    }
    
/** Reject command if there is any running exchange */
    
else if (u1SPIIsExchangeInProgress == U1_FALSE)
    {
        
/** Lock Spi Exchange process */
        
u1SPIIsExchangeInProgress U1_TRUE;
        
        
/** handle buffer transmission */
        //for (u8Index = 0U; u8Index < u8DataSize; u8Index++)
        
u8Index 0U;
        
        while (
u8Index u8DataSize)
        {
            
/** Reset timeout */
            
u16Timeout U16_MAL_SPI_TIMEOUT_VALUE_TICKS;
            
/** write a byte */
            
SPI0DRL au8TxData[u8Index];
            
/** wait for completed byte reception */
            
while((SPI0SR_SPIF == 0U) && (u16Timeout 0U))
            {
                
/** Decrement timeout counter */
                
u16Timeout--;
            }
            
            if (
u16Timeout == 0U)
            {
                
/** Set return status */
                
u1ReturnStatus U1_TRUE;
                
au8RxData[u8Index] = 0x00U;
                
/** leave for loop */
                
break;
            }
            else
            {
                
/** read a byte */
                
au8RxData[u8Index] = SPI0DRL;
            }
            
u8Index++;
        }
        
/** Unlock Spi Exchange process */
        
u1SPIIsExchangeInProgress U1_FALSE;
    }
    else
    {
        
/** Set return status */
        
u1ReturnStatus U1_TRUE;
    }
    return (
u1ReturnStatus);
}


Si vous regardez bien, j'ai testé les 2 type de boucles (for ou while).

En O0 et O1, l'envoie est dans le bon ordre: TxTab[0]TxTab[1], puis TxTab[0]TxTab[1]...
Mais en O2 et O3, l'envoie est dans le désordre: TxTab[0]TxTab[0], puis TxTab[1]TxTab[1]...

hors cpu dépendant, je peux comprendre mais là...

Avez vous une idée?
(ca doit être liée à une parallélisation mais j'avoue ne pas savoir... je cherche)

Posté le : 10/12 15:15
Transférer la contribution vers d'autres applications Transférer


Re: Compilateur Loop est optimisation
Accro
Inscrit:
06/07/2007 09:17
Messages: 697
Hors Ligne
première réponse à moi-même

en mode optimisé, l'execution est 5 à 6 fois plus rapide.
Dans le code présenté, je ne regardais pas le flag de buffer empty avant d'écrire...
...
while(
SPI0SR_SPTEF == 0U){};
/** write a byte */
SPI0DRL data;
...


bon en ajoutant le check avant d'écrire, il me manque toujours un byte sur le bus...
je devrais avoir [12][0]; [12][1]; [12][2]; [12][3];
et jai           [12]   ; [12][1]; [12][2]; [12][3];


Posté le : 10/12 16:29
Transférer la contribution vers d'autres applications Transférer


Re: Compilateur Loop est optimisation
Accro
Inscrit:
06/07/2007 09:17
Messages: 697
Hors Ligne
Bon re et fin de sujet XD

J'ai trouvé mon problème.

Comme je fais de l'attente active sur un périphérique, j'utilise un compteur timeout.
Dans mon cas il était mal configuré, donc je quitter mon exécution avec que le périphérique lève son flag...

En Bon Mauvais codeur, je me suis fait avoir sur la description du bit "Transfert complet".
Il faut vraiment être vigilent par rapport au comportement HW et les optimisation compilo.
Rappel: sans optimisation, l’exécution se faisait sans problème...

while(SPI0SR_SPTEF == 0U){ /* !Add timeout! */};
/** write a byte */
SPI0DRL data;
/** wait for completed byte reception */
while((SPI0SR_SPIF == 0U) && (u16Timeout 0U))
{
    
/** Decrement timeout counter */
    
u16Timeout--;
}



Posté le : 10/12 17:04
Transférer la contribution vers d'autres applications Transférer


Re: Compilateur Loop est optimisation
Pilier de la communauté
Inscrit:
23/10/2005 11:40
De Aix les Bains (73)
Messages: 1926
Hors Ligne
Mais comme on est bons !!

Posté le : 10/12 18:19
Mieux vaut marcher dans la bonne direction que courir dans la mauvaise
Transférer la contribution vers d'autres applications Transférer



 Haut   Précédent   Suivant



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

Compilateur Loop est optimisation [Forums - HC12 et S12]