C'est à la fois peu et beaucoup. J'ai l'habitude de processeurs plus puissants (PIC32 à 80MHz), et si on programme bien, c'est impressionnant ce que l'on peut faire avec, sans avoir pourtant un processeur fonctionnant à plusieurs centaines de MHz. Mais il en faut peu aussi pour dégrader fortement les performances : des interruptions trop rapprochées ou des délais par boucle par exemple. Il faut donc mesurer le temps d'exécution de certaines parties en cas de doute (changement d'état d'une i/o en entrée et en sortie de fonction, à l'oscilloscope) pour traquer les erreurs de conception, et prendre l'habitude de bannir les temporisations par boucle, fréquentes dans les exemples sur Arduino. Sans OS, j'ai un main() qui appelle en boucle les différentes tâches, chacune étant écrite pour ne jamais être bloquante ni trop longue. Cela nécessite de gérer les états (jamais de délais justement) mais donne couramment un fonctionnement à 25000 boucles par seconde en moyenne, avec serveur web et toutes sortes de traitements divers. Si c'est bien fait, le temps de boucle variera peu, et avec quelques fifo logicielles et interruptions utilisées judicieusement en plus, on peut faire du temps réel avec des fréquences de traitement non ridicules.. On peut aussi utiliser des OS temps réel, dont le but est identique.