diff --git a/TODO.md b/TODO.md index 5323b11..8f833dc 100644 --- a/TODO.md +++ b/TODO.md @@ -1,38 +1,28 @@ # TO-DO list - [ ] Sphinx - - [ ] Numbered section with letters for appendix - [ ] List figures - - [ ] Numbered figures - [ ] Bibliography - [ ] Center les tables - [ ] Rename source file with ascending order - - [ ] Numbered exercices - [ ] Display code-block with filename like https://docs.travis-ci.com/user/deployment/releases/ - [ ] Code - [ ] Copy to clipboard icon - [ ] Build and run icon - [ ] Sphinx Theme - - [ ] Favicon in theme - - [x] Center figures - [ ] Left title on sidebar, only center figures - - [ ] Admonitions - [ ] Spacing on bullets - [ ] Menu déroulant pour toc-tree - [ ] Custom - [ ] Rendu de la fiche d'unité -- [ ] Latex - - [ ] LaTeX to PDF +- [ ] Make LaTeX work flawlessly - [ ] Advanced - [ ] Keep track of the hyperlinked used - [ ] Bugs - [ ] Quotes in french - [ ] Navlink header: Contenu, Exercices, Annexes, - -- [ ] Order wireless keyboard for students - - Logitech K830 or K400 - - With touchpad - - If possible in Bluetooth +- [ ] §3.3.3 ou exclusif : symbole ^ dans l'entête du tableau +- [ ] §3.3.4 complément à un : symbole ~ dans l'entête du tableau # Propositions diff --git a/content/45-composite-datatypes.rst b/content/45-composite-datatypes.rst index c3266d6..037d99d 100644 --- a/content/45-composite-datatypes.rst +++ b/content/45-composite-datatypes.rst @@ -387,7 +387,8 @@ Dans ce cas, ce n'est pas une erreur mais une alerte du compilateur qui survient .. code:: text - warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] + warning: initialization discards ‘const’ qualifier from pointer + target type [-Wdiscarded-qualifiers] Tableaux multi-dimensionnels ---------------------------- @@ -1139,86 +1140,6 @@ Cette notation de litéraux composés peut également s'appliquer aux tableaux. foo((int []){1,2,3}); } -Enumérations -============ - -Champs de bit -------------- - -Il est parfois nécessaire de regrouper plusieurs informations dans un -type de données. Nous avons vu pour cela qu'il était possible d'utiliser -les structures. - -Dans un contexte où la place mémoire disponible pour les données est -restreinte, on est amené à concentrer les informations. Pour cela, on -utilise les champs de bit. - -D'un autre côté, lorsque l'on développe des logiciels ayant pour but de -communiquer avec des périphériques fonctionnant avec des registres, il -est courant qu'un registre contienne plusieurs informations. On -utilisera avantageusement les champs de bit pour y accéder. - -Définition -~~~~~~~~~~ - -Un champ de bit est la réunion de plusieurs données identifiées chacune -par un nom et une taille définie par un nombre de bits. Ces informations -sont définies sous la forme d'une structure dont les données affectées à -des champs de bit sont du type entier. - -Déclaration -~~~~~~~~~~~ - -On utilise la déclaration d'une structure en ajoutant la taille des -champs de bit. - -.. code-block:: c - - typedef struct { - - int valide:1; - int sens:1; - int vitesse:4; - int erreur:2; - int :1; - int consigne:4; - - } sRegistre; - -Cette structure définit un type *sRegistre* qui contient 4 variables -rassemblées sous la forme d'un champ de bit. La variable 'valide' est -codée sur 1 bit, 'sens' sur un bit, 'vitesse' sur 4 bits ( valeurs -possibles de 0 à 15), 'erreur' sur de 2 bits (valeurs possibles de 0 à 3) -puis un bit non utilisé et enfin 'consigne' sur 4 bits. Autre exemple : -la représentation du type *float* : - -.. code-block:: c - - typedef struct { - - unsigned int mantisse:23, - exposant:8, - signe:1; - - } sFloat; - -Notez la virgule après les champs mantisse et exposants, évitant de -répéter le type. - -Utilisation -~~~~~~~~~~~ - -La lecture ou l'écriture des variables déclarées sous la forme de champs -de bit s'effectue comme pour les champs d'une structure. - -.. code-block:: c - - sRegistre registre; // déclaration - int csg; - - registre.vitesse=4; // initialise le champs vitesse à 4 - csg=registre.consigne; // la consigne est placée dans csg - ----- .. exercise:: Mendeleïev diff --git a/content/90-advanced-topics.rst b/content/90-advanced-topics.rst index 5a7a908..89756b0 100644 --- a/content/90-advanced-topics.rst +++ b/content/90-advanced-topics.rst @@ -119,3 +119,113 @@ Les outils binaires (`binutils `__) $ size a.out text data bss dec hex filename 1517 600 8 2125 84d a.out + +Format Q +======== + +Le format `Q `__ est une notation en virgule fixe dans laquelle le format d'un nombre est représenté par la lettre **Q** suivie de deux nombres : + +1. Le nombre de bits entiers +2. Le nombre de bits fractionnaires + +Ainsi, un registre 16 bits contenant un nombre allant de +0.999 à -1.0 s'exprimera **Q1.15** soit 1 + 15 valant 16 bits. + +Pour exprimer la valeur pi (3.1415...) il faudra au minimum 3 bits pour représenter la partie entière, car le bit de signe doit rester à zéro. Le format sur 16 bits sera ainsi **Q4.12**. + +La construction de ce nombre est facile : + +1. Prendre le nombre réel +2. Le multiplier par 2 à la puissance du nombre de bits +3. Prendre la partie entière + +.. code-block:: text + + 1. 3.1415926535 + 2. 2**12 * 3.1415926535 = 12867.963508736 + 3. 12867 + +Pour convertir un nombre **Q4.12** en sa valeur réelle il faut : + +1. Prendre le nombre encodé en **Q4.12** +2. Diviser sa valeur 2 à la puissance du nombre de bits + +.. code-block:: text + + 1. 12867 + 2. 12867 / 2**12 = 3.141357421875 + +On note une perte de précision puisqu'il n'est pas possible d'encoder un tel nombre dans seulement 16 bits. L'incrément positif minimal serait : :math:`1 / 2^12 = 0.00024`. Il convient alors d'arrondir le nombre à la troisième décimale soit 3.141. + +Les opérations arithmétiques sont possibles facilement entre des nombres de même types. + +Addition +-------- + +L'addition peut se faire avec ou sans saturation : + +.. code-block:: c + + typedef int16_t Q; + typedef Q Q12; + + Q q_add(Q a, Q b) { + return a + b; + } + + Q q_add_sat(Q a, Q b) { + int32_t res = (int32_t)a + (int32_t)b; + res = res > 0x7FFF ? 0x7FFF : res + res = res < -1 * 0x8000 ? -1 * 0x8000 : res; + return (Q)res; + } + +Multiplication +-------------- + +Soit deux nombres 0.9 et 3.141 : + +.. code-block:: text + + ┌─┬─┬─┬─╀─┬─┬─┬─┐┌─┬─┬─┬─┬─┬─┬─┬─┦ + │0│0│0│0│1│1│1│0││0│1│1│0│0│1│1│0│ Q4.12 (0.9) 3686 + └─┴─┴─┴─┴─┴─┴─┴─┘└─┴─┴─┴─┴─┴─┴─┴─┘ + + ┌─┬─┬─┬─╀─┬─┬─┬─┐┌─┬─┬─┬─┬─┬─┬─┬─┦ + │0│0│1│1│0│0│1│0││0│1│0│0│0│0│1│1│ Q4.12 (3.141) 12867 + └─┴─┴─┴─┴─┴─┴─┴─┘└─┴─┴─┴─┴─┴─┴─┴─┘ + +Multiplier ces deux valeurs revient à une multiplication sur 2 fois la taille. Le résultat doit être obtenu sur 32-bits sachant que les nombre **Q** s'additionnent comme **Q4.12** x **Q4.12** donnera **Q8.24**. + +On voit immédiatement que la partie entière vaut 2, donc 90% de 3.14 donnera une valeur en dessous de 3. Pour reconstruire une valeur **Q8.8** il convient de supprimer les 16-bits de poids faible + +.. code-block:: text + + 3686 * 12867 = 47227762 + + ┌─┬─┬─┬─┬─┬─┬─┬─┦┌─┬─┬─┬─┬─┬─┬─┬─┐┌─┬─┬─┬─┬─┬─┬─┬─┐┌─┬─┬─┬─┬─┬─┬─┬─┦ + │0│0│0│0│0│0│1│0││1│1│0│1│0│0│0│0││1│0│1│0│0│0│1│1││0│1│1│1│0│0│1│0│ Q8.24 + └─┴─┴─┴─┴─┴─┴─┴─┘└─┴─┴─┴─┴─┴─┴─┴─┘└─┴─┴─┴─┴─┴─┴─┴─┘└─┴─┴─┴─┴─┴─┴─┴─┘ + + ┌─┬─┬─┬─┬─┬─┬─┬─┦┌─┬─┬─┬─┬─┬─┬─┬─┦ + │0│0│0│0│0│0│1│0││1│1│0│1│0│0│0│0│ Q8.8 + └─┴─┴─┴─┴─┴─┴─┴─┘└─┴─┴─┴─┴─┴─┴─┴─┘ + +.. code-block:: c + + inline Q q_sat(int32_t x) { + x = x > 0x7FFF ? 0x7FFF : x + x = x < -1 * 0x8000 ? -1 * 0x8000 : x; + return (Q)x; + } + + inline int16_t q_mul(int16_t a, int16_t b, char q) + { + int32_t c = (int32_t)a * (int32_t)b; + c += 1 << (q - 1); + return sat(c >> q); + } + + inline int16_t q12_mul(int16_t a, int16_t b) + { + return q_mul(a, b, 12); + } \ No newline at end of file diff --git a/index.rst b/index.rst index 9c5dfb5..13e0b4e 100644 --- a/index.rst +++ b/index.rst @@ -1,22 +1,3 @@ -.. todo:: lien, forcer l'ouverture dans un nouvel onglet - -.. todo:: liste avec bullet : une virgule et un point à la fin, pas de majuscule " ald ' - -.. todo:: généralités du langage : on fait référence à Type de données pas encore vu - -.. todo:: 3.3.3 ou exclusif : symbole ^ dans l'entête du tableau - -.. todo:: 3.3.4 complément à un : symbole ~ dans l'entête du tableau - -.. todo:: 4.5.1 virgule fixe : parler du Qx.y - -.. todo:: 4.5.2 virgule flottante : l"exposant et dessin exp. mantisse non aligné - -.. todo:: 30-processus.rst : ligne 220 : Fonction main § à remanier. - -.. todo:: 35-stdio.rst : 8.4.2Saisie de chaîne de caractères, main à discuter (proposer une correction complète?) - -.. raw:: latex \frontmatter