bonjour,

Je programme sur un µControlleur (archi MIPS) et j'ai un petit problème pour gérer plusieurs taches.


voici le code C simplifié de mon programme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
 
// programme principal
int main(void){
 
	init();
 
	while(1){
		TCP_Task();		// gestion d'envoi de packets TCP
		TELNET_Task();	// gestion du TELNET (dépend de TCP)
	}
 
}
 
// Task TELNET
void TELNET_Task(void){
 
	static int sm = 0; // pour la machine d'etat
 
	switch (sm){
 
		case 0:
 
			// TCPPutIsReady() : renvoi l'espace disponible dans le buffer TCP
			if (TCPPutIsReady() < strlen(str1)){
				break
			}
 
			TCPPut(str1);
			sm++;
 
		case 1:
			if (TCPPutIsReady() < strlen(str2)){
				break
			}
			TCPPut(str2);
			sm++;
 
		// ...
 
	}
}
Mon programme sert à gérer une communication TELNET. Avant chaque envoi de données, je dois vérifier que le buffer d'émission est disponible avec TCPPutIsReady() et si ce n'est pas le cas, je dois retourner dans le main pour que TCP_Task() s'occupe de vider le buffer (envoi des données TCP qui n'ont pas encore été traitées)


Mon problème est que je trouve super lourd de faire une machine d'état pour la gestion du TELNET. J'aimerais donc pouvoir créer un thread pour TELNET_Task() de façon à pouvoir faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
// Task TELNET
void TELNET_Task(void){
	TCPPutCustom(str1);
	TCPPutCustom(str2);
	TCPPutCustom(str3);
	// ...
}
 
// gestion de l'envoi des données
void TCPPutCustom(unsigned char str){
 
	while(TCPPutIsReady() < strlen(str)){
		// faudrait quitter la tache ici
		// => revenir dans le main pour que TCP_Task() soit éxécuté puis revenir ici
	}
	TCPPut(str);
}

Pouvez-vous me dire exactement comment je dois gérer tout ça. J'ai mis mon post dans la section assembleur et non pas langage C car il me semble que pour faire ça je suis obligé de passer par de l'assembleur (car il me semble qu'il faut manipuler la pile).
Je ne suis pas un grand adepte de l'assembleur, donc moins il y en aura dans mon code, mieux ça sera


Remarque : pour le moment mon programme ne gère qu'un socket TELNET mais je prévois d'en gérer plusieurs (peut-être que ça peut avoir une influence sur la méthode à utiliser)