<?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%2FLibs</id>
	<title>Technique/Logiciel/API/Use/Libs - 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%2FLibs"/>
	<link rel="alternate" type="text/html" href="https://wikifr.techno-innov.fr/index.php?title=Technique/Logiciel/API/Use/Libs&amp;action=history"/>
	<updated>2026-04-04T02:31:43Z</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/Libs&amp;diff=30&amp;oldid=prev</id>
		<title>Nathael : Page créée avec « {{DISPLAYTITLE:Interface logicielle (API) - Bibliothèques}}  == LibC ==  La bibliothèque C intégrée aux sources fournit une petite partie de la bibliothèque C classiq... »</title>
		<link rel="alternate" type="text/html" href="https://wikifr.techno-innov.fr/index.php?title=Technique/Logiciel/API/Use/Libs&amp;diff=30&amp;oldid=prev"/>
		<updated>2020-09-02T03:32:21Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « {{DISPLAYTITLE:Interface logicielle (API) - Bibliothèques}}  == LibC ==  La bibliothèque C intégrée aux sources fournit une petite partie de la bibliothèque C classiq... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:Interface logicielle (API) - Bibliothèques}}&lt;br /&gt;
&lt;br /&gt;
== LibC ==&lt;br /&gt;
&lt;br /&gt;
La bibliothèque C intégrée aux sources fournit une petite partie de la bibliothèque C classique, principalement à partir de sources tirées du Noyau Linux.&lt;br /&gt;
&lt;br /&gt;
=== stdint.h ===&lt;br /&gt;
 #include &amp;quot;lib/stddef.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Déclare tous les types int*_t, uint*_t, int_least*_t, int_fast*_t, uint_least*_t, uint_fast*_t.&lt;br /&gt;
&lt;br /&gt;
Déclare les valeurs min et max des différentes tailles d&amp;#039;entiers : INT*_MIN, INT*_MAX, UINT*_MAX&lt;br /&gt;
&lt;br /&gt;
=== stddef.h ===&lt;br /&gt;
 #include &amp;quot;lib/stddef.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Déclare les macros offsetof() qui permet d&amp;#039;obtenir l&amp;#039;offset d&amp;#039;un champ dans une structure, et container_of(), qui permet d&amp;#039;obtenir un pointeur sur la structure contenant le champ indiqué.&amp;lt;br /&amp;gt;&lt;br /&gt;
Déclare aussi size_t et NULL.&lt;br /&gt;
&lt;br /&gt;
 /* type : type de la structure contenant le champ indiqué&lt;br /&gt;
  * member : nom du champ dans la structure&lt;br /&gt;
  * ptr : pointeur vers le champ indiqué&lt;br /&gt;
  */&lt;br /&gt;
 offsetof(type, member);&lt;br /&gt;
 container_of(ptr, type, member);&lt;br /&gt;
&lt;br /&gt;
Exemple :&lt;br /&gt;
 #include &amp;quot;lib/stddef.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 struct A { int a; int b; char c; };&lt;br /&gt;
 struct A foo;&lt;br /&gt;
 int o = offset_of(struct A, b); /* renvoie 4 (ou sizeof(int)) */&lt;br /&gt;
 struct A* ptr = NULL;&lt;br /&gt;
 ptr = container_of(&amp;amp;foo.b, struct A, b); /* renvoie un pointeur sur foo */&lt;br /&gt;
&lt;br /&gt;
=== stdlib.h ===&lt;br /&gt;
 #include &amp;quot;lib/stdlib.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Inclut uniquement une version simple de la fonction strtoul(), avec peu de vérifications.&lt;br /&gt;
&lt;br /&gt;
 uint32_t strtoul(const char* str, char** end, uint8_t base);&lt;br /&gt;
&lt;br /&gt;
=== errno.h ===&lt;br /&gt;
 #include &amp;quot;lib/errno.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Inclut quelques codes d&amp;#039;erreur, pour une plus grande lisibilité des valeurs de retour des fonctions.&amp;lt;br /&amp;gt;&lt;br /&gt;
Les valeurs correspondent aux valeurs définies et utilisées par la GlibC.&lt;br /&gt;
&lt;br /&gt;
 #define EIO          5 /* Bad one: Input or Output error. */&lt;br /&gt;
 #define E2BIG        7 /* Argument list too long or Data size beyond buffer size */&lt;br /&gt;
 #define EAGAIN      11 /* Device already in use */&lt;br /&gt;
 #define EFAULT      14 /* Address error */&lt;br /&gt;
 #define EBUSY       16 /* Device or ressource Busy */&lt;br /&gt;
 #define ENODEV      19 /* No such device */&lt;br /&gt;
 #define EINVAL      22 /* Invalid argument */&lt;br /&gt;
 #define EBADFD      77 /* Device not initialized */&lt;br /&gt;
 #define EREMOTEIO  121 /* Device did not acknowledge */&lt;br /&gt;
&lt;br /&gt;
=== string.h ===&lt;br /&gt;
 #include &amp;quot;lib/string.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Regroupe les fonctions suivantes, issues du code du noyau Linux :&lt;br /&gt;
