10

(cross, réponse à martial)

non. ça va s'appeler récursivement et remplir la pile.

ce que tu veux faire ça s'appelle des threads/couroutines/tâches, faut deux piles différentes et utiliser un truc de taskswitch préemptif style je-sais-plus-le-nm-du-truc-de-ximoon

alternativement ça peut se faire assez simplement (sisi trioui) avec setjmp

https://www.unsads.com/scm/svn/squalyl/asi/systeme/P3S/test/switcher-ti68k/
user guest
pass guest

(je sais plus si c'est complet, je sais plus si ça marche, mais le principe y est. Dommage j'avais un truc encore plus simple que ça, je le retrouve plus sad )

edit: ah le voila

#include <stdio.h>
#include <setjmp.h>

/*
| context switch presque portable avec setjmp, longjmp
| pour comprendre setjmp et longjmp voir la doc :
| http://www-ensimag.imag.fr/cours/Systeme/setjmp.longjmp
|
*/

#define K              1024
#define TAILLE_PILE     4*K

int mem [TAILLE_PILE]; /* memoire pour la pile du processus 1 */
int * deb_mem;
int proc_actif = 0;
jmp_buf buf_processus[2];

/*----------------------------------------------------------------------------*/
void ctxsw(actif,  elu) {
	if (setjmp(buf_processus[actif]) == 0)   {
		proc_actif = elu;
		longjmp(buf_processus[elu], 1);
	}
}
/*----------------------------------------------------------------------------*/
int choix_elu() {
	if (proc_actif == 0)  return 1; else return 0;
}
/*----------------------------------------------------------------------------*/
void resched() {
	int proc_elu;
	proc_elu = choix_elu();
	ctxsw(proc_actif, proc_elu);
}
/*----------------------------------------------------------------------------*/
/*
 | code execute par les 2 processus
 |
*/
void code_processus(char * mess) {
	int i;
	while(1) {
		printf ("%s", mess);
		resched();  /* changement de processus */
	}
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
int main() {
	deb_mem = mem;         /* on pourrait faire un malloc a la place */
/*
| ici c'est le processus 0 qui s'exécute avec la pile allouée au lancement du programme C
*/
	if (setjmp(buf_processus[1]) == 0) {
#ifdef LINUX
/*
 | Initialisation de la pile pour le processus 1 (petit bricolage specifique pour linux/i386)
 */
		buf_processus[1][0].__jmpbuf[JB_SP] =  deb_mem + TAILLE_PILE;
#else
#ifdef SOLARIS
  /*
   | Initialisation de la pile pour le processus 1
   | (petit bricolage specifique pour Solaris/Sparc)
   */
		buf_processus[1][1] = (int) deb_mem + TAILLE_PILE - 16;
#else
#error "use -DLINUX or -DSOLARIS"
#endif
#endif
	printf ("Je suis le processus 0 et je pars dans la boucle\n");
	code_processus("je pense\n");
	}  else  {
		printf ("Je suis le processus 1 et je pars dans la boucle\n");
		code_processus("         donc tu es\n");
	}
}
avatar
1D86FN9
Nspire wiki
CONDUCTEUR Va-et-vient Des QUATRE MANCHE AVEC DES DIODES
La naissance de Boo en vrai