631
Le logiciel DCC++ / Re : DCC++ BaseStation
« le: mars 09, 2016, 03:18:31 pm »
Merci Jean-Luc pour, littéralement, cette explication de texte.
Le code est lisible et bien optimisé, c'est boooo.
J'allais ajouter qu'effectivement ce test est lui même à l'intérieur d'une macro plus conséquente !
Une macro doit tenir sur une seule ligne, c'est une contrainte du langage. Mais parfois, et c'est le cas là, elle ne tient pas. Et dans ce cas, le '/' en fin de ligne signifie que la macro n'est pas terminée et qu'elle continue sur la ligne suivante !
Pourquoi faire une aussi grosse macro ?
L'autre solution de codage aurait été de faire une fonction avec les mêmes arguments R et N. Mais au moment de l'exécution la routine d'interruption aurait dû appeler cette fonction, et cela aurait généré un peu de code assembleur pour la mémorisation du pointeur d'exécution, le passage des arguments, la valeur de retour, etc... En procédant par une macro, plus de fonction appelée puisque le code de la macro est directement intégré à sa place dans le source. Le principal inconvénient de cette approche réside dans la taille mémoire programme qui augmenterait significativement à chaque appel de la macro puisque l'ensemble de son code est à nouveau compilé. Mais cela ne se pose pas ici puisque la macro n'est appelée qu'une seule fois selon le type d'Arduino... Donc une solution optimale, tout en conservant l'idée des arguments, et en réduisant l'empreinte mémoire mais aussi et surtout le temps passé dans la routine d'interruption.
Ps : flute, battu par Jean-Luc !
Le code est lisible et bien optimisé, c'est boooo.
J'allais ajouter qu'effectivement ce test est lui même à l'intérieur d'une macro plus conséquente !
Une macro doit tenir sur une seule ligne, c'est une contrainte du langage. Mais parfois, et c'est le cas là, elle ne tient pas. Et dans ce cas, le '/' en fin de ligne signifie que la macro n'est pas terminée et qu'elle continue sur la ligne suivante !
Pourquoi faire une aussi grosse macro ?
L'autre solution de codage aurait été de faire une fonction avec les mêmes arguments R et N. Mais au moment de l'exécution la routine d'interruption aurait dû appeler cette fonction, et cela aurait généré un peu de code assembleur pour la mémorisation du pointeur d'exécution, le passage des arguments, la valeur de retour, etc... En procédant par une macro, plus de fonction appelée puisque le code de la macro est directement intégré à sa place dans le source. Le principal inconvénient de cette approche réside dans la taille mémoire programme qui augmenterait significativement à chaque appel de la macro puisque l'ensemble de son code est à nouveau compilé. Mais cela ne se pose pas ici puisque la macro n'est appelée qu'une seule fois selon le type d'Arduino... Donc une solution optimale, tout en conservant l'idée des arguments, et en réduisant l'empreinte mémoire mais aussi et surtout le temps passé dans la routine d'interruption.
Ps : flute, battu par Jean-Luc !