Bonjour sambia39,
Citation Envoyé par sambia39 Voir le message
Linux ne s'emballe/ perd les pédales...

Ceci dit, on manque d'informations sur ce que vous appelez, Linux s'emballe et les diverses informations de sortie que les debogeurs donnent, y a-t-il un coredump de généré ou pas ?
J'ai écrit des bêtises : Je n'ai vraiment rien à reprocher à Linux. C'est l'incompréhension totale de ce qui se passait qui m'a fait écrire cela. C'était un pointeur su fonction qui "marche" une fois, puis provoque une erreur de segmentation ou la rencontre d'un opcode illégal la fois suivante (je n'avais jamais vu cette dernière erreur au par avant).

Bon ou pas, l'objectif initial était des fonctions imbriquées pour avoir une variable registre pointant la structure essentielle et nécessaire à toutes ces fonctions. Une fois le logiciel fonctionnel, il m'a été facile et rapide de remplacer partout les accès à cette locale par des accès à la globale. Et la la différence des temps d'exécution étaient dérisoire.

La boucle de mesure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
          while (++uC_counter%10000)
            Emu_Step();
          if (!(uC_counter%10000000L))
            Bug_PrintfSdTo(STDOUT_FILENO, ".");
          if (!(uC_counter%100000000L)) {
            tEnd = GetTimeStamp();
            Bug_PrintfSdTo(STDOUT_FILENO, "Delta T: %ld(µS) -> 1µC: %fµS\r\n"
                ,tEnd-gT0, ((float)(tEnd - gT0) / 100000000L));
            gT0 = GetTimeStamp();
          }
          usleep(0);
          ...
Comme on peut le deviner, 10k "pas" sont effectué en continu, avant que la main soit passée à l'ordonnanceur. L'affichage d'un '.' tous les méga "pas" pour dire que ça vit, l'affichage des temps au bout de 100M "pas". 15 affichages (~ 1/2 minute) -> placement des résultat dans un feuille de calcul.

Trois tests : avec -O0, -O et -O2, pour un code "full switches" et un code "jump table". Ce test ne vaut pas tant que ça puisqu'un seul type d'instruction est exécuté, mais on ne test pas l'émulateur lui-même.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
	Full Switch / Jump table	vitesse		Taille du code
-O0 :		1,0150			1 (ref)		111640 / 109152	
-O		0,965			0,613		96768 / 96432
-O2		0,998			0,560		96728 / 96400
cd ~/_4/1_emu_6309/ ; gcc $C8_TST -Werror -o ./b.out src/emu_9_v_OK_switches.c ; gcc $C8_TST -Werror -o ./a.out src/emu_9_v_OK_jumps.c

En conclusion, les chefs étoilés ont raison.
  1. écrire une seule fonction avec une variable registre locale pointant une variable structure globale ne vaut pas beaucoup plus que des accès directement à la globale,
  2. mieux vaut utiliser les switches plutôt que les tables de sauts. Plus portable, un peu plus lisible (tout de même). Et même si les différences sont faibles du point des vitesses et des tailles de code (sources et générés).


Merci à vous.