&lt;br /&gt;
 void * memcpy(void *dest, const void *src, size_t count);&lt;br /&gt;
 void * memset(void * s, int c, size_t count);&lt;br /&gt;
 char * strcpy(char * dest, const char *src);&lt;br /&gt;
 char * strncpy(char * dest, const char *src, size_t count);&lt;br /&gt;
 int strcmp(const char * cs, const char * ct);&lt;br /&gt;
 int strncmp(const char * cs, const char * ct, size_t count);&lt;br /&gt;
 char * strchr(const char * s, int c);&lt;br /&gt;
 size_t strlen(const char * s);&lt;br /&gt;
 char * strrchr(const char * s, int c);&lt;br /&gt;
 size_t strnlen(const char * s, size_t count);&lt;br /&gt;
&lt;br /&gt;
Voir les pages man des fonctions de la libC GNU pour plus d&amp;#039;informations.&lt;br /&gt;
&lt;br /&gt;
=== stdio.h ===&lt;br /&gt;
 #include &amp;quot;lib/stdio.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Regroupe les fonctions suivantes, issues du code du noyau Linux :&lt;br /&gt;
&lt;br /&gt;
 int vsnprintf(char *buf, size_t size, const char *fmt, va_list args);&lt;br /&gt;
 int snprintf(char* buf, size_t size, const char *format, ...);&lt;br /&gt;
&lt;br /&gt;
Ajoute aussi la fonction uprintf() (UART printf), qui fonctionne comme la fonction fprintf() de la bibliothèque C GNU, mais prend comme premier argument le numéro de la liaison série (UART) à utiliser à la place du pointeur vers un flux (FILE*)&lt;br /&gt;
 int uprintf(int uart_num, const char *format, ...);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Listes chaînées circulaires ==&lt;br /&gt;
 #include &amp;quot;lib/list.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ce fichier d&amp;#039;entête fournit une implémentation de listes chaînées circulaires, tirée de l&amp;#039;implémentation disponible dans le Noyau Linux (version simplifiée).&amp;lt;br /&amp;gt;&lt;br /&gt;
Pour le détail des paramètres et du résultat de chaque fonction, voir la page [[Technique/Logiciel/API/Use/Libs/List_Detail|détaillant le fonctionnement de cette implémentation des listes chaînées]].&amp;lt;br /&amp;gt;&lt;br /&gt;
L&amp;#039;utilisation se fait en incluant la structure &amp;#039;struct list_head&amp;#039; dans la structure (l&amp;#039;objet) que l&amp;#039;on veut &amp;quot;chaîner&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Structure utilisée :&lt;br /&gt;
 struct list_head {&lt;br /&gt;
     struct list_head* next, *prev;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Création et Initialisation d&amp;#039;une liste :&lt;br /&gt;
 struct list_head name = LIST_HEAD_INIT(name):&lt;br /&gt;
 LIST_HEAD(other);&lt;br /&gt;
 struct list_head third;&lt;br /&gt;
 INIT_LIST_HEAD(&amp;amp;third);&lt;br /&gt;
&lt;br /&gt;
Insersion et suppression dans une liste chaînée :&lt;br /&gt;
 void list_add(struct list_head* new, struct list_head* head);&lt;br /&gt;
 void list_add_tail(struct list_head* new, struct list_head* head);&lt;br /&gt;
 void list_del(struct list_head* entry);&lt;br /&gt;
&lt;br /&gt;
Tests :&lt;br /&gt;
 int list_is_last(const struct list_head* list, const struct list_head* head);&lt;br /&gt;
 int list_empty(const struct list_head* head);&lt;br /&gt;
&lt;br /&gt;
Modifications de listes :&lt;br /&gt;
 void list_move_tail(struct list_head* list, struct list_head* head);&lt;br /&gt;
 void list_rotate_left(struct list_head* head);&lt;br /&gt;
&lt;br /&gt;
Récupération du conteneur :&lt;br /&gt;
 list_entry(ptr, type, member);&lt;br /&gt;
&lt;br /&gt;
Parcours de listes :&lt;br /&gt;
 list_first_entry(ptr, type, member);&lt;br /&gt;
 list_for_each(pos, head);&lt;br /&gt;
 list_for_each_prev(pos, head);&lt;br /&gt;
 list_for_each_safe(pos, n, head);&lt;br /&gt;
 list_for_each_prev_safe(pos, n, head);&lt;br /&gt;
 list_for_each_entry(pos, head, member);&lt;br /&gt;
 list_for_each_entry_reverse(pos, head, member);&lt;br /&gt;
 list_for_each_entry_safe(pos, n, head, member);&lt;br /&gt;
 list_for_each_entry_safe_reverse(pos, n, head, member);&lt;br /&gt;
&lt;br /&gt;
== Bit operations ==&lt;br /&gt;
 #include &amp;quot;lib/utils.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Cette bibliothèque inclut les fonctions clz() et ctz() utilisées pour compter le nombre de zéros au début (clz) ou à la fin (ctz) d&amp;#039;un mot de 32 bits (ou trouver l&amp;#039;indice du premier ou du dernier &amp;#039;1&amp;#039;).&amp;lt;br /&amp;gt;&lt;br /&gt;
Ces fonctions remplacent les instructions clz et ctz qui ne sont pas présentes dans le jeu d&amp;#039;instructions du Cortex-M0. L&amp;#039;implémentation est celle présentée ici : http://graphics.stanford.edu/~seander/bithacks.html&amp;lt;br /&amp;gt;&lt;br /&gt;
La fonction bits_set() permet quand à elle de compter le nombre de bits à 1 dans un entier de 32bits.&lt;br /&gt;
&lt;br /&gt;
 /* Count leading zeroes */&lt;br /&gt;
 uint8_t clz(uint32_t x);&lt;br /&gt;
 &lt;br /&gt;
 /* Count traling zeroes */&lt;br /&gt;
 uint8_t ctz(uint32_t x);&lt;br /&gt;
 &lt;br /&gt;
 /* Count bits set */&lt;br /&gt;
 uint8_t bits_set(uint32_t x);&lt;br /&gt;
&lt;br /&gt;
== Gestion du temps ==&lt;br /&gt;
 #include &amp;quot;lib/time.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Cette bibliothèque fournit une implémentation de gestion du temps sur le principe des timestamp Unix, le temps 0 correspondant à l&amp;#039;heure de démarrage du système (en l&amp;#039;absence de mise à l&amp;#039;heure).&amp;lt;br /&amp;gt;&lt;br /&gt;
Le temps est compté en secondes et milli-secondes au lieu des secondes et micro-secondes utilisées pour les timestamp Unix sur les systèmes GNU/Linux.&amp;lt;br /&amp;gt;&lt;br /&gt;
La fonction d&amp;#039;initialisation time_init() doit être appelée au moins une fois pour enregistrer un callback sur l&amp;#039;interruption systick toutes les milli-secondes, qui aura la charge de la gestion du temps (les appels suivants n&amp;#039;ont pas d&amp;#039;effet).&lt;br /&gt;
&lt;br /&gt;
Structure utilisée :&lt;br /&gt;
 struct time_spec {&lt;br /&gt;
    uint32_t seconds;&lt;br /&gt;
    uint16_t msec;&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
Initialisation :&lt;br /&gt;
 void time_init(void);&lt;br /&gt;
&lt;br /&gt;
Mise à l&amp;#039;heure du système :&lt;br /&gt;
 void set_time(struct time_spec* new_time);&lt;br /&gt;
 void set_time_and_get_difference(struct time_spec* new_time, struct time_spec* diff);&lt;br /&gt;
Au retour de ces fonctions le système est mis à l&amp;#039;heure. set_time_and_get_difference() remplit aussi  la structure time_spec &amp;#039;diff&amp;#039; si diff n&amp;#039;est pas NULL avec la différence entre l&amp;#039;ancien et le nouveau temps.&lt;br /&gt;
&lt;br /&gt;
Écriture du temps dans un buffer en &amp;quot;network endian&amp;quot; (big endian) :&lt;br /&gt;
 void time_to_buff_swapped(uint8_t* buf, struct time_spec* src_time);&lt;br /&gt;
&lt;br /&gt;
Lecture du timestamp actuel :&lt;br /&gt;
 void get_time(struct time_spec* save_time);&lt;br /&gt;
 void get_time_in_interrupt(struct time_spec* save_time);&lt;br /&gt;
Dans un contexte d&amp;#039;interruption il est préférable d&amp;#039;utiliser la fonction get_time_in_interrupt(). L&amp;#039;utilisation de get_time() dans un contexte d&amp;#039;interruption fera tout de même appel à la fonction get_time_in_interrupt(), mais avec un délai supplémentaire du au test et au branchement résultant.&lt;br /&gt;
&lt;br /&gt;
Calcul de la différence entre deux timestamps :&lt;br /&gt;
 /* Retourne 0 si les temps sont égaux, 1 si (t1 &amp;gt; t2), -1 si (t1 &amp;lt; t2) */&lt;br /&gt;
 int get_time_diff(const struct time_spec* t1, const struct time_spec* t2, struct time_spec* diff);&lt;br /&gt;
&lt;br /&gt;
== Police de caractères ==&lt;br /&gt;
 #include &amp;quot;lib/font.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Cette bibliothèque ne contient qu&amp;#039;un tableau correspondant à des bitmaps 8x8 pour les caractères ASCII entre 0x20 et 0x7E (95 caractères).&lt;br /&gt;
&lt;br /&gt;
Cette police de caractères a été trouvée sur le site opengameart.org : http://opengameart.org/content/8x8-ascii-bitmap-font-with-c-source (licence GPLv3, auteur (?) &amp;quot;darkrose&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Elle a été choisie en raison de sa lisibilité et de sa compacité. Elle est utilisée pour le support de l&amp;#039;écran e-paper.&lt;br /&gt;
&lt;br /&gt;
Cette &amp;quot;bibliothèque ne fournit aucune fonction, les fonctions d&amp;#039;affichage étant liées au type d&amp;#039;affichage et non pas à la police de caractère.&lt;/div&gt;</summary>
		<author><name>Nathael</name></author>
	</entry>
</feed>