Bonjour,
J'ai regardé l'implémentation de CircularBuffer et je ne suis pas très fan de ce qui y est fait, j'ai notamment tiqué sur :
template<typename T, __CB_ST__ S>
T CircularBuffer<T,S>::pop() {
void(* crash) (void) = 0;
if (count <= 0) crash();
T result = *tail--;
if (tail < buffer) {
tail = buffer + S - 1;
}
count--;
return result;
}
Traduction :
- Déclaration d'un pointeur de fonction appelé crash qui pointe sur l'adresse 0 de la mémoire
- Si le buffer est vide, appel de crash
Donc exécuté sur une machine de bureau, ce genre de code va planter l'application, ce qui est le but recherché, soit.
Exécuté sur un Arduino/AVR, on exécute le code situé à l'adresse 0. Qu'a-t-on à l'adresse 0 ? le vecteur reset. Sur un Arduino/ARM on a la valeur du pointeur de pile à l'adresse 0
BREF ÇA FAIT N'IMPORTE QUOI. Comment peux-t-on écrire des trucs pareils
J'ai donc fait mon tampon circulaire, qui en plus occupe moins de mémoire, et qui propose aussi des fonctions de lecture et d'écriture qui sont blindées contre les interruptions.
C'est pour l'instant ici :
https://github.com/Locoduino/RingBuffer/releaseset d'ici quelques jours dans le gestionnaire de bibliothèques de l'IDE.