Skip to content

Commit

Permalink
Some fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
nowox committed Apr 27, 2020
1 parent 73a5c5a commit e212e04
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 113 deletions.
16 changes: 3 additions & 13 deletions TODO.md
Original file line number Diff line number Diff line change
@@ -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

Expand Down
83 changes: 2 additions & 81 deletions content/45-composite-datatypes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
----------------------------
Expand Down Expand Up @@ -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
Expand Down
110 changes: 110 additions & 0 deletions content/90-advanced-topics.rst
Original file line number Diff line number Diff line change
Expand Up @@ -119,3 +119,113 @@ Les outils binaires (`binutils <https://en.wikipedia.org/wiki/GNU_Binutils>`__)
$ size a.out
text data bss dec hex filename
1517 600 8 2125 84d a.out
Format Q
========

Le format `Q <https://en.wikipedia.org/wiki/Q_(number_format)>`__ 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);
}
19 changes: 0 additions & 19 deletions index.rst
Original file line number Diff line number Diff line change
@@ -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

Expand Down

0 comments on commit e212e04

Please sign in to comment.