<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://wikifr.techno-innov.fr/index.php?action=history&amp;feed=atom&amp;title=Technique%2FLogiciel%2FAPI%2FUse%2FCore%2FSystick</id>
	<title>Technique/Logiciel/API/Use/Core/Systick - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://wikifr.techno-innov.fr/index.php?action=history&amp;feed=atom&amp;title=Technique%2FLogiciel%2FAPI%2FUse%2FCore%2FSystick"/>
	<link rel="alternate" type="text/html" href="https://wikifr.techno-innov.fr/index.php?title=Technique/Logiciel/API/Use/Core/Systick&amp;action=history"/>
	<updated>2026-04-04T07:08:02Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wikifr.techno-innov.fr/index.php?title=Technique/Logiciel/API/Use/Core/Systick&amp;diff=37&amp;oldid=prev</id>
		<title>Nathael : Page créée avec « {{DISPLAYTITLE:Interface logicielle (API) - Cœur - System Tick}}  == Présentation ==  #include &quot;core/systick.h&quot;  Les micro-contrôleurs ARM Cortex-M* (au moins ceux de l... »</title>
		<link rel="alternate" type="text/html" href="https://wikifr.techno-innov.fr/index.php?title=Technique/Logiciel/API/Use/Core/Systick&amp;diff=37&amp;oldid=prev"/>
		<updated>2020-09-02T03:43:53Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « {{DISPLAYTITLE:Interface logicielle (API) - Cœur - System Tick}}  == Présentation ==  #include &amp;quot;core/systick.h&amp;quot;  Les micro-contrôleurs ARM Cortex-M* (au moins ceux de l... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:Interface logicielle (API) - Cœur - System Tick}}&lt;br /&gt;
&lt;br /&gt;
== Présentation ==&lt;br /&gt;
 #include &amp;quot;core/systick.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Les micro-contrôleurs ARM Cortex-M* (au moins ceux de la famille LPC de NXP) disposent d&amp;#039;un timer &amp;quot;système&amp;quot; destiné à produire un &amp;quot;tick&amp;quot; utilisable pour réaliser l&amp;#039;ordonnancement des tâches d&amp;#039;un d&amp;#039;un système multi-tâches.&lt;br /&gt;
&lt;br /&gt;
Ce timer produit une interruption &amp;quot;interne&amp;quot; (une exception) lorsqu&amp;#039;il &amp;quot;expire&amp;quot; et est automatiquement rechargé.&lt;br /&gt;
&lt;br /&gt;
Dans l&amp;#039;API présentée ici, ce timer est utilisé pour compter le temps avec une précision de un tick et permet de faire appel à des fonctions de rappel (callback) à l&amp;#039;expiration d&amp;#039;un délai donné (alarmes).&lt;br /&gt;
&lt;br /&gt;
Par défaut, les exemples utilisent une période de 1ms (une milliseconde) pour le tick système, ce qui simplifie les calculs de temps, mais ceci n&amp;#039;est pas une obligation.&lt;br /&gt;
&lt;br /&gt;
L&amp;#039;API &amp;quot;systick&amp;quot; utilise deux compteurs internes : global_wrapping_system_ticks et global_wrapping_system_clock_cycles.&lt;br /&gt;
* global_wrapping_system_ticks : Compteur de ticks, depuis le démarrage du timer (ou le dernier reset). Avec un tick toutes les millisecondes ce compteur boucle après 50 jours.&lt;br /&gt;
* global_wrapping_system_clock_cycles : Compteur de coups d&amp;#039;horloge. Ce compteur est utilisé pour indiquer le nombre de coups d&amp;#039;horloge depuis la dernière fois que ce compteur a bouclé. Il est utilisé pour mesurer des durées précises et donner une image du nombre de coups d&amp;#039;horloge écoulés entre deux lectures du compteur.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
 void systick_timer_on(uint32_t ms);&lt;br /&gt;
 void systick_timer_off(void);&lt;br /&gt;
&lt;br /&gt;
La configuration du timer système est propre à l&amp;#039;utilisation faite par l&amp;#039;API.&amp;lt;br /&amp;gt;&lt;br /&gt;
La seule configuration possible pour l&amp;#039;utilisateur est la durée entre chaque tick, en millisecondes, passée à la fonction systick_timer_on() par le paramètre &amp;quot;ms&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Attention, toutes les fonctions systick_*() travaillent sur un nombre de ticks et non pas sur un nombre de millisecondes.&lt;br /&gt;
&lt;br /&gt;
Seules les fonctions *sleep() travaillent sur des valeurs de temps (millisecondes, microsecondes).&lt;br /&gt;
&lt;br /&gt;
== Initialisation / contrôle ==&lt;br /&gt;
 void systick_start(void);&lt;br /&gt;
 void systick_reset(void);&lt;br /&gt;
 void systick_stop(void);&lt;br /&gt;
 uint32_t is_systick_running(void);&lt;br /&gt;
 uint32_t systick_get_timer_reload_val(void);&lt;br /&gt;
 uint32_t systick_get_tick_ms_period(void);&lt;br /&gt;
&lt;br /&gt;
Une fois le timer système configuré, il est nécessaire de le démarrer en faisant appel à la fonction systick_start().&lt;br /&gt;
&lt;br /&gt;
Il est aussi possible de stopper le timer système en faisant appel à la fonction systick_stop(). Cette fonction provoque aussi la remise à zéro des compteurs internes (compteur de ticks et compteur de coups d&amp;#039;horloge).&lt;br /&gt;
&lt;br /&gt;
La fonction systick_reset() remet à zéro les compteurs internes (compteur de ticks et compteur de coups d&amp;#039;horloge) et ré-initialise le compteur du timer système sans le stopper.&lt;br /&gt;
&lt;br /&gt;
Les fonctions is_systick_running(), systick_get_timer_reload_val() et systick_get_tick_ms_period() servent à récupérer les valeurs de configuration et d&amp;#039;état du timer système.&amp;lt;br /&amp;gt;&lt;br /&gt;
La fonction is_systick_running() renvoie 1 si le timer système est actif, 0 sinon.&amp;lt;br /&amp;gt;&lt;br /&gt;
La fonction systick_get_timer_reload_val() permet de récupérer la valeur calculée par la fonction d&amp;#039;initialisation et utilisée comme valeur de rechargement du timer système. Il s&amp;#039;agit du nombre de coups d&amp;#039;horloge entre deux ticks successifs.&amp;lt;br /&amp;gt;&lt;br /&gt;
La fonction systick_get_tick_ms_period() renvoie le nombre de millisecondes par tick (valeur utilisée lors de la configuration du timer système).&lt;br /&gt;
&lt;br /&gt;
== Utilisation ==&lt;br /&gt;
Le driver systick fournit trois sous-ensembles de fonctionnalités différentes liées au timer système : les fonctions d&amp;#039;attente active (sleep), un système d&amp;#039;alarmes périodiques, et des compteurs de temps.&lt;br /&gt;
&lt;br /&gt;
=== msleep(), usleep() and usleep_short() ===&lt;br /&gt;
 void msleep(uint32_t ms)&lt;br /&gt;
 void usleep(uint32_t us)&lt;br /&gt;
 void usleep_short(uint32_t us);&lt;br /&gt;
&lt;br /&gt;
Les fonctions d&amp;#039;attente active sont des fonctions qui ne font &amp;quot;rien&amp;quot; tant que le délai demandé n&amp;#039;est pas écoulée.&amp;lt;br /&amp;gt;&lt;br /&gt;
Ces fonctions ne garantissent pas un délai d&amp;#039;attente exact.&lt;br /&gt;
&lt;br /&gt;
La fonction msleep() prends en paramètre un nombre de millisecondes &amp;quot;ms&amp;quot;, et garanti un délai de &amp;quot;ms - (1 * tick_ms)&amp;quot; à &amp;quot;ms + 1&amp;quot; millisecondes (avec &amp;quot;tick_ms&amp;quot; le nombre de millisecondes par tick).&lt;br /&gt;
&lt;br /&gt;
Les fonctions usleep() et usleep_short() prennent en paramètre un nombre de microsecondes &amp;quot;us&amp;quot; et garantissent un delai de &amp;quot;us&amp;quot; à &amp;quot;us + 50&amp;quot; microsecondes pour des temps d&amp;#039;attente inférieurs à 1000 micro-secondes, et un délais de &amp;quot;us&amp;quot; à &amp;quot;us + 1 tick&amp;quot; au dela de 1000 micro-secondes.&amp;lt;br /&amp;gt;&lt;br /&gt;
La différence de temps d&amp;#039;attente est d&amp;#039;autant plus grande que le délai est court et que la fréquence du micro-contrôleur est faible.&amp;lt;br /&amp;gt;&lt;br /&gt;
Les délais d&amp;#039;attente très courts sont très imprécis, et la fonction usleep() ne permet pas de délai inférieur à 10 microsecondes.&amp;lt;br /&amp;gt;&lt;br /&gt;
La fonction usleep_short() est similaire à la fonction usleep() mais ne fait aucun test préalable et ne &amp;#039;&amp;#039;&amp;#039;doit pas&amp;#039;&amp;#039;&amp;#039; être utilisée pour des temps d&amp;#039;attente supérieurs à 1000 micro-secondes. Il est impératif que le timer système soit configuré et démarré pour utiliser cette fonction.&lt;br /&gt;
&lt;br /&gt;
Pour obtenir des délais d&amp;#039;attente très précis, il est nécessaire d&amp;#039;utiliser les [[Technique/Logiciel/API/Use/Drivers/Timers|timers]].&amp;lt;br /&amp;gt;&lt;br /&gt;
Attention, compte tenu du temps nécessaires à l&amp;#039;exécution des instructions de configuration des timers, l&amp;#039;obtention de délais de l&amp;#039;ordre de quelques microsecondes n&amp;#039;est pas possible non plus à l&amp;#039;aide des timers.&lt;br /&gt;
&lt;br /&gt;
=== Enregistrement d&amp;#039;alarmes périodiques ===&lt;br /&gt;
 int add_systick_callback(void (*callback) (uint32_t), uint16_t period);&lt;br /&gt;
 int remove_systick_callback(void (*callback) (uint32_t));&lt;br /&gt;
 #define MAX_SYSTICK_CALLBACKS  4&lt;br /&gt;
&lt;br /&gt;
Le driver systick permet d&amp;#039;enregistrer plusieurs alarmes (4 par défaut pour limiter la mémoire et le temps de traitement, mais il est possible de changer la valeur &amp;quot;MAX_SYSTICK_CALLBACKS&amp;quot; définie dans le fichier d&amp;#039;entêtes &amp;quot;include/core/systick.h&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Une alarme est un mécanisme qui consiste à appeler une fonction spécifique à un instant défini. Cette fonction est appelée &amp;quot;callback&amp;quot;, et est enregistrées par le biais du premier paramètre de la fonction add_systick_callback(). Le deuxième paramètre de cette fonction définit la période entre deux appels de l&amp;#039;alarme, en nombre de ticks.&amp;lt;br /&amp;gt;&lt;br /&gt;
La fonction add_systick_callback() renvoie le numéro sous lequel est enregistré le callback si l&amp;#039;enregistrement se passe bien, ou une valeur négative si l&amp;#039;enregistrement est impossible.&lt;br /&gt;
&lt;br /&gt;
La fonction enregistrée pour traiter l&amp;#039;alarme reçoit en paramètre la valeur du compteur interne de nombre de ticks.&lt;br /&gt;
&lt;br /&gt;
Il est possible d&amp;#039;obtenir une exécution unique de l&amp;#039;alarme en utilisant la fonction remove_systick_callback() à l&amp;#039;intérieur du callback de gestion de l&amp;#039;alarme.&amp;lt;br /&amp;gt;&lt;br /&gt;
La fonction remove_systick_callback() prend en paramètre l&amp;#039;adresse du callback (utilisée pour enregistrer le callback) et renvoie 0 si le callback a bien été supprimé, ou une valeur négative indiquant l&amp;#039;erreur sinon.&lt;br /&gt;
&lt;br /&gt;
Note : les alarmes sont enregistrées pour une exécution périodique, avec un intervalle en nombre de ticks, et non pas à une date donnée.&amp;lt;br /&amp;gt;&lt;br /&gt;
L&amp;#039;exécution d&amp;#039;une alarme à une date donnée (en nombre de ticks) est possible, en calculant la période à utiliser en paramètre lors de l&amp;#039;enregistrement du callback.&amp;lt;br /&amp;gt;&lt;br /&gt;
il est aussi possible d&amp;#039;utiliser une RTC pour obtenir une alarme à une date donnée, si le micro-contrôleur ou la carte électronique en fournit une.&lt;br /&gt;
&lt;br /&gt;
=== Valeurs des compteurs ===&lt;br /&gt;
 uint32_t systick_get_timer_val(void);&lt;br /&gt;
 uint32_t systick_get_tick_count(void);&lt;br /&gt;
 uint32_t systick_get_clock_cycles(void);&lt;br /&gt;
&lt;br /&gt;
L&amp;#039;interface du driver systick fournit trois fonctions pour accéder aux différents compteurs internes :&lt;br /&gt;
* systick_get_timer_val() : accès à la valeur du compteur interne du timer.&lt;br /&gt;
* systick_get_tick_count() accès à la variable interne servant de compteur de nombre de ticks.&lt;br /&gt;
* systick_get_clock_cycles() accès à la variable interne servant de compteur de coups d&amp;#039;horloge.&lt;br /&gt;
&lt;br /&gt;
Notes :&amp;lt;br /&amp;gt;&lt;br /&gt;
* Les valeurs du compteur interne du timer et du compteur de coups d&amp;#039;horloge évoluent à la fréquence de l&amp;#039;horloge principale du micro-contrôleur. Leur valeur est donc &amp;quot;une image de la valeur réelle au moment de l&amp;#039;appel de la fonction&amp;quot;.&lt;br /&gt;
* La valeur du compteur interne du timer décroît de systick_get_timer_reload_val() à 0. Elle repart de systick_get_timer_reload_val() à chaque tick.&lt;br /&gt;
* La valeur du compteur interne de coups d&amp;#039;horloge croit de 0 à (2^32 - 1) et boucle régulièrement (toutes les 89.48 secondes avec une horloge à 48MHz)&lt;br /&gt;
* La valeur du compteur de ticks croit de 0 à (2^32 - 1) et boucle tous les 49.71 jours (1193 heures) avec un tick toutes les 1 millisecondes.&lt;br /&gt;
&lt;br /&gt;
Voir la bibliothèque &amp;quot;[[Technique/Logiciel/API/Use/Libs#Gestion_du_temps|time.h]]&amp;quot; pour une gestion du temps en secondes, et un débordement du compteur de secondes tous les 49710 jours (136 ans).&amp;lt;br /&amp;gt;&lt;br /&gt;
Utilisez une horloge RTC externe si le besoin est de connaître la date et l&amp;#039;heure courantes.&lt;br /&gt;
&lt;br /&gt;
== Bases d&amp;#039;ordonnancement ==&lt;br /&gt;
La fonction add_systick_callback() permet d&amp;#039;enregistrer une fonction qui sera appelée de façon périodique. Ce mécanisme permet d&amp;#039;appeler une fonction qui servira d&amp;#039;ordonnanceur pour un système multi-tâches. L&amp;#039;implémentation d&amp;#039;un tel système n&amp;#039;est pas encore faite, et la piste la plus probable sera l&amp;#039;utilisation d&amp;#039;un système multi-tâches libre existant, comme [https://riot-os.org/ RIOT-OS].&lt;br /&gt;
&lt;br /&gt;
== Spécificités par micro-contrôleur ==&lt;br /&gt;
Tous les micro-contrôleurs actuellement supportés fournissent la même interface.&lt;/div&gt;</summary>
		<author><name>Nathael</name></author>
	</entry>
</feed>