Fonction Micros() Arm

Bonsoir tous le monde !

Je souhaitais demander s'il y avait une documentation de la fonction micros() sous Arm

Je souhaiterais comprendre plus en détails certaine de ces fonctions et comprendre la différence entre celui-ci et la fonction micros() sous les processeurs atmega.

Pour ceux qui ne voit pas de quel code je parle je l'insère :wink:

Merci.

uint32_t micros( void )
{
    uint32_t ticks, ticks2;
    uint32_t pend, pend2;
    uint32_t count, count2;
 
    ticks2  = SysTick->VAL;
    pend2   = !!((SCB->ICSR & SCB_ICSR_PENDSTSET_Msk)||((SCB->SHCSR & SCB_SHCSR_SYSTICKACT_Msk)))  ;
    count2  = GetTickCount();
 
    do {
        ticks=ticks2;
        pend=pend2;
        count=count2;
        ticks2  = SysTick->VAL;
        pend2   = !!((SCB->ICSR & SCB_ICSR_PENDSTSET_Msk)||((SCB->SHCSR & SCB_SHCSR_SYSTICKACT_Msk)))  ;
        count2  = GetTickCount();
    } while ((pend != pend2) || (count != count2) || (ticks < ticks2));
 
    return ((count+pend) * 1000) + (((SysTick->LOAD  - ticks)*(1048576/(F_CPU/1000000)))>>20) ;
}

Pour ce que j'en sais avec la carte Arduino DUE (Arm Cortex M3), il y a un timer avec une granularité qui correspond à un cycle d'horloge, en l'occurrence 11,9 ns. Ce Timer c'est SysTick qui se décrémente à partir de la valeur initiale qui est chargée avec SysTick->LOAD.

Dans le cas de la DUE, SysTick est d'abord chargé avec 84000, il décrémente jusqu'à 0 ce qui déclenche une interruption après une ms, puis se recharge automatiquement avec 84000 et ainsi de suite.

A chaque instant on peut donc connaître où en est SysTick en lisant SysTick->VAL, puis on ajoute le nombre de ms déjà écoulées.

De fait, lorsqu'une granularité très précise est nécessaire, il est préférable d'utiliser directement SysTick.

Je souhaitais demander s'il y avait une documentation de la fonction micros() sous Arm

Si tu utilises l'IDE arduino pour programmer une carte équipée d'un microcontrôleur ARM c'est que tu as utilisé le gestionnaire de cartes pour télécharger les fonctions Wiring/Arduino correspondantes au microcontrôleur.

Le résultat de ce téléchargement se trouve dans le répertoire :

  • .arduino15/packages sous Linux
  • quelque part sous Windows

Tu y trouvera le code de la fonction micro().
Je ne pense pas qu'il existe une documentation spéciale.

ard_newbie:
Pour ce que j'en sais avec la carte Arduino DUE (Arm Cortex M3), il y a un timer avec une granularité qui correspond à un cycle d'horloge, en l'occurrence 11,9 ns. Ce Timer c'est SysTick qui se décrémente à partir de la valeur initiale qui est chargée avec SysTick->LOAD.

Dans le cas de la DUE, SysTick est d'abord chargé avec 84000, il décrémente jusqu'à 0 ce qui déclenche une interruption après une ms, puis se recharge automatiquement avec 84000 et ainsi de suite.

A chaque instant on peut donc connaître où en est SysTick en lisant SysTick->VAL, puis on ajoute le nombre de ms déjà écoulées.

De fait, lorsqu'une granularité très précise est nécessaire, il est préférable d'utiliser directement SysTick.

Super ! Merci de ces quelques explications, néanmoins SysTick est chargé a 84000 ( 84 MHZ ) tu as dis que quand il tombe à 0 cela veux dire que 1ms ce sont écoulé, cependant ce chiffre est donc stocké dans SysTick->VAL ?

Si oui, a quoi sert donc le count2 = GetTickCount(); ?

68tjs:
Si tu utilises l'IDE arduino pour programmer une carte équipée d'un microcontrôleur ARM c'est que tu as utilisé le gestionnaire de cartes pour télécharger les fonctions Wiring/Arduino correspondantes au microcontrôleur.

Le résultat de ce téléchargement se trouve dans le répertoire :

  • .arduino15/packages sous Linux
  • quelque part sous Windows

Tu y trouvera le code de la fonction micro().
Je ne pense pas qu'il existe une documentation spéciale.

Oui super merci j'avais déjà eu l'infos il y à quelques temps ! :slight_smile:

Bonjour,

J'ai trouvé mes réponses en travaillant directement avec le code mais il y à une chose que je ne comprend pas c'est pourquoi il fait un :

ticks2  = SysTick->VAL;
pend2   = !!((SCB->ICSR & SCB_ICSR_PENDSTSET_Msk)||((SCB->SHCSR & SCB_SHCSR_SYSTICKACT_Msk)))  ;
count2  = GetTickCount();

pour le refaire dans le :

    do {
        ticks=ticks2;
        pend=pend2;
        count=count2;
        ticks2  = SysTick->VAL;
        pend2   = !!((SCB->ICSR & SCB_ICSR_PENDSTSET_Msk)||((SCB->SHCSR & SCB_SHCSR_SYSTICKACT_Msk)))  ;
        count2  = GetTickCount();
    } while ((pend != pend2) || (count != count2) || (ticks < ticks2));

Quelqu'un pourrais m'éclairer ? Merci